blob: 98d49a3f49728e1ef31b8f9e7ba1e90f1729dbe3 [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
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002516
Tobin Ehlisec598302015-09-15 15:02:17 -06002517 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002518
2519 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002520 VkImage image;
2521 VkDeviceMemory mem;
2522 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002523
Karl Schultz6addd812016-02-02 17:17:23 -07002524 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2525 const int32_t tex_width = 32;
2526 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002527
2528 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002529 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2530 image_create_info.pNext = NULL;
2531 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2532 image_create_info.format = tex_format;
2533 image_create_info.extent.width = tex_width;
2534 image_create_info.extent.height = tex_height;
2535 image_create_info.extent.depth = 1;
2536 image_create_info.mipLevels = 1;
2537 image_create_info.arrayLayers = 1;
2538 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2539 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2540 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2541 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002542
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002543 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002544 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2545 mem_alloc.pNext = NULL;
2546 mem_alloc.allocationSize = 0;
2547 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002548
Chia-I Wuf7458c52015-10-26 21:10:41 +08002549 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002550 ASSERT_VK_SUCCESS(err);
2551
Karl Schultz6addd812016-02-02 17:17:23 -07002552 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002553
2554 mem_alloc.allocationSize = mem_reqs.size;
2555
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002556 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002557 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002558
2559 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002560 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002561 ASSERT_VK_SUCCESS(err);
2562
2563 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002564 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002565
2566 // Try to bind free memory that has been freed
2567 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2568 // This may very well return an error.
2569 (void)err;
2570
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002571 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002572
Chia-I Wuf7458c52015-10-26 21:10:41 +08002573 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002574}
2575
Karl Schultz6addd812016-02-02 17:17:23 -07002576TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2577 VkResult err;
2578 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002579
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002580 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002581
Tobin Ehlisec598302015-09-15 15:02:17 -06002582 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002583
Karl Schultz6addd812016-02-02 17:17:23 -07002584 // Create an image object, allocate memory, destroy the object and then try
2585 // to bind it
2586 VkImage image;
2587 VkDeviceMemory mem;
2588 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002589
Karl Schultz6addd812016-02-02 17:17:23 -07002590 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2591 const int32_t tex_width = 32;
2592 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002593
2594 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002595 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2596 image_create_info.pNext = NULL;
2597 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2598 image_create_info.format = tex_format;
2599 image_create_info.extent.width = tex_width;
2600 image_create_info.extent.height = tex_height;
2601 image_create_info.extent.depth = 1;
2602 image_create_info.mipLevels = 1;
2603 image_create_info.arrayLayers = 1;
2604 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2605 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2606 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2607 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002608
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002609 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002610 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2611 mem_alloc.pNext = NULL;
2612 mem_alloc.allocationSize = 0;
2613 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002614
Chia-I Wuf7458c52015-10-26 21:10:41 +08002615 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002616 ASSERT_VK_SUCCESS(err);
2617
Karl Schultz6addd812016-02-02 17:17:23 -07002618 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002619
2620 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002621 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002622 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002623
2624 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002625 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002626 ASSERT_VK_SUCCESS(err);
2627
2628 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002629 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002630 ASSERT_VK_SUCCESS(err);
2631
2632 // Now Try to bind memory to this destroyed object
2633 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2634 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002635 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002636
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002637 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002638
Chia-I Wuf7458c52015-10-26 21:10:41 +08002639 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002640}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002641
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002642TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
2643 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
2644
2645 ASSERT_NO_FATAL_FAILURE(InitState());
2646 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2647
2648 VkVertexInputBindingDescription input_binding;
2649 memset(&input_binding, 0, sizeof(input_binding));
2650
2651 VkVertexInputAttributeDescription input_attribs;
2652 memset(&input_attribs, 0, sizeof(input_attribs));
2653
2654 // Pick a really bad format for this purpose and make sure it should fail
2655 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
2656 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
2657 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
2658 printf("Format unsuitable for test; skipped.\n");
2659 return;
2660 }
2661
2662 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002663 char const *vsSource =
2664 "#version 450\n"
2665 "\n"
2666 "out gl_PerVertex {\n"
2667 " vec4 gl_Position;\n"
2668 "};\n"
2669 "void main(){\n"
2670 " gl_Position = vec4(1);\n"
2671 "}\n";
2672 char const *fsSource =
2673 "#version 450\n"
2674 "\n"
2675 "layout(location=0) out vec4 color;\n"
2676 "void main(){\n"
2677 " color = vec4(1);\n"
2678 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002679
2680 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
2681 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2682 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2683
2684 VkPipelineObj pipe(m_device);
2685 pipe.AddColorAttachment();
2686 pipe.AddShader(&vs);
2687 pipe.AddShader(&fs);
2688
2689 pipe.AddVertexInputBindings(&input_binding, 1);
2690 pipe.AddVertexInputAttribs(&input_attribs, 1);
2691
2692 VkDescriptorSetObj descriptorSet(m_device);
2693 descriptorSet.AppendDummy();
2694 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
2695
2696 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
2697
2698 m_errorMonitor->VerifyFound();
2699}
2700
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002701TEST_F(VkLayerTest, ImageSampleCounts) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002702 TEST_DESCRIPTION(
2703 "Use bad sample counts in image transfer calls to trigger "
2704 "validation errors.");
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002705 ASSERT_NO_FATAL_FAILURE(InitState());
2706
2707 VkMemoryPropertyFlags reqs = 0;
2708 VkImageCreateInfo image_create_info = {};
2709 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2710 image_create_info.pNext = NULL;
2711 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2712 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
2713 image_create_info.extent.width = 256;
2714 image_create_info.extent.height = 256;
2715 image_create_info.extent.depth = 1;
2716 image_create_info.mipLevels = 1;
2717 image_create_info.arrayLayers = 1;
2718 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2719 image_create_info.flags = 0;
2720
2721 VkImageBlit blit_region = {};
2722 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2723 blit_region.srcSubresource.baseArrayLayer = 0;
2724 blit_region.srcSubresource.layerCount = 1;
2725 blit_region.srcSubresource.mipLevel = 0;
2726 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2727 blit_region.dstSubresource.baseArrayLayer = 0;
2728 blit_region.dstSubresource.layerCount = 1;
2729 blit_region.dstSubresource.mipLevel = 0;
2730
2731 // Create two images, the source with sampleCount = 2, and attempt to blit
2732 // between them
2733 {
2734 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002735 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002736 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002737 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002738 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002739 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002740 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002741 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002742 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2744 "was created with a sample count "
2745 "of VK_SAMPLE_COUNT_2_BIT but "
2746 "must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002747 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
2748 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002749 m_errorMonitor->VerifyFound();
2750 m_commandBuffer->EndCommandBuffer();
2751 }
2752
2753 // Create two images, the dest with sampleCount = 4, and attempt to blit
2754 // between them
2755 {
2756 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002757 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002758 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002759 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002760 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002761 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002762 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002763 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002764 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2766 "was created with a sample count "
2767 "of VK_SAMPLE_COUNT_4_BIT but "
2768 "must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002769 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
2770 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002771 m_errorMonitor->VerifyFound();
2772 m_commandBuffer->EndCommandBuffer();
2773 }
2774
2775 VkBufferImageCopy copy_region = {};
2776 copy_region.bufferRowLength = 128;
2777 copy_region.bufferImageHeight = 128;
2778 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2779 copy_region.imageSubresource.layerCount = 1;
2780 copy_region.imageExtent.height = 64;
2781 copy_region.imageExtent.width = 64;
2782 copy_region.imageExtent.depth = 1;
2783
2784 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
2785 // buffer to image
2786 {
2787 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002788 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
2789 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002790 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002791 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002792 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002793 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2795 "was created with a sample count "
2796 "of VK_SAMPLE_COUNT_8_BIT but "
2797 "must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002798 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
2799 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002800 m_errorMonitor->VerifyFound();
2801 m_commandBuffer->EndCommandBuffer();
2802 }
2803
2804 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
2805 // image to buffer
2806 {
2807 vk_testing::Buffer dst_buffer;
2808 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
2809 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002810 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002811 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002812 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002813 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002814 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2815 "was created with a sample count "
2816 "of VK_SAMPLE_COUNT_2_BIT but "
2817 "must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002818 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002819 dst_buffer.handle(), 1, &copy_region);
2820 m_errorMonitor->VerifyFound();
2821 m_commandBuffer->EndCommandBuffer();
2822 }
2823}
2824
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002825TEST_F(VkLayerTest, BlitImageFormats) {
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002826 ASSERT_NO_FATAL_FAILURE(InitState());
2827
2828 VkImageObj src_image(m_device);
2829 src_image.init(64, 64, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
2830 VkImageObj dst_image(m_device);
2831 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
2832 VkImageObj dst_image2(m_device);
Mike Stroyan131f3e72016-10-18 11:10:23 -06002833 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 -06002834
2835 VkImageBlit blitRegion = {};
2836 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2837 blitRegion.srcSubresource.baseArrayLayer = 0;
2838 blitRegion.srcSubresource.layerCount = 1;
2839 blitRegion.srcSubresource.mipLevel = 0;
2840 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2841 blitRegion.dstSubresource.baseArrayLayer = 0;
2842 blitRegion.dstSubresource.layerCount = 1;
2843 blitRegion.dstSubresource.mipLevel = 0;
2844
Dave Houlton34df4cb2016-12-01 16:43:06 -07002845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
2846
2847 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
2848 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002849
2850 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07002851 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002852 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image.image(), dst_image.layout(), 1,
2853 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002854
2855 m_errorMonitor->VerifyFound();
2856
Dave Houlton34df4cb2016-12-01 16:43:06 -07002857 // Test should generate 2 VU failures
2858 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
2859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002860
2861 // Unsigned int vs signed int
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002862 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image2.image(), dst_image2.layout(), 1,
2863 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002864
Dave Houlton34df4cb2016-12-01 16:43:06 -07002865 // TODO: Note that this only verifies that at least one of the VU enums was found
2866 // 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 -06002867 m_errorMonitor->VerifyFound();
2868
Tony Barbour552f6c02016-12-21 14:34:07 -07002869 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002870}
2871
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002872TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
2873 VkResult err;
2874 bool pass;
2875
2876 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
2877 ASSERT_NO_FATAL_FAILURE(InitState());
2878
2879 // If w/d/h granularity is 1, test is not meaningful
2880 // TODO: When virtual device limits are available, create a set of limits for this test that
2881 // will always have a granularity of > 1 for w, h, and d
2882 auto index = m_device->graphics_queue_node_index_;
2883 auto queue_family_properties = m_device->phy().queue_properties();
2884
2885 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
2886 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
2887 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
2888 return;
2889 }
2890
2891 // Create two images of different types and try to copy between them
2892 VkImage srcImage;
2893 VkImage dstImage;
2894 VkDeviceMemory srcMem;
2895 VkDeviceMemory destMem;
2896 VkMemoryRequirements memReqs;
2897
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002898 VkImageCreateInfo image_create_info = {};
2899 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2900 image_create_info.pNext = NULL;
2901 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2902 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
2903 image_create_info.extent.width = 32;
2904 image_create_info.extent.height = 32;
2905 image_create_info.extent.depth = 1;
2906 image_create_info.mipLevels = 1;
2907 image_create_info.arrayLayers = 4;
2908 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2909 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2910 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2911 image_create_info.flags = 0;
2912
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002913 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002914 ASSERT_VK_SUCCESS(err);
2915
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002916 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002917 ASSERT_VK_SUCCESS(err);
2918
2919 // Allocate memory
2920 VkMemoryAllocateInfo memAlloc = {};
2921 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2922 memAlloc.pNext = NULL;
2923 memAlloc.allocationSize = 0;
2924 memAlloc.memoryTypeIndex = 0;
2925
2926 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
2927 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002928 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002929 ASSERT_TRUE(pass);
2930 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
2931 ASSERT_VK_SUCCESS(err);
2932
2933 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
2934 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002935 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002936 ASSERT_VK_SUCCESS(err);
2937 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
2938 ASSERT_VK_SUCCESS(err);
2939
2940 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
2941 ASSERT_VK_SUCCESS(err);
2942 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
2943 ASSERT_VK_SUCCESS(err);
2944
Tony Barbour552f6c02016-12-21 14:34:07 -07002945 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002946 VkImageCopy copyRegion;
2947 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2948 copyRegion.srcSubresource.mipLevel = 0;
2949 copyRegion.srcSubresource.baseArrayLayer = 0;
2950 copyRegion.srcSubresource.layerCount = 1;
2951 copyRegion.srcOffset.x = 0;
2952 copyRegion.srcOffset.y = 0;
2953 copyRegion.srcOffset.z = 0;
2954 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2955 copyRegion.dstSubresource.mipLevel = 0;
2956 copyRegion.dstSubresource.baseArrayLayer = 0;
2957 copyRegion.dstSubresource.layerCount = 1;
2958 copyRegion.dstOffset.x = 0;
2959 copyRegion.dstOffset.y = 0;
2960 copyRegion.dstOffset.z = 0;
2961 copyRegion.extent.width = 1;
2962 copyRegion.extent.height = 1;
2963 copyRegion.extent.depth = 1;
2964
2965 // Introduce failure by setting srcOffset to a bad granularity value
2966 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2968 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002969 m_errorMonitor->VerifyFound();
2970
2971 // Introduce failure by setting extent to a bad granularity value
2972 copyRegion.srcOffset.y = 0;
2973 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2975 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002976 m_errorMonitor->VerifyFound();
2977
2978 // Now do some buffer/image copies
2979 vk_testing::Buffer buffer;
2980 VkMemoryPropertyFlags reqs = 0;
2981 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2982 VkBufferImageCopy region = {};
2983 region.bufferOffset = 0;
2984 region.bufferRowLength = 3;
2985 region.bufferImageHeight = 128;
2986 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2987 region.imageSubresource.layerCount = 1;
2988 region.imageExtent.height = 16;
2989 region.imageExtent.width = 16;
2990 region.imageExtent.depth = 1;
2991 region.imageOffset.x = 0;
2992 region.imageOffset.y = 0;
2993 region.imageOffset.z = 0;
2994
2995 // Introduce failure by setting bufferRowLength to a bad granularity value
2996 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2998 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2999 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003000 m_errorMonitor->VerifyFound();
3001 region.bufferRowLength = 128;
3002
3003 // Introduce failure by setting bufferOffset to a bad granularity value
3004 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3006 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3007 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003008 m_errorMonitor->VerifyFound();
3009 region.bufferOffset = 0;
3010
3011 // Introduce failure by setting bufferImageHeight to a bad granularity value
3012 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3014 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3015 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003016 m_errorMonitor->VerifyFound();
3017 region.bufferImageHeight = 128;
3018
3019 // Introduce failure by setting imageExtent to a bad granularity value
3020 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003021 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3022 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3023 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003024 m_errorMonitor->VerifyFound();
3025 region.imageExtent.width = 16;
3026
3027 // Introduce failure by setting imageOffset to a bad granularity value
3028 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3030 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3031 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003032 m_errorMonitor->VerifyFound();
3033
Tony Barbour552f6c02016-12-21 14:34:07 -07003034 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003035
3036 vkDestroyImage(m_device->device(), srcImage, NULL);
3037 vkDestroyImage(m_device->device(), dstImage, NULL);
3038 vkFreeMemory(m_device->device(), srcMem, NULL);
3039 vkFreeMemory(m_device->device(), destMem, NULL);
3040}
3041
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003042TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003043 TEST_DESCRIPTION(
3044 "Submit command buffer created using one queue family and "
3045 "attempt to submit them on a queue created in a different "
3046 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003047
Cody Northropc31a84f2016-08-22 10:41:47 -06003048 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003049 // This test is meaningless unless we have multiple queue families
3050 auto queue_family_properties = m_device->phy().queue_properties();
3051 if (queue_family_properties.size() < 2) {
3052 return;
3053 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003055 // Get safe index of another queue family
3056 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
3057 ASSERT_NO_FATAL_FAILURE(InitState());
3058 // Create a second queue using a different queue family
3059 VkQueue other_queue;
3060 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3061
3062 // Record an empty cmd buffer
3063 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3064 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3065 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3066 vkEndCommandBuffer(m_commandBuffer->handle());
3067
3068 // And submit on the wrong queue
3069 VkSubmitInfo submit_info = {};
3070 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3071 submit_info.commandBufferCount = 1;
3072 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003073 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003074
3075 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003076}
3077
Chris Forbes4c24a922016-11-16 08:59:10 +13003078TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
3079 ASSERT_NO_FATAL_FAILURE(InitState());
3080
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003081 // There are no attachments, but refer to attachment 0.
3082 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003083 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003084 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003085 };
3086
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003087 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003088 VkRenderPass rp;
3089
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003090 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003091 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003092 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3093 m_errorMonitor->VerifyFound();
3094}
3095
Chris Forbesa58c4522016-09-28 15:19:39 +13003096TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3097 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
3098 ASSERT_NO_FATAL_FAILURE(InitState());
3099
3100 // A renderpass with two subpasses, both writing the same attachment.
3101 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003102 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3103 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3104 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003105 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003106 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003107 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003108 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3109 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003110 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003111 VkSubpassDependency dep = {0,
3112 1,
3113 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3114 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3115 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3116 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3117 VK_DEPENDENCY_BY_REGION_BIT};
3118 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003119 VkRenderPass rp;
3120 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3121 ASSERT_VK_SUCCESS(err);
3122
3123 VkImageObj image(m_device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003124 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 +13003125 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3126
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003127 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003128 VkFramebuffer fb;
3129 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3130 ASSERT_VK_SUCCESS(err);
3131
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003132 char const *vsSource =
3133 "#version 450\n"
3134 "void main() { gl_Position = vec4(1); }\n";
3135 char const *fsSource =
3136 "#version 450\n"
3137 "layout(location=0) out vec4 color;\n"
3138 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003139
3140 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3141 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3142 VkPipelineObj pipe(m_device);
3143 pipe.AddColorAttachment();
3144 pipe.AddShader(&vs);
3145 pipe.AddShader(&fs);
3146 VkViewport view_port = {};
3147 m_viewports.push_back(view_port);
3148 pipe.SetViewport(m_viewports);
3149 VkRect2D rect = {};
3150 m_scissors.push_back(rect);
3151 pipe.SetScissor(m_scissors);
3152
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003153 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003154 VkPipelineLayout pl;
3155 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3156 ASSERT_VK_SUCCESS(err);
3157 pipe.CreateVKPipeline(pl, rp);
3158
Tony Barbour552f6c02016-12-21 14:34:07 -07003159 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003160
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003161 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3162 nullptr,
3163 rp,
3164 fb,
3165 {{
3166 0, 0,
3167 },
3168 {32, 32}},
3169 0,
3170 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003171
3172 // subtest 1: bind in the wrong subpass
3173 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3174 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003175 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 +13003176 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3177 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3178 m_errorMonitor->VerifyFound();
3179
3180 vkCmdEndRenderPass(m_commandBuffer->handle());
3181
3182 // subtest 2: bind in correct subpass, then transition to next subpass
3183 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3184 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3185 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003186 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 +13003187 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3188 m_errorMonitor->VerifyFound();
3189
3190 vkCmdEndRenderPass(m_commandBuffer->handle());
3191
Tony Barbour552f6c02016-12-21 14:34:07 -07003192 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003193
3194 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3195 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3196 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3197}
3198
Tony Barbour4e919972016-08-09 13:27:40 -06003199TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003200 TEST_DESCRIPTION(
3201 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3202 "with extent outside of framebuffer");
Tony Barbour4e919972016-08-09 13:27:40 -06003203 ASSERT_NO_FATAL_FAILURE(InitState());
3204 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3205
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3207 "Cannot execute a render pass with renderArea "
3208 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003209
3210 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3211 m_renderPassBeginInfo.renderArea.extent.width = 257;
3212 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003213 m_commandBuffer->BeginCommandBuffer();
3214 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003215 m_errorMonitor->VerifyFound();
3216}
3217
3218TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003219 TEST_DESCRIPTION(
3220 "Generate INDEPENDENT_BLEND by disabling independent "
3221 "blend and then specifying different blend states for two "
3222 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003223 VkPhysicalDeviceFeatures features = {};
3224 features.independentBlend = VK_FALSE;
Cody Northropc31a84f2016-08-22 10:41:47 -06003225 ASSERT_NO_FATAL_FAILURE(InitState(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003226
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3228 "Invalid Pipeline CreateInfo: If independent blend feature not "
3229 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003230
Cody Northropc31a84f2016-08-22 10:41:47 -06003231 VkDescriptorSetObj descriptorSet(m_device);
3232 descriptorSet.AppendDummy();
3233 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003234
Cody Northropc31a84f2016-08-22 10:41:47 -06003235 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003236 // Create a renderPass with two color attachments
3237 VkAttachmentReference attachments[2] = {};
3238 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
3239 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3240
3241 VkSubpassDescription subpass = {};
3242 subpass.pColorAttachments = attachments;
3243 subpass.colorAttachmentCount = 2;
3244
3245 VkRenderPassCreateInfo rpci = {};
3246 rpci.subpassCount = 1;
3247 rpci.pSubpasses = &subpass;
3248 rpci.attachmentCount = 1;
3249
3250 VkAttachmentDescription attach_desc = {};
3251 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3252 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3253 attach_desc.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3254 attach_desc.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3255
3256 rpci.pAttachments = &attach_desc;
3257 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3258
3259 VkRenderPass renderpass;
3260 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003261 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003262 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003263
Cody Northropc31a84f2016-08-22 10:41:47 -06003264 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3265 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3266 att_state1.blendEnable = VK_TRUE;
3267 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3268 att_state2.blendEnable = VK_FALSE;
3269 pipeline.AddColorAttachment(0, &att_state1);
3270 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003271 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003272 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003273 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003274}
3275
Mike Weiblen40b160e2017-02-06 19:21:52 -07003276// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3277TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3278 TEST_DESCRIPTION(
3279 "Create a graphics pipeline that is incompatible with the requirements "
3280 "of its contained Renderpass/subpasses.");
3281 ASSERT_NO_FATAL_FAILURE(InitState());
3282
3283 VkDescriptorSetObj ds_obj(m_device);
3284 ds_obj.AppendDummy();
3285 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3286
3287 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3288
3289 VkPipelineColorBlendAttachmentState att_state1 = {};
3290 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3291 att_state1.blendEnable = VK_TRUE;
3292
3293 VkRenderpassObj rp_obj(m_device);
3294
3295 {
3296 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3297 VkPipelineObj pipeline(m_device);
3298 pipeline.AddShader(&vs_obj);
3299 pipeline.AddColorAttachment(0, &att_state1);
3300
3301 VkGraphicsPipelineCreateInfo info = {};
3302 pipeline.InitGraphicsPipelineCreateInfo(&info);
3303 info.pColorBlendState = nullptr;
3304
3305 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3306 m_errorMonitor->VerifyFound();
3307 }
3308}
3309
Chris Forbes26ec2122016-11-29 08:58:33 +13003310#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003311TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3312 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3313 "depth attachments in subpass");
Cody Northropc31a84f2016-08-22 10:41:47 -06003314 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour4e919972016-08-09 13:27:40 -06003315
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3317 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003318
3319 // Create a renderPass with a single color attachment
3320 VkAttachmentReference attach = {};
3321 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3322 VkSubpassDescription subpass = {};
3323 VkRenderPassCreateInfo rpci = {};
3324 rpci.subpassCount = 1;
3325 rpci.pSubpasses = &subpass;
3326 rpci.attachmentCount = 1;
3327 VkAttachmentDescription attach_desc = {};
3328 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3329 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3330 rpci.pAttachments = &attach_desc;
3331 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3332 VkRenderPass rp;
3333 subpass.pDepthStencilAttachment = &attach;
3334 subpass.pColorAttachments = NULL;
3335 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3336 m_errorMonitor->VerifyFound();
3337}
Chris Forbes26ec2122016-11-29 08:58:33 +13003338#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003339
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003340TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003341 TEST_DESCRIPTION(
3342 "Create a framebuffer where a subpass has a preserve "
3343 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003344
3345 ASSERT_NO_FATAL_FAILURE(InitState());
3346 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3347
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003349
3350 VkAttachmentReference color_attach = {};
3351 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3352 color_attach.attachment = 0;
3353 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3354 VkSubpassDescription subpass = {};
3355 subpass.colorAttachmentCount = 1;
3356 subpass.pColorAttachments = &color_attach;
3357 subpass.preserveAttachmentCount = 1;
3358 subpass.pPreserveAttachments = &preserve_attachment;
3359
3360 VkRenderPassCreateInfo rpci = {};
3361 rpci.subpassCount = 1;
3362 rpci.pSubpasses = &subpass;
3363 rpci.attachmentCount = 1;
3364 VkAttachmentDescription attach_desc = {};
3365 attach_desc.format = VK_FORMAT_UNDEFINED;
3366 rpci.pAttachments = &attach_desc;
3367 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3368 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003369 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003370
3371 m_errorMonitor->VerifyFound();
3372
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003373 if (result == VK_SUCCESS) {
3374 vkDestroyRenderPass(m_device->device(), rp, NULL);
3375 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003376}
3377
Chris Forbesc5389742016-06-29 11:49:23 +12003378TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003379 TEST_DESCRIPTION(
3380 "Ensure that CreateRenderPass produces a validation error "
3381 "when the source of a subpass multisample resolve "
3382 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003383
Chris Forbesc5389742016-06-29 11:49:23 +12003384 ASSERT_NO_FATAL_FAILURE(InitState());
3385
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3387 "Subpass 0 requests multisample resolve from attachment 0 which has "
3388 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003389
3390 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003391 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3392 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3393 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3394 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3395 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3396 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003397 };
3398
3399 VkAttachmentReference color = {
3400 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3401 };
3402
3403 VkAttachmentReference resolve = {
3404 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3405 };
3406
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003407 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003408
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003409 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003410
3411 VkRenderPass rp;
3412 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3413
3414 m_errorMonitor->VerifyFound();
3415
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003416 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003417}
3418
3419TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003420 TEST_DESCRIPTION(
3421 "Ensure CreateRenderPass produces a validation error "
3422 "when a subpass multisample resolve operation is "
3423 "requested, and the destination of that resolve has "
3424 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003425
Chris Forbesc5389742016-06-29 11:49:23 +12003426 ASSERT_NO_FATAL_FAILURE(InitState());
3427
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003428 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3429 "Subpass 0 requests multisample resolve into attachment 1, which "
3430 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003431
3432 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003433 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3434 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3435 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3436 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3437 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3438 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003439 };
3440
3441 VkAttachmentReference color = {
3442 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3443 };
3444
3445 VkAttachmentReference resolve = {
3446 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3447 };
3448
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003449 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003450
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003451 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003452
3453 VkRenderPass rp;
3454 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3455
3456 m_errorMonitor->VerifyFound();
3457
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003458 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003459}
3460
Chris Forbes3f128ef2016-06-29 14:58:53 +12003461TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003462 TEST_DESCRIPTION(
3463 "Ensure CreateRenderPass produces a validation error "
3464 "when the color and depth attachments used by a subpass "
3465 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003466
Chris Forbes3f128ef2016-06-29 14:58:53 +12003467 ASSERT_NO_FATAL_FAILURE(InitState());
3468
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003469 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3470 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003471
3472 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003473 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3474 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3475 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3476 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3477 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3478 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003479 };
3480
3481 VkAttachmentReference color[] = {
3482 {
3483 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3484 },
3485 {
3486 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3487 },
3488 };
3489
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003490 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003491
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003492 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003493
3494 VkRenderPass rp;
3495 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3496
3497 m_errorMonitor->VerifyFound();
3498
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003499 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003500}
3501
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003502TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003503 TEST_DESCRIPTION(
3504 "Hit errors when attempting to create a framebuffer :\n"
3505 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3506 " 2. Use a color image as depthStencil attachment\n"
3507 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3508 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3509 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3510 " 6. Framebuffer attachment where dimensions don't match\n"
3511 " 7. Framebuffer attachment w/o identity swizzle\n"
3512 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003513
3514 ASSERT_NO_FATAL_FAILURE(InitState());
3515 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3516
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3518 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
3519 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003520
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003521 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003522 VkAttachmentReference attach = {};
3523 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3524 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003525 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003526 VkRenderPassCreateInfo rpci = {};
3527 rpci.subpassCount = 1;
3528 rpci.pSubpasses = &subpass;
3529 rpci.attachmentCount = 1;
3530 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003531 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003532 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003533 rpci.pAttachments = &attach_desc;
3534 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3535 VkRenderPass rp;
3536 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3537 ASSERT_VK_SUCCESS(err);
3538
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003539 VkImageView ivs[2];
3540 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3541 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003542 VkFramebufferCreateInfo fb_info = {};
3543 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3544 fb_info.pNext = NULL;
3545 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003546 // Set mis-matching attachmentCount
3547 fb_info.attachmentCount = 2;
3548 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003549 fb_info.width = 100;
3550 fb_info.height = 100;
3551 fb_info.layers = 1;
3552
3553 VkFramebuffer fb;
3554 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3555
3556 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003557 if (err == VK_SUCCESS) {
3558 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3559 }
3560 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003561
3562 // Create a renderPass with a depth-stencil attachment created with
3563 // IMAGE_USAGE_COLOR_ATTACHMENT
3564 // Add our color attachment to pDepthStencilAttachment
3565 subpass.pDepthStencilAttachment = &attach;
3566 subpass.pColorAttachments = NULL;
3567 VkRenderPass rp_ds;
3568 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3569 ASSERT_VK_SUCCESS(err);
3570 // Set correct attachment count, but attachment has COLOR usage bit set
3571 fb_info.attachmentCount = 1;
3572 fb_info.renderPass = rp_ds;
3573
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003574 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003575 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3576
3577 m_errorMonitor->VerifyFound();
3578 if (err == VK_SUCCESS) {
3579 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3580 }
3581 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003582
3583 // Create new renderpass with alternate attachment format from fb
3584 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3585 subpass.pDepthStencilAttachment = NULL;
3586 subpass.pColorAttachments = &attach;
3587 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3588 ASSERT_VK_SUCCESS(err);
3589
3590 // Cause error due to mis-matched formats between rp & fb
3591 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3592 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3594 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003595 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3596
3597 m_errorMonitor->VerifyFound();
3598 if (err == VK_SUCCESS) {
3599 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3600 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003601 vkDestroyRenderPass(m_device->device(), rp, NULL);
3602
3603 // Create new renderpass with alternate sample count from fb
3604 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3605 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3606 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3607 ASSERT_VK_SUCCESS(err);
3608
3609 // Cause error due to mis-matched sample count between rp & fb
3610 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3612 " has VK_SAMPLE_COUNT_1_BIT samples "
3613 "that do not match the "
3614 "VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003615 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3616
3617 m_errorMonitor->VerifyFound();
3618 if (err == VK_SUCCESS) {
3619 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3620 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003621
3622 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003623
3624 // Create a custom imageView with non-1 mip levels
3625 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003626 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 -06003627 ASSERT_TRUE(image.initialized());
3628
3629 VkImageView view;
3630 VkImageViewCreateInfo ivci = {};
3631 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3632 ivci.image = image.handle();
3633 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3634 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3635 ivci.subresourceRange.layerCount = 1;
3636 ivci.subresourceRange.baseMipLevel = 0;
3637 // Set level count 2 (only 1 is allowed for FB attachment)
3638 ivci.subresourceRange.levelCount = 2;
3639 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3640 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3641 ASSERT_VK_SUCCESS(err);
3642 // Re-create renderpass to have matching sample count
3643 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3644 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3645 ASSERT_VK_SUCCESS(err);
3646
3647 fb_info.renderPass = rp;
3648 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003649 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003650 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3651
3652 m_errorMonitor->VerifyFound();
3653 if (err == VK_SUCCESS) {
3654 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3655 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003656 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003657 // Update view to original color buffer and grow FB dimensions too big
3658 fb_info.pAttachments = ivs;
3659 fb_info.height = 1024;
3660 fb_info.width = 1024;
3661 fb_info.layers = 2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3663 " Attachment dimensions must be at "
3664 "least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003665 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3666
3667 m_errorMonitor->VerifyFound();
3668 if (err == VK_SUCCESS) {
3669 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3670 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06003671 // Create view attachment with non-identity swizzle
3672 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3673 ivci.image = image.handle();
3674 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3675 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3676 ivci.subresourceRange.layerCount = 1;
3677 ivci.subresourceRange.baseMipLevel = 0;
3678 ivci.subresourceRange.levelCount = 1;
3679 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3680 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
3681 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
3682 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
3683 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
3684 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3685 ASSERT_VK_SUCCESS(err);
3686
3687 fb_info.pAttachments = &view;
3688 fb_info.height = 100;
3689 fb_info.width = 100;
3690 fb_info.layers = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003691 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3692 " has non-identy swizzle. All "
3693 "framebuffer attachments must have "
3694 "been created with the identity "
3695 "swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06003696 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3697
3698 m_errorMonitor->VerifyFound();
3699 if (err == VK_SUCCESS) {
3700 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3701 }
3702 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003703 // reset attachment to color attachment
3704 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003705
3706 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003707 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003708 fb_info.height = 100;
3709 fb_info.layers = 1;
3710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
3711 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3712
3713 m_errorMonitor->VerifyFound();
3714 if (err == VK_SUCCESS) {
3715 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3716 }
3717
3718 // Request fb that exceeds max height
3719 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003720 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003721 fb_info.layers = 1;
3722 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
3723 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3724
3725 m_errorMonitor->VerifyFound();
3726 if (err == VK_SUCCESS) {
3727 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3728 }
3729
3730 // Request fb that exceeds max layers
3731 fb_info.width = 100;
3732 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003733 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003734 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003735 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3736
3737 m_errorMonitor->VerifyFound();
3738 if (err == VK_SUCCESS) {
3739 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3740 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003741
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003742 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003743}
3744
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003745TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003746 TEST_DESCRIPTION(
3747 "Run a simple draw calls to validate failure when Depth Bias dynamic "
3748 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003749
Cody Northropc31a84f2016-08-22 10:41:47 -06003750 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003751 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
3753 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003754 m_errorMonitor->VerifyFound();
3755}
3756
3757TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003758 TEST_DESCRIPTION(
3759 "Run a simple draw calls to validate failure when Line Width dynamic "
3760 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003761
Cody Northropc31a84f2016-08-22 10:41:47 -06003762 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003763 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
3765 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003766 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003767}
3768
3769TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003770 TEST_DESCRIPTION(
3771 "Run a simple draw calls to validate failure when Viewport dynamic "
3772 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003773
Cody Northropc31a84f2016-08-22 10:41:47 -06003774 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003775 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3777 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003778 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003779 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003780}
3781
3782TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003783 TEST_DESCRIPTION(
3784 "Run a simple draw calls to validate failure when Scissor dynamic "
3785 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003786
Cody Northropc31a84f2016-08-22 10:41:47 -06003787 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003788 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3790 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003791 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003792 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003793}
3794
Cortd713fe82016-07-27 09:51:27 -07003795TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003796 TEST_DESCRIPTION(
3797 "Run a simple draw calls to validate failure when Blend Constants "
3798 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003799
3800 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06003801 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3803 "Dynamic blend constants state not set for this command buffer");
3804 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06003805 m_errorMonitor->VerifyFound();
3806}
3807
3808TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003809 TEST_DESCRIPTION(
3810 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
3811 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003812
3813 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06003814 if (!m_device->phy().features().depthBounds) {
3815 printf("Device does not support depthBounds test; skipped.\n");
3816 return;
3817 }
3818 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3820 "Dynamic depth bounds state not set for this command buffer");
3821 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003822 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003823}
3824
3825TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003826 TEST_DESCRIPTION(
3827 "Run a simple draw calls to validate failure when Stencil Read dynamic "
3828 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003829
3830 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003831 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3833 "Dynamic stencil read mask state not set for this command buffer");
3834 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003835 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003836}
3837
3838TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003839 TEST_DESCRIPTION(
3840 "Run a simple draw calls to validate failure when Stencil Write dynamic"
3841 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003842
3843 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003844 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3846 "Dynamic stencil write mask state not set for this command buffer");
3847 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003848 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003849}
3850
3851TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003852 TEST_DESCRIPTION(
3853 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
3854 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003855
3856 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003857 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003858 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3859 "Dynamic stencil reference state not set for this command buffer");
3860 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003861 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06003862}
3863
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06003864TEST_F(VkLayerTest, IndexBufferNotBound) {
3865 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003866
3867 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3869 "Index buffer object not bound to this command buffer when Indexed ");
3870 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06003871 m_errorMonitor->VerifyFound();
3872}
3873
Karl Schultz6addd812016-02-02 17:17:23 -07003874TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3876 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
3877 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003878
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003879 ASSERT_NO_FATAL_FAILURE(InitState());
3880 ASSERT_NO_FATAL_FAILURE(InitViewport());
3881 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3882
Karl Schultz6addd812016-02-02 17:17:23 -07003883 // We luck out b/c by default the framework creates CB w/ the
3884 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07003885 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003886 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07003887 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003888
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003889 // Bypass framework since it does the waits automatically
3890 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003891 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003892 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3893 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003894 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003895 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003896 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003897 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003898 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003899 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003900 submit_info.pSignalSemaphores = NULL;
3901
Chris Forbes40028e22016-06-13 09:59:34 +12003902 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07003903 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07003904 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003905
Karl Schultz6addd812016-02-02 17:17:23 -07003906 // Cause validation error by re-submitting cmd buffer that should only be
3907 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12003908 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07003909 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003910
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003911 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003912}
3913
Karl Schultz6addd812016-02-02 17:17:23 -07003914TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003915 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07003916 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003917
3918 ASSERT_NO_FATAL_FAILURE(InitState());
3919 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003920
Karl Schultz6addd812016-02-02 17:17:23 -07003921 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
3922 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003923 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003924 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003925 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003926
3927 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003928 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3929 ds_pool_ci.pNext = NULL;
3930 ds_pool_ci.flags = 0;
3931 ds_pool_ci.maxSets = 1;
3932 ds_pool_ci.poolSizeCount = 1;
3933 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003934
3935 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003936 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003937 ASSERT_VK_SUCCESS(err);
3938
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003939 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
3940 dsl_binding_samp.binding = 0;
3941 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3942 dsl_binding_samp.descriptorCount = 1;
3943 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
3944 dsl_binding_samp.pImmutableSamplers = NULL;
3945
3946 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3947 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3948 ds_layout_ci.pNext = NULL;
3949 ds_layout_ci.bindingCount = 1;
3950 ds_layout_ci.pBindings = &dsl_binding_samp;
3951
3952 VkDescriptorSetLayout ds_layout_samp;
3953 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
3954 ASSERT_VK_SUCCESS(err);
3955
3956 // Try to allocate 2 sets when pool only has 1 set
3957 VkDescriptorSet descriptor_sets[2];
3958 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
3959 VkDescriptorSetAllocateInfo alloc_info = {};
3960 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3961 alloc_info.descriptorSetCount = 2;
3962 alloc_info.descriptorPool = ds_pool;
3963 alloc_info.pSetLayouts = set_layouts;
3964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
3965 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
3966 m_errorMonitor->VerifyFound();
3967
3968 alloc_info.descriptorSetCount = 1;
3969 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003970 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003971 dsl_binding.binding = 0;
3972 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3973 dsl_binding.descriptorCount = 1;
3974 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3975 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003976
Karl Schultz6addd812016-02-02 17:17:23 -07003977 ds_layout_ci.bindingCount = 1;
3978 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003979
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003980 VkDescriptorSetLayout ds_layout_ub;
3981 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003982 ASSERT_VK_SUCCESS(err);
3983
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003984 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003985 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003986 alloc_info.pSetLayouts = &ds_layout_ub;
3987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
3988 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003989
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003990 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003991
Karl Schultz2825ab92016-12-02 08:23:14 -07003992 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003993 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08003994 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003995}
3996
Karl Schultz6addd812016-02-02 17:17:23 -07003997TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
3998 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06003999
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004001
Tobin Ehlise735c692015-10-08 13:13:50 -06004002 ASSERT_NO_FATAL_FAILURE(InitState());
4003 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004004
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004005 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004006 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4007 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004008
4009 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004010 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4011 ds_pool_ci.pNext = NULL;
4012 ds_pool_ci.maxSets = 1;
4013 ds_pool_ci.poolSizeCount = 1;
4014 ds_pool_ci.flags = 0;
4015 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4016 // app can only call vkResetDescriptorPool on this pool.;
4017 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004018
4019 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004020 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004021 ASSERT_VK_SUCCESS(err);
4022
4023 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004024 dsl_binding.binding = 0;
4025 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4026 dsl_binding.descriptorCount = 1;
4027 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4028 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004029
4030 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004031 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4032 ds_layout_ci.pNext = NULL;
4033 ds_layout_ci.bindingCount = 1;
4034 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004035
4036 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004037 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004038 ASSERT_VK_SUCCESS(err);
4039
4040 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004041 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004042 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004043 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004044 alloc_info.descriptorPool = ds_pool;
4045 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004046 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004047 ASSERT_VK_SUCCESS(err);
4048
4049 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004050 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004051
Chia-I Wuf7458c52015-10-26 21:10:41 +08004052 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4053 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004054}
4055
Karl Schultz6addd812016-02-02 17:17:23 -07004056TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004057 // Attempt to clear Descriptor Pool with bad object.
4058 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004059
4060 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004062 uint64_t fake_pool_handle = 0xbaad6001;
4063 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4064 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004065 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004066}
4067
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004068TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004069 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4070 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004071 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004072 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004073
4074 uint64_t fake_set_handle = 0xbaad6001;
4075 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004076 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004078
4079 ASSERT_NO_FATAL_FAILURE(InitState());
4080
4081 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4082 layout_bindings[0].binding = 0;
4083 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4084 layout_bindings[0].descriptorCount = 1;
4085 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4086 layout_bindings[0].pImmutableSamplers = NULL;
4087
4088 VkDescriptorSetLayout descriptor_set_layout;
4089 VkDescriptorSetLayoutCreateInfo dslci = {};
4090 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4091 dslci.pNext = NULL;
4092 dslci.bindingCount = 1;
4093 dslci.pBindings = layout_bindings;
4094 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004095 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004096
4097 VkPipelineLayout pipeline_layout;
4098 VkPipelineLayoutCreateInfo plci = {};
4099 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4100 plci.pNext = NULL;
4101 plci.setLayoutCount = 1;
4102 plci.pSetLayouts = &descriptor_set_layout;
4103 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004104 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004105
Tony Barbour552f6c02016-12-21 14:34:07 -07004106 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004107 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4108 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004109 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004110 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004111 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4112 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004113}
4114
Karl Schultz6addd812016-02-02 17:17:23 -07004115TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004116 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4117 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004118 uint64_t fake_layout_handle = 0xbaad6001;
4119 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004120 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Cody Northropc31a84f2016-08-22 10:41:47 -06004121 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzbdb75952016-04-19 11:36:49 -06004122 VkPipelineLayout pipeline_layout;
4123 VkPipelineLayoutCreateInfo plci = {};
4124 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4125 plci.pNext = NULL;
4126 plci.setLayoutCount = 1;
4127 plci.pSetLayouts = &bad_layout;
4128 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4129
4130 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004131}
4132
Mark Muellerd4914412016-06-13 17:52:06 -06004133TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004134 TEST_DESCRIPTION(
4135 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4136 "1) A uniform buffer update must have a valid buffer index."
4137 "2) When using an array of descriptors in a single WriteDescriptor,"
4138 " the descriptor types and stageflags must all be the same."
4139 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004140
Mike Weiblena6666382017-01-05 15:16:11 -07004141 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004142
4143 ASSERT_NO_FATAL_FAILURE(InitState());
4144 VkDescriptorPoolSize ds_type_count[4] = {};
4145 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4146 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004147 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004148 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004149 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004150 ds_type_count[2].descriptorCount = 1;
4151 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4152 ds_type_count[3].descriptorCount = 1;
4153
4154 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4155 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4156 ds_pool_ci.maxSets = 1;
4157 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4158 ds_pool_ci.pPoolSizes = ds_type_count;
4159
4160 VkDescriptorPool ds_pool;
4161 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4162 ASSERT_VK_SUCCESS(err);
4163
Mark Muellerb9896722016-06-16 09:54:29 -06004164 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004165 layout_binding[0].binding = 0;
4166 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4167 layout_binding[0].descriptorCount = 1;
4168 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4169 layout_binding[0].pImmutableSamplers = NULL;
4170
4171 layout_binding[1].binding = 1;
4172 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4173 layout_binding[1].descriptorCount = 1;
4174 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4175 layout_binding[1].pImmutableSamplers = NULL;
4176
4177 VkSamplerCreateInfo sampler_ci = {};
4178 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4179 sampler_ci.pNext = NULL;
4180 sampler_ci.magFilter = VK_FILTER_NEAREST;
4181 sampler_ci.minFilter = VK_FILTER_NEAREST;
4182 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4183 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4184 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4185 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4186 sampler_ci.mipLodBias = 1.0;
4187 sampler_ci.anisotropyEnable = VK_FALSE;
4188 sampler_ci.maxAnisotropy = 1;
4189 sampler_ci.compareEnable = VK_FALSE;
4190 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4191 sampler_ci.minLod = 1.0;
4192 sampler_ci.maxLod = 1.0;
4193 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4194 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4195 VkSampler sampler;
4196
4197 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4198 ASSERT_VK_SUCCESS(err);
4199
4200 layout_binding[2].binding = 2;
4201 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4202 layout_binding[2].descriptorCount = 1;
4203 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4204 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4205
Mark Muellerd4914412016-06-13 17:52:06 -06004206 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4207 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4208 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4209 ds_layout_ci.pBindings = layout_binding;
4210 VkDescriptorSetLayout ds_layout;
4211 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4212 ASSERT_VK_SUCCESS(err);
4213
4214 VkDescriptorSetAllocateInfo alloc_info = {};
4215 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4216 alloc_info.descriptorSetCount = 1;
4217 alloc_info.descriptorPool = ds_pool;
4218 alloc_info.pSetLayouts = &ds_layout;
4219 VkDescriptorSet descriptorSet;
4220 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4221 ASSERT_VK_SUCCESS(err);
4222
4223 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4224 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4225 pipeline_layout_ci.pNext = NULL;
4226 pipeline_layout_ci.setLayoutCount = 1;
4227 pipeline_layout_ci.pSetLayouts = &ds_layout;
4228
4229 VkPipelineLayout pipeline_layout;
4230 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4231 ASSERT_VK_SUCCESS(err);
4232
Mark Mueller5c838ce2016-06-16 09:54:29 -06004233 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004234 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4235 descriptor_write.dstSet = descriptorSet;
4236 descriptor_write.dstBinding = 0;
4237 descriptor_write.descriptorCount = 1;
4238 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4239
Mark Mueller5c838ce2016-06-16 09:54:29 -06004240 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004241 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4242 m_errorMonitor->VerifyFound();
4243
4244 // Create a buffer to update the descriptor with
4245 uint32_t qfi = 0;
4246 VkBufferCreateInfo buffCI = {};
4247 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4248 buffCI.size = 1024;
4249 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4250 buffCI.queueFamilyIndexCount = 1;
4251 buffCI.pQueueFamilyIndices = &qfi;
4252
4253 VkBuffer dyub;
4254 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4255 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004256
Tony Barboure132c5f2016-12-12 11:50:20 -07004257 VkDeviceMemory mem;
4258 VkMemoryRequirements mem_reqs;
4259 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4260
4261 VkMemoryAllocateInfo mem_alloc_info = {};
4262 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4263 mem_alloc_info.allocationSize = mem_reqs.size;
4264 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4265 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4266 ASSERT_VK_SUCCESS(err);
4267
4268 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4269 ASSERT_VK_SUCCESS(err);
4270
4271 VkDescriptorBufferInfo buffInfo[2] = {};
4272 buffInfo[0].buffer = dyub;
4273 buffInfo[0].offset = 0;
4274 buffInfo[0].range = 1024;
4275 buffInfo[1].buffer = dyub;
4276 buffInfo[1].offset = 0;
4277 buffInfo[1].range = 1024;
4278 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004279 descriptor_write.descriptorCount = 2;
4280
Mark Mueller5c838ce2016-06-16 09:54:29 -06004281 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004283 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4284 m_errorMonitor->VerifyFound();
4285
Mark Mueller5c838ce2016-06-16 09:54:29 -06004286 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4287 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004288 descriptor_write.dstBinding = 1;
4289 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004290
Mark Mueller5c838ce2016-06-16 09:54:29 -06004291 // Make pImageInfo index non-null to avoid complaints of it missing
4292 VkDescriptorImageInfo imageInfo = {};
4293 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4294 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004295 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004296 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4297 m_errorMonitor->VerifyFound();
4298
Mark Muellerd4914412016-06-13 17:52:06 -06004299 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004300 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004301 vkDestroySampler(m_device->device(), sampler, NULL);
4302 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4303 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4304 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4305}
4306
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004307TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004308 TEST_DESCRIPTION(
4309 "Attempt to draw with a command buffer that is invalid "
4310 "due to a buffer dependency being destroyed.");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004311 ASSERT_NO_FATAL_FAILURE(InitState());
4312
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004313 VkBuffer buffer;
4314 VkDeviceMemory mem;
4315 VkMemoryRequirements mem_reqs;
4316
4317 VkBufferCreateInfo buf_info = {};
4318 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004319 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004320 buf_info.size = 256;
4321 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4322 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4323 ASSERT_VK_SUCCESS(err);
4324
4325 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4326
4327 VkMemoryAllocateInfo alloc_info = {};
4328 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4329 alloc_info.allocationSize = 256;
4330 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004331 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 -06004332 if (!pass) {
4333 vkDestroyBuffer(m_device->device(), buffer, NULL);
4334 return;
4335 }
4336 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4337 ASSERT_VK_SUCCESS(err);
4338
4339 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4340 ASSERT_VK_SUCCESS(err);
4341
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004342 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004343 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004344 m_commandBuffer->EndCommandBuffer();
4345
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004347 // Destroy buffer dependency prior to submit to cause ERROR
4348 vkDestroyBuffer(m_device->device(), buffer, NULL);
4349
4350 VkSubmitInfo submit_info = {};
4351 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4352 submit_info.commandBufferCount = 1;
4353 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4354 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4355
4356 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004357 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004358 vkFreeMemory(m_device->handle(), mem, NULL);
4359}
4360
Tobin Ehlisea413442016-09-28 10:23:59 -06004361TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4362 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4363
4364 ASSERT_NO_FATAL_FAILURE(InitState());
4365 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4366
4367 VkDescriptorPoolSize ds_type_count;
4368 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4369 ds_type_count.descriptorCount = 1;
4370
4371 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4372 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4373 ds_pool_ci.maxSets = 1;
4374 ds_pool_ci.poolSizeCount = 1;
4375 ds_pool_ci.pPoolSizes = &ds_type_count;
4376
4377 VkDescriptorPool ds_pool;
4378 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4379 ASSERT_VK_SUCCESS(err);
4380
4381 VkDescriptorSetLayoutBinding layout_binding;
4382 layout_binding.binding = 0;
4383 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4384 layout_binding.descriptorCount = 1;
4385 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4386 layout_binding.pImmutableSamplers = NULL;
4387
4388 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4389 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4390 ds_layout_ci.bindingCount = 1;
4391 ds_layout_ci.pBindings = &layout_binding;
4392 VkDescriptorSetLayout ds_layout;
4393 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4394 ASSERT_VK_SUCCESS(err);
4395
4396 VkDescriptorSetAllocateInfo alloc_info = {};
4397 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4398 alloc_info.descriptorSetCount = 1;
4399 alloc_info.descriptorPool = ds_pool;
4400 alloc_info.pSetLayouts = &ds_layout;
4401 VkDescriptorSet descriptor_set;
4402 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4403 ASSERT_VK_SUCCESS(err);
4404
4405 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4406 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4407 pipeline_layout_ci.pNext = NULL;
4408 pipeline_layout_ci.setLayoutCount = 1;
4409 pipeline_layout_ci.pSetLayouts = &ds_layout;
4410
4411 VkPipelineLayout pipeline_layout;
4412 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4413 ASSERT_VK_SUCCESS(err);
4414
4415 VkBuffer buffer;
4416 uint32_t queue_family_index = 0;
4417 VkBufferCreateInfo buffer_create_info = {};
4418 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4419 buffer_create_info.size = 1024;
4420 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4421 buffer_create_info.queueFamilyIndexCount = 1;
4422 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4423
4424 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4425 ASSERT_VK_SUCCESS(err);
4426
4427 VkMemoryRequirements memory_reqs;
4428 VkDeviceMemory buffer_memory;
4429
4430 VkMemoryAllocateInfo memory_info = {};
4431 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4432 memory_info.allocationSize = 0;
4433 memory_info.memoryTypeIndex = 0;
4434
4435 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4436 memory_info.allocationSize = memory_reqs.size;
4437 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4438 ASSERT_TRUE(pass);
4439
4440 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4441 ASSERT_VK_SUCCESS(err);
4442 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4443 ASSERT_VK_SUCCESS(err);
4444
4445 VkBufferView view;
4446 VkBufferViewCreateInfo bvci = {};
4447 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4448 bvci.buffer = buffer;
4449 bvci.format = VK_FORMAT_R8_UNORM;
4450 bvci.range = VK_WHOLE_SIZE;
4451
4452 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4453 ASSERT_VK_SUCCESS(err);
4454
4455 VkWriteDescriptorSet descriptor_write = {};
4456 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4457 descriptor_write.dstSet = descriptor_set;
4458 descriptor_write.dstBinding = 0;
4459 descriptor_write.descriptorCount = 1;
4460 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4461 descriptor_write.pTexelBufferView = &view;
4462
4463 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4464
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004465 char const *vsSource =
4466 "#version 450\n"
4467 "\n"
4468 "out gl_PerVertex { \n"
4469 " vec4 gl_Position;\n"
4470 "};\n"
4471 "void main(){\n"
4472 " gl_Position = vec4(1);\n"
4473 "}\n";
4474 char const *fsSource =
4475 "#version 450\n"
4476 "\n"
4477 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4478 "layout(location=0) out vec4 x;\n"
4479 "void main(){\n"
4480 " x = imageLoad(s, 0);\n"
4481 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004482 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4483 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4484 VkPipelineObj pipe(m_device);
4485 pipe.AddShader(&vs);
4486 pipe.AddShader(&fs);
4487 pipe.AddColorAttachment();
4488 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4489
4490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted buffer view ");
4491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4492
Tony Barbour552f6c02016-12-21 14:34:07 -07004493 m_commandBuffer->BeginCommandBuffer();
4494 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4495
Tobin Ehlisea413442016-09-28 10:23:59 -06004496 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4497 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4498 VkRect2D scissor = {{0, 0}, {16, 16}};
4499 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4500 // Bind pipeline to cmd buffer
4501 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4502 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4503 &descriptor_set, 0, nullptr);
4504 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004505 m_commandBuffer->EndRenderPass();
4506 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004507
4508 // Delete BufferView in order to invalidate cmd buffer
4509 vkDestroyBufferView(m_device->device(), view, NULL);
4510 // Now attempt submit of cmd buffer
4511 VkSubmitInfo submit_info = {};
4512 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4513 submit_info.commandBufferCount = 1;
4514 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4515 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4516 m_errorMonitor->VerifyFound();
4517
4518 // Clean-up
4519 vkDestroyBuffer(m_device->device(), buffer, NULL);
4520 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4521 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4522 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4523 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4524}
4525
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004526TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004527 TEST_DESCRIPTION(
4528 "Attempt to draw with a command buffer that is invalid "
4529 "due to an image dependency being destroyed.");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004530 ASSERT_NO_FATAL_FAILURE(InitState());
4531
4532 VkImage image;
4533 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4534 VkImageCreateInfo image_create_info = {};
4535 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4536 image_create_info.pNext = NULL;
4537 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4538 image_create_info.format = tex_format;
4539 image_create_info.extent.width = 32;
4540 image_create_info.extent.height = 32;
4541 image_create_info.extent.depth = 1;
4542 image_create_info.mipLevels = 1;
4543 image_create_info.arrayLayers = 1;
4544 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4545 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004546 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004547 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004548 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004549 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004550 // Have to bind memory to image before recording cmd in cmd buffer using it
4551 VkMemoryRequirements mem_reqs;
4552 VkDeviceMemory image_mem;
4553 bool pass;
4554 VkMemoryAllocateInfo mem_alloc = {};
4555 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4556 mem_alloc.pNext = NULL;
4557 mem_alloc.memoryTypeIndex = 0;
4558 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4559 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004560 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004561 ASSERT_TRUE(pass);
4562 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4563 ASSERT_VK_SUCCESS(err);
4564 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4565 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004566
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004567 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004568 VkClearColorValue ccv;
4569 ccv.float32[0] = 1.0f;
4570 ccv.float32[1] = 1.0f;
4571 ccv.float32[2] = 1.0f;
4572 ccv.float32[3] = 1.0f;
4573 VkImageSubresourceRange isr = {};
4574 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004575 isr.baseArrayLayer = 0;
4576 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004577 isr.layerCount = 1;
4578 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004579 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004580 m_commandBuffer->EndCommandBuffer();
4581
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004582 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004583 // Destroy image dependency prior to submit to cause ERROR
4584 vkDestroyImage(m_device->device(), image, NULL);
4585
4586 VkSubmitInfo submit_info = {};
4587 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4588 submit_info.commandBufferCount = 1;
4589 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4590 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4591
4592 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004593 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004594}
4595
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004596TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004597 TEST_DESCRIPTION(
4598 "Attempt to draw with a command buffer that is invalid "
4599 "due to a framebuffer image dependency being destroyed.");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004600 VkFormatProperties format_properties;
4601 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004602 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4603 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004604 return;
4605 }
4606
4607 ASSERT_NO_FATAL_FAILURE(InitState());
4608 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4609
4610 VkImageCreateInfo image_ci = {};
4611 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4612 image_ci.pNext = NULL;
4613 image_ci.imageType = VK_IMAGE_TYPE_2D;
4614 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4615 image_ci.extent.width = 32;
4616 image_ci.extent.height = 32;
4617 image_ci.extent.depth = 1;
4618 image_ci.mipLevels = 1;
4619 image_ci.arrayLayers = 1;
4620 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4621 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004622 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004623 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4624 image_ci.flags = 0;
4625 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004626 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004627
4628 VkMemoryRequirements memory_reqs;
4629 VkDeviceMemory image_memory;
4630 bool pass;
4631 VkMemoryAllocateInfo memory_info = {};
4632 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4633 memory_info.pNext = NULL;
4634 memory_info.allocationSize = 0;
4635 memory_info.memoryTypeIndex = 0;
4636 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
4637 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004638 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004639 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004640 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004641 ASSERT_VK_SUCCESS(err);
4642 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
4643 ASSERT_VK_SUCCESS(err);
4644
4645 VkImageViewCreateInfo ivci = {
4646 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4647 nullptr,
4648 0,
4649 image,
4650 VK_IMAGE_VIEW_TYPE_2D,
4651 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004652 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004653 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
4654 };
4655 VkImageView view;
4656 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4657 ASSERT_VK_SUCCESS(err);
4658
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004659 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004660 VkFramebuffer fb;
4661 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4662 ASSERT_VK_SUCCESS(err);
4663
4664 // Just use default renderpass with our framebuffer
4665 m_renderPassBeginInfo.framebuffer = fb;
4666 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07004667 m_commandBuffer->BeginCommandBuffer();
4668 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4669 m_commandBuffer->EndRenderPass();
4670 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004671 // Destroy image attached to framebuffer to invalidate cmd buffer
4672 vkDestroyImage(m_device->device(), image, NULL);
4673 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004675 QueueCommandBuffer(false);
4676 m_errorMonitor->VerifyFound();
4677
4678 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4679 vkDestroyImageView(m_device->device(), view, nullptr);
4680 vkFreeMemory(m_device->device(), image_memory, nullptr);
4681}
4682
Tobin Ehlisb329f992016-10-12 13:20:29 -06004683TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
4684 TEST_DESCRIPTION("Delete in-use framebuffer.");
4685 VkFormatProperties format_properties;
4686 VkResult err = VK_SUCCESS;
4687 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4688
4689 ASSERT_NO_FATAL_FAILURE(InitState());
4690 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4691
4692 VkImageObj image(m_device);
4693 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4694 ASSERT_TRUE(image.initialized());
4695 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
4696
4697 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
4698 VkFramebuffer fb;
4699 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4700 ASSERT_VK_SUCCESS(err);
4701
4702 // Just use default renderpass with our framebuffer
4703 m_renderPassBeginInfo.framebuffer = fb;
4704 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07004705 m_commandBuffer->BeginCommandBuffer();
4706 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4707 m_commandBuffer->EndRenderPass();
4708 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06004709 // Submit cmd buffer to put it in-flight
4710 VkSubmitInfo submit_info = {};
4711 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4712 submit_info.commandBufferCount = 1;
4713 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4714 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4715 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06004717 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4718 m_errorMonitor->VerifyFound();
4719 // Wait for queue to complete so we can safely destroy everything
4720 vkQueueWaitIdle(m_device->m_queue);
4721 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4722}
4723
Tobin Ehlis88becd72016-09-21 14:33:41 -06004724TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
4725 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
4726 VkFormatProperties format_properties;
4727 VkResult err = VK_SUCCESS;
4728 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06004729
4730 ASSERT_NO_FATAL_FAILURE(InitState());
4731 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4732
4733 VkImageCreateInfo image_ci = {};
4734 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4735 image_ci.pNext = NULL;
4736 image_ci.imageType = VK_IMAGE_TYPE_2D;
4737 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4738 image_ci.extent.width = 256;
4739 image_ci.extent.height = 256;
4740 image_ci.extent.depth = 1;
4741 image_ci.mipLevels = 1;
4742 image_ci.arrayLayers = 1;
4743 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4744 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06004745 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06004746 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4747 image_ci.flags = 0;
4748 VkImage image;
4749 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
4750
4751 VkMemoryRequirements memory_reqs;
4752 VkDeviceMemory image_memory;
4753 bool pass;
4754 VkMemoryAllocateInfo memory_info = {};
4755 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4756 memory_info.pNext = NULL;
4757 memory_info.allocationSize = 0;
4758 memory_info.memoryTypeIndex = 0;
4759 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
4760 memory_info.allocationSize = memory_reqs.size;
4761 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4762 ASSERT_TRUE(pass);
4763 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
4764 ASSERT_VK_SUCCESS(err);
4765 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
4766 ASSERT_VK_SUCCESS(err);
4767
4768 VkImageViewCreateInfo ivci = {
4769 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4770 nullptr,
4771 0,
4772 image,
4773 VK_IMAGE_VIEW_TYPE_2D,
4774 VK_FORMAT_B8G8R8A8_UNORM,
4775 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
4776 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
4777 };
4778 VkImageView view;
4779 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4780 ASSERT_VK_SUCCESS(err);
4781
4782 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
4783 VkFramebuffer fb;
4784 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4785 ASSERT_VK_SUCCESS(err);
4786
4787 // Just use default renderpass with our framebuffer
4788 m_renderPassBeginInfo.framebuffer = fb;
4789 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07004790 m_commandBuffer->BeginCommandBuffer();
4791 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4792 m_commandBuffer->EndRenderPass();
4793 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06004794 // Submit cmd buffer to put it (and attached imageView) in-flight
4795 VkSubmitInfo submit_info = {};
4796 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4797 submit_info.commandBufferCount = 1;
4798 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4799 // Submit cmd buffer to put framebuffer and children in-flight
4800 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4801 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06004803 vkDestroyImage(m_device->device(), image, NULL);
4804 m_errorMonitor->VerifyFound();
4805 // Wait for queue to complete so we can safely destroy image and other objects
4806 vkQueueWaitIdle(m_device->m_queue);
4807 vkDestroyImage(m_device->device(), image, NULL);
4808 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4809 vkDestroyImageView(m_device->device(), view, nullptr);
4810 vkFreeMemory(m_device->device(), image_memory, nullptr);
4811}
4812
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06004813TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
4814 TEST_DESCRIPTION("Delete in-use renderPass.");
4815
4816 ASSERT_NO_FATAL_FAILURE(InitState());
4817 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4818
4819 // Create simple renderpass
4820 VkAttachmentReference attach = {};
4821 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4822 VkSubpassDescription subpass = {};
4823 subpass.pColorAttachments = &attach;
4824 VkRenderPassCreateInfo rpci = {};
4825 rpci.subpassCount = 1;
4826 rpci.pSubpasses = &subpass;
4827 rpci.attachmentCount = 1;
4828 VkAttachmentDescription attach_desc = {};
4829 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4830 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4831 rpci.pAttachments = &attach_desc;
4832 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4833 VkRenderPass rp;
4834 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4835 ASSERT_VK_SUCCESS(err);
4836
4837 // Create a pipeline that uses the given renderpass
4838 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4839 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4840
4841 VkPipelineLayout pipeline_layout;
4842 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4843 ASSERT_VK_SUCCESS(err);
4844
4845 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4846 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4847 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004848 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06004849 vp_state_ci.pViewports = &vp;
4850 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004851 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06004852 vp_state_ci.pScissors = &scissors;
4853
4854 VkPipelineShaderStageCreateInfo shaderStages[2];
4855 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4856
4857 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004858 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 -06004859 // but add it to be able to run on more devices
4860 shaderStages[0] = vs.GetStageCreateInfo();
4861 shaderStages[1] = fs.GetStageCreateInfo();
4862
4863 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4864 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4865
4866 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4867 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4868 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4869
4870 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4871 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4872 rs_ci.rasterizerDiscardEnable = true;
4873 rs_ci.lineWidth = 1.0f;
4874
4875 VkPipelineColorBlendAttachmentState att = {};
4876 att.blendEnable = VK_FALSE;
4877 att.colorWriteMask = 0xf;
4878
4879 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4880 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4881 cb_ci.attachmentCount = 1;
4882 cb_ci.pAttachments = &att;
4883
4884 VkGraphicsPipelineCreateInfo gp_ci = {};
4885 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4886 gp_ci.stageCount = 2;
4887 gp_ci.pStages = shaderStages;
4888 gp_ci.pVertexInputState = &vi_ci;
4889 gp_ci.pInputAssemblyState = &ia_ci;
4890 gp_ci.pViewportState = &vp_state_ci;
4891 gp_ci.pRasterizationState = &rs_ci;
4892 gp_ci.pColorBlendState = &cb_ci;
4893 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4894 gp_ci.layout = pipeline_layout;
4895 gp_ci.renderPass = rp;
4896
4897 VkPipelineCacheCreateInfo pc_ci = {};
4898 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4899
4900 VkPipeline pipeline;
4901 VkPipelineCache pipe_cache;
4902 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
4903 ASSERT_VK_SUCCESS(err);
4904
4905 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
4906 ASSERT_VK_SUCCESS(err);
4907 // Bind pipeline to cmd buffer, will also bind renderpass
4908 m_commandBuffer->BeginCommandBuffer();
4909 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4910 m_commandBuffer->EndCommandBuffer();
4911
4912 VkSubmitInfo submit_info = {};
4913 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4914 submit_info.commandBufferCount = 1;
4915 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4916 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4917
4918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
4919 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4920 m_errorMonitor->VerifyFound();
4921
4922 // Wait for queue to complete so we can safely destroy everything
4923 vkQueueWaitIdle(m_device->m_queue);
4924 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4925 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
4926 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
4927 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
4928}
4929
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004930TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004931 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004932 ASSERT_NO_FATAL_FAILURE(InitState());
4933
4934 VkImage image;
4935 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4936 VkImageCreateInfo image_create_info = {};
4937 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4938 image_create_info.pNext = NULL;
4939 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4940 image_create_info.format = tex_format;
4941 image_create_info.extent.width = 32;
4942 image_create_info.extent.height = 32;
4943 image_create_info.extent.depth = 1;
4944 image_create_info.mipLevels = 1;
4945 image_create_info.arrayLayers = 1;
4946 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4947 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004948 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004949 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004950 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004951 ASSERT_VK_SUCCESS(err);
4952 // Have to bind memory to image before recording cmd in cmd buffer using it
4953 VkMemoryRequirements mem_reqs;
4954 VkDeviceMemory image_mem;
4955 bool pass;
4956 VkMemoryAllocateInfo mem_alloc = {};
4957 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4958 mem_alloc.pNext = NULL;
4959 mem_alloc.memoryTypeIndex = 0;
4960 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4961 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004962 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004963 ASSERT_TRUE(pass);
4964 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4965 ASSERT_VK_SUCCESS(err);
4966
Tobin Ehlisfed999f2016-09-21 15:09:45 -06004967 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
4968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06004969 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004970
4971 m_commandBuffer->BeginCommandBuffer();
4972 VkClearColorValue ccv;
4973 ccv.float32[0] = 1.0f;
4974 ccv.float32[1] = 1.0f;
4975 ccv.float32[2] = 1.0f;
4976 ccv.float32[3] = 1.0f;
4977 VkImageSubresourceRange isr = {};
4978 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4979 isr.baseArrayLayer = 0;
4980 isr.baseMipLevel = 0;
4981 isr.layerCount = 1;
4982 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004983 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004984 m_commandBuffer->EndCommandBuffer();
4985
4986 m_errorMonitor->VerifyFound();
4987 vkDestroyImage(m_device->device(), image, NULL);
4988 vkFreeMemory(m_device->device(), image_mem, nullptr);
4989}
4990
4991TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004992 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004993 ASSERT_NO_FATAL_FAILURE(InitState());
4994
4995 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004996 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 -06004997 VK_IMAGE_TILING_OPTIMAL, 0);
4998 ASSERT_TRUE(image.initialized());
4999
5000 VkBuffer buffer;
5001 VkDeviceMemory mem;
5002 VkMemoryRequirements mem_reqs;
5003
5004 VkBufferCreateInfo buf_info = {};
5005 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005006 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005007 buf_info.size = 256;
5008 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5009 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5010 ASSERT_VK_SUCCESS(err);
5011
5012 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5013
5014 VkMemoryAllocateInfo alloc_info = {};
5015 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5016 alloc_info.allocationSize = 256;
5017 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005018 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 -06005019 if (!pass) {
5020 vkDestroyBuffer(m_device->device(), buffer, NULL);
5021 return;
5022 }
5023 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5024 ASSERT_VK_SUCCESS(err);
5025
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005026 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005028 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005029 VkBufferImageCopy region = {};
5030 region.bufferRowLength = 128;
5031 region.bufferImageHeight = 128;
5032 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5033
5034 region.imageSubresource.layerCount = 1;
5035 region.imageExtent.height = 4;
5036 region.imageExtent.width = 4;
5037 region.imageExtent.depth = 1;
5038 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005039 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5040 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005041 m_commandBuffer->EndCommandBuffer();
5042
5043 m_errorMonitor->VerifyFound();
5044
5045 vkDestroyBuffer(m_device->device(), buffer, NULL);
5046 vkFreeMemory(m_device->handle(), mem, NULL);
5047}
5048
Tobin Ehlis85940f52016-07-07 16:57:21 -06005049TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005050 TEST_DESCRIPTION(
5051 "Attempt to draw with a command buffer that is invalid "
5052 "due to an event dependency being destroyed.");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005053 ASSERT_NO_FATAL_FAILURE(InitState());
5054
5055 VkEvent event;
5056 VkEventCreateInfo evci = {};
5057 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5058 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5059 ASSERT_VK_SUCCESS(result);
5060
5061 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005062 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005063 m_commandBuffer->EndCommandBuffer();
5064
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005066 // Destroy event dependency prior to submit to cause ERROR
5067 vkDestroyEvent(m_device->device(), event, NULL);
5068
5069 VkSubmitInfo submit_info = {};
5070 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5071 submit_info.commandBufferCount = 1;
5072 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5073 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5074
5075 m_errorMonitor->VerifyFound();
5076}
5077
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005078TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005079 TEST_DESCRIPTION(
5080 "Attempt to draw with a command buffer that is invalid "
5081 "due to a query pool dependency being destroyed.");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005082 ASSERT_NO_FATAL_FAILURE(InitState());
5083
5084 VkQueryPool query_pool;
5085 VkQueryPoolCreateInfo qpci{};
5086 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5087 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5088 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005089 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005090 ASSERT_VK_SUCCESS(result);
5091
5092 m_commandBuffer->BeginCommandBuffer();
5093 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5094 m_commandBuffer->EndCommandBuffer();
5095
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005097 // Destroy query pool dependency prior to submit to cause ERROR
5098 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5099
5100 VkSubmitInfo submit_info = {};
5101 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5102 submit_info.commandBufferCount = 1;
5103 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5104 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5105
5106 m_errorMonitor->VerifyFound();
5107}
5108
Tobin Ehlis24130d92016-07-08 15:50:53 -06005109TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005110 TEST_DESCRIPTION(
5111 "Attempt to draw with a command buffer that is invalid "
5112 "due to a pipeline dependency being destroyed.");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005113 ASSERT_NO_FATAL_FAILURE(InitState());
5114 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5115
5116 VkResult err;
5117
5118 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5119 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5120
5121 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005122 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005123 ASSERT_VK_SUCCESS(err);
5124
5125 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5126 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5127 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005128 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005129 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005130 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005131 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005132 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005133
5134 VkPipelineShaderStageCreateInfo shaderStages[2];
5135 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5136
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005137 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005138 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 -06005139 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005140 shaderStages[0] = vs.GetStageCreateInfo();
5141 shaderStages[1] = fs.GetStageCreateInfo();
5142
5143 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5144 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5145
5146 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5147 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5148 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5149
5150 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5151 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005152 rs_ci.rasterizerDiscardEnable = true;
5153 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005154
5155 VkPipelineColorBlendAttachmentState att = {};
5156 att.blendEnable = VK_FALSE;
5157 att.colorWriteMask = 0xf;
5158
5159 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5160 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5161 cb_ci.attachmentCount = 1;
5162 cb_ci.pAttachments = &att;
5163
5164 VkGraphicsPipelineCreateInfo gp_ci = {};
5165 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5166 gp_ci.stageCount = 2;
5167 gp_ci.pStages = shaderStages;
5168 gp_ci.pVertexInputState = &vi_ci;
5169 gp_ci.pInputAssemblyState = &ia_ci;
5170 gp_ci.pViewportState = &vp_state_ci;
5171 gp_ci.pRasterizationState = &rs_ci;
5172 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005173 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5174 gp_ci.layout = pipeline_layout;
5175 gp_ci.renderPass = renderPass();
5176
5177 VkPipelineCacheCreateInfo pc_ci = {};
5178 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5179
5180 VkPipeline pipeline;
5181 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005182 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005183 ASSERT_VK_SUCCESS(err);
5184
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005185 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005186 ASSERT_VK_SUCCESS(err);
5187
5188 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005189 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005190 m_commandBuffer->EndCommandBuffer();
5191 // Now destroy pipeline in order to cause error when submitting
5192 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5193
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005194 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005195
5196 VkSubmitInfo submit_info = {};
5197 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5198 submit_info.commandBufferCount = 1;
5199 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5200 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5201
5202 m_errorMonitor->VerifyFound();
5203 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5204 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5205}
5206
Tobin Ehlis31289162016-08-17 14:57:58 -06005207TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005208 TEST_DESCRIPTION(
5209 "Attempt to draw with a command buffer that is invalid "
5210 "due to a bound descriptor set with a buffer dependency "
5211 "being destroyed.");
Tobin Ehlis31289162016-08-17 14:57:58 -06005212 ASSERT_NO_FATAL_FAILURE(InitState());
5213 ASSERT_NO_FATAL_FAILURE(InitViewport());
5214 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5215
5216 VkDescriptorPoolSize ds_type_count = {};
5217 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5218 ds_type_count.descriptorCount = 1;
5219
5220 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5221 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5222 ds_pool_ci.pNext = NULL;
5223 ds_pool_ci.maxSets = 1;
5224 ds_pool_ci.poolSizeCount = 1;
5225 ds_pool_ci.pPoolSizes = &ds_type_count;
5226
5227 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005228 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005229 ASSERT_VK_SUCCESS(err);
5230
5231 VkDescriptorSetLayoutBinding dsl_binding = {};
5232 dsl_binding.binding = 0;
5233 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5234 dsl_binding.descriptorCount = 1;
5235 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5236 dsl_binding.pImmutableSamplers = NULL;
5237
5238 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5239 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5240 ds_layout_ci.pNext = NULL;
5241 ds_layout_ci.bindingCount = 1;
5242 ds_layout_ci.pBindings = &dsl_binding;
5243 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005244 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005245 ASSERT_VK_SUCCESS(err);
5246
5247 VkDescriptorSet descriptorSet;
5248 VkDescriptorSetAllocateInfo alloc_info = {};
5249 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5250 alloc_info.descriptorSetCount = 1;
5251 alloc_info.descriptorPool = ds_pool;
5252 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005253 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005254 ASSERT_VK_SUCCESS(err);
5255
5256 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5257 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5258 pipeline_layout_ci.pNext = NULL;
5259 pipeline_layout_ci.setLayoutCount = 1;
5260 pipeline_layout_ci.pSetLayouts = &ds_layout;
5261
5262 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005263 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005264 ASSERT_VK_SUCCESS(err);
5265
5266 // Create a buffer to update the descriptor with
5267 uint32_t qfi = 0;
5268 VkBufferCreateInfo buffCI = {};
5269 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5270 buffCI.size = 1024;
5271 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5272 buffCI.queueFamilyIndexCount = 1;
5273 buffCI.pQueueFamilyIndices = &qfi;
5274
5275 VkBuffer buffer;
5276 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5277 ASSERT_VK_SUCCESS(err);
5278 // Allocate memory and bind to buffer so we can make it to the appropriate
5279 // error
5280 VkMemoryAllocateInfo mem_alloc = {};
5281 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5282 mem_alloc.pNext = NULL;
5283 mem_alloc.allocationSize = 1024;
5284 mem_alloc.memoryTypeIndex = 0;
5285
5286 VkMemoryRequirements memReqs;
5287 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005288 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005289 if (!pass) {
5290 vkDestroyBuffer(m_device->device(), buffer, NULL);
5291 return;
5292 }
5293
5294 VkDeviceMemory mem;
5295 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5296 ASSERT_VK_SUCCESS(err);
5297 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5298 ASSERT_VK_SUCCESS(err);
5299 // Correctly update descriptor to avoid "NOT_UPDATED" error
5300 VkDescriptorBufferInfo buffInfo = {};
5301 buffInfo.buffer = buffer;
5302 buffInfo.offset = 0;
5303 buffInfo.range = 1024;
5304
5305 VkWriteDescriptorSet descriptor_write;
5306 memset(&descriptor_write, 0, sizeof(descriptor_write));
5307 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5308 descriptor_write.dstSet = descriptorSet;
5309 descriptor_write.dstBinding = 0;
5310 descriptor_write.descriptorCount = 1;
5311 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5312 descriptor_write.pBufferInfo = &buffInfo;
5313
5314 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5315
5316 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005317 char const *vsSource =
5318 "#version 450\n"
5319 "\n"
5320 "out gl_PerVertex { \n"
5321 " vec4 gl_Position;\n"
5322 "};\n"
5323 "void main(){\n"
5324 " gl_Position = vec4(1);\n"
5325 "}\n";
5326 char const *fsSource =
5327 "#version 450\n"
5328 "\n"
5329 "layout(location=0) out vec4 x;\n"
5330 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5331 "void main(){\n"
5332 " x = vec4(bar.y);\n"
5333 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005334 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5335 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5336 VkPipelineObj pipe(m_device);
5337 pipe.AddShader(&vs);
5338 pipe.AddShader(&fs);
5339 pipe.AddColorAttachment();
5340 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5341
Tony Barbour552f6c02016-12-21 14:34:07 -07005342 m_commandBuffer->BeginCommandBuffer();
5343 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005344 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5345 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5346 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005347
5348 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5349 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5350
Tobin Ehlis31289162016-08-17 14:57:58 -06005351 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005352 m_commandBuffer->EndRenderPass();
5353 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005354 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005355 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5356 vkDestroyBuffer(m_device->device(), buffer, NULL);
5357 // Attempt to submit cmd buffer
5358 VkSubmitInfo submit_info = {};
5359 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5360 submit_info.commandBufferCount = 1;
5361 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5362 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5363 m_errorMonitor->VerifyFound();
5364 // Cleanup
5365 vkFreeMemory(m_device->device(), mem, NULL);
5366
5367 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5368 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5369 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5370}
5371
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005372TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005373 TEST_DESCRIPTION(
5374 "Attempt to draw with a command buffer that is invalid "
5375 "due to a bound descriptor sets with a combined image "
5376 "sampler having their image, sampler, and descriptor set "
5377 "each respectively destroyed and then attempting to "
5378 "submit associated cmd buffers. Attempt to destroy a "
5379 "DescriptorSet that is in use.");
Rene Lindsayed88b732017-01-27 15:55:29 -07005380 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005381 ASSERT_NO_FATAL_FAILURE(InitViewport());
5382 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5383
5384 VkDescriptorPoolSize ds_type_count = {};
5385 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5386 ds_type_count.descriptorCount = 1;
5387
5388 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5389 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5390 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005391 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005392 ds_pool_ci.maxSets = 1;
5393 ds_pool_ci.poolSizeCount = 1;
5394 ds_pool_ci.pPoolSizes = &ds_type_count;
5395
5396 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005397 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005398 ASSERT_VK_SUCCESS(err);
5399
5400 VkDescriptorSetLayoutBinding dsl_binding = {};
5401 dsl_binding.binding = 0;
5402 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5403 dsl_binding.descriptorCount = 1;
5404 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5405 dsl_binding.pImmutableSamplers = NULL;
5406
5407 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5408 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5409 ds_layout_ci.pNext = NULL;
5410 ds_layout_ci.bindingCount = 1;
5411 ds_layout_ci.pBindings = &dsl_binding;
5412 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005413 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005414 ASSERT_VK_SUCCESS(err);
5415
5416 VkDescriptorSet descriptorSet;
5417 VkDescriptorSetAllocateInfo alloc_info = {};
5418 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5419 alloc_info.descriptorSetCount = 1;
5420 alloc_info.descriptorPool = ds_pool;
5421 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005422 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005423 ASSERT_VK_SUCCESS(err);
5424
5425 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5426 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5427 pipeline_layout_ci.pNext = NULL;
5428 pipeline_layout_ci.setLayoutCount = 1;
5429 pipeline_layout_ci.pSetLayouts = &ds_layout;
5430
5431 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005432 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005433 ASSERT_VK_SUCCESS(err);
5434
5435 // Create images to update the descriptor with
5436 VkImage image;
5437 VkImage image2;
5438 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5439 const int32_t tex_width = 32;
5440 const int32_t tex_height = 32;
5441 VkImageCreateInfo image_create_info = {};
5442 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5443 image_create_info.pNext = NULL;
5444 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5445 image_create_info.format = tex_format;
5446 image_create_info.extent.width = tex_width;
5447 image_create_info.extent.height = tex_height;
5448 image_create_info.extent.depth = 1;
5449 image_create_info.mipLevels = 1;
5450 image_create_info.arrayLayers = 1;
5451 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5452 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5453 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5454 image_create_info.flags = 0;
5455 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5456 ASSERT_VK_SUCCESS(err);
5457 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5458 ASSERT_VK_SUCCESS(err);
5459
5460 VkMemoryRequirements memory_reqs;
5461 VkDeviceMemory image_memory;
5462 bool pass;
5463 VkMemoryAllocateInfo memory_info = {};
5464 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5465 memory_info.pNext = NULL;
5466 memory_info.allocationSize = 0;
5467 memory_info.memoryTypeIndex = 0;
5468 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5469 // Allocate enough memory for both images
5470 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005471 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005472 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005473 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005474 ASSERT_VK_SUCCESS(err);
5475 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5476 ASSERT_VK_SUCCESS(err);
5477 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005478 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005479 ASSERT_VK_SUCCESS(err);
5480
5481 VkImageViewCreateInfo image_view_create_info = {};
5482 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5483 image_view_create_info.image = image;
5484 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5485 image_view_create_info.format = tex_format;
5486 image_view_create_info.subresourceRange.layerCount = 1;
5487 image_view_create_info.subresourceRange.baseMipLevel = 0;
5488 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005489 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005490
5491 VkImageView view;
5492 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005493 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005494 ASSERT_VK_SUCCESS(err);
5495 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005496 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005497 ASSERT_VK_SUCCESS(err);
5498 // Create Samplers
5499 VkSamplerCreateInfo sampler_ci = {};
5500 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5501 sampler_ci.pNext = NULL;
5502 sampler_ci.magFilter = VK_FILTER_NEAREST;
5503 sampler_ci.minFilter = VK_FILTER_NEAREST;
5504 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5505 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5506 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5507 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5508 sampler_ci.mipLodBias = 1.0;
5509 sampler_ci.anisotropyEnable = VK_FALSE;
5510 sampler_ci.maxAnisotropy = 1;
5511 sampler_ci.compareEnable = VK_FALSE;
5512 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5513 sampler_ci.minLod = 1.0;
5514 sampler_ci.maxLod = 1.0;
5515 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5516 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5517 VkSampler sampler;
5518 VkSampler sampler2;
5519 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5520 ASSERT_VK_SUCCESS(err);
5521 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5522 ASSERT_VK_SUCCESS(err);
5523 // Update descriptor with image and sampler
5524 VkDescriptorImageInfo img_info = {};
5525 img_info.sampler = sampler;
5526 img_info.imageView = view;
5527 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5528
5529 VkWriteDescriptorSet descriptor_write;
5530 memset(&descriptor_write, 0, sizeof(descriptor_write));
5531 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5532 descriptor_write.dstSet = descriptorSet;
5533 descriptor_write.dstBinding = 0;
5534 descriptor_write.descriptorCount = 1;
5535 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5536 descriptor_write.pImageInfo = &img_info;
5537
5538 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5539
5540 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005541 char const *vsSource =
5542 "#version 450\n"
5543 "\n"
5544 "out gl_PerVertex { \n"
5545 " vec4 gl_Position;\n"
5546 "};\n"
5547 "void main(){\n"
5548 " gl_Position = vec4(1);\n"
5549 "}\n";
5550 char const *fsSource =
5551 "#version 450\n"
5552 "\n"
5553 "layout(set=0, binding=0) uniform sampler2D s;\n"
5554 "layout(location=0) out vec4 x;\n"
5555 "void main(){\n"
5556 " x = texture(s, vec2(1));\n"
5557 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005558 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5559 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5560 VkPipelineObj pipe(m_device);
5561 pipe.AddShader(&vs);
5562 pipe.AddShader(&fs);
5563 pipe.AddColorAttachment();
5564 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5565
5566 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005567 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted sampler ");
Tony Barbour552f6c02016-12-21 14:34:07 -07005568 m_commandBuffer->BeginCommandBuffer();
5569 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005570 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5571 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5572 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005573 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5574 VkRect2D scissor = {{0, 0}, {16, 16}};
5575 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5576 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005577 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005578 m_commandBuffer->EndRenderPass();
5579 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005580 // Destroy sampler invalidates the cmd buffer, causing error on submit
5581 vkDestroySampler(m_device->device(), sampler, NULL);
5582 // Attempt to submit cmd buffer
5583 VkSubmitInfo submit_info = {};
5584 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5585 submit_info.commandBufferCount = 1;
5586 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5587 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5588 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005589
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005590 // Now re-update descriptor with valid sampler and delete image
5591 img_info.sampler = sampler2;
5592 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005593
5594 VkCommandBufferBeginInfo info = {};
5595 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5596 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5597
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005598 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005599 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005600 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005601 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5602 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5603 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005604 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5605 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005606 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005607 m_commandBuffer->EndRenderPass();
5608 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005609 // Destroy image invalidates the cmd buffer, causing error on submit
5610 vkDestroyImage(m_device->device(), image, NULL);
5611 // Attempt to submit cmd buffer
5612 submit_info = {};
5613 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5614 submit_info.commandBufferCount = 1;
5615 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5616 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5617 m_errorMonitor->VerifyFound();
5618 // Now update descriptor to be valid, but then free descriptor
5619 img_info.imageView = view2;
5620 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005621 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005622 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005623 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5624 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5625 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005626 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5627 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005628 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005629 m_commandBuffer->EndRenderPass();
5630 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07005631 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07005632
5633 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005635 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06005636 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07005637
5638 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07005639 // 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 -07005640 vkQueueWaitIdle(m_device->m_queue);
5641 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
5642
5643 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005644 submit_info = {};
5645 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5646 submit_info.commandBufferCount = 1;
5647 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07005648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005649 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5650 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07005651
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005652 // Cleanup
5653 vkFreeMemory(m_device->device(), image_memory, NULL);
5654 vkDestroySampler(m_device->device(), sampler2, NULL);
5655 vkDestroyImage(m_device->device(), image2, NULL);
5656 vkDestroyImageView(m_device->device(), view, NULL);
5657 vkDestroyImageView(m_device->device(), view2, NULL);
5658 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5659 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5660 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5661}
5662
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005663TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
5664 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
5665 ASSERT_NO_FATAL_FAILURE(InitState());
5666 ASSERT_NO_FATAL_FAILURE(InitViewport());
5667 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5668
5669 VkDescriptorPoolSize ds_type_count = {};
5670 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5671 ds_type_count.descriptorCount = 1;
5672
5673 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5674 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5675 ds_pool_ci.pNext = NULL;
5676 ds_pool_ci.maxSets = 1;
5677 ds_pool_ci.poolSizeCount = 1;
5678 ds_pool_ci.pPoolSizes = &ds_type_count;
5679
5680 VkDescriptorPool ds_pool;
5681 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5682 ASSERT_VK_SUCCESS(err);
5683
5684 VkDescriptorSetLayoutBinding dsl_binding = {};
5685 dsl_binding.binding = 0;
5686 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5687 dsl_binding.descriptorCount = 1;
5688 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5689 dsl_binding.pImmutableSamplers = NULL;
5690
5691 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5692 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5693 ds_layout_ci.pNext = NULL;
5694 ds_layout_ci.bindingCount = 1;
5695 ds_layout_ci.pBindings = &dsl_binding;
5696 VkDescriptorSetLayout ds_layout;
5697 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
5698 ASSERT_VK_SUCCESS(err);
5699
5700 VkDescriptorSet descriptor_set;
5701 VkDescriptorSetAllocateInfo alloc_info = {};
5702 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5703 alloc_info.descriptorSetCount = 1;
5704 alloc_info.descriptorPool = ds_pool;
5705 alloc_info.pSetLayouts = &ds_layout;
5706 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
5707 ASSERT_VK_SUCCESS(err);
5708
5709 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5710 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5711 pipeline_layout_ci.pNext = NULL;
5712 pipeline_layout_ci.setLayoutCount = 1;
5713 pipeline_layout_ci.pSetLayouts = &ds_layout;
5714
5715 VkPipelineLayout pipeline_layout;
5716 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5717 ASSERT_VK_SUCCESS(err);
5718
5719 // Create image to update the descriptor with
5720 VkImageObj image(m_device);
5721 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5722 ASSERT_TRUE(image.initialized());
5723
5724 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5725 // Create Sampler
5726 VkSamplerCreateInfo sampler_ci = {};
5727 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5728 sampler_ci.pNext = NULL;
5729 sampler_ci.magFilter = VK_FILTER_NEAREST;
5730 sampler_ci.minFilter = VK_FILTER_NEAREST;
5731 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5732 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5733 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5734 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5735 sampler_ci.mipLodBias = 1.0;
5736 sampler_ci.anisotropyEnable = VK_FALSE;
5737 sampler_ci.maxAnisotropy = 1;
5738 sampler_ci.compareEnable = VK_FALSE;
5739 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5740 sampler_ci.minLod = 1.0;
5741 sampler_ci.maxLod = 1.0;
5742 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5743 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5744 VkSampler sampler;
5745 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5746 ASSERT_VK_SUCCESS(err);
5747 // Update descriptor with image and sampler
5748 VkDescriptorImageInfo img_info = {};
5749 img_info.sampler = sampler;
5750 img_info.imageView = view;
5751 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5752
5753 VkWriteDescriptorSet descriptor_write;
5754 memset(&descriptor_write, 0, sizeof(descriptor_write));
5755 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5756 descriptor_write.dstSet = descriptor_set;
5757 descriptor_write.dstBinding = 0;
5758 descriptor_write.descriptorCount = 1;
5759 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5760 descriptor_write.pImageInfo = &img_info;
5761
5762 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5763
5764 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005765 char const *vsSource =
5766 "#version 450\n"
5767 "\n"
5768 "out gl_PerVertex { \n"
5769 " vec4 gl_Position;\n"
5770 "};\n"
5771 "void main(){\n"
5772 " gl_Position = vec4(1);\n"
5773 "}\n";
5774 char const *fsSource =
5775 "#version 450\n"
5776 "\n"
5777 "layout(set=0, binding=0) uniform sampler2D s;\n"
5778 "layout(location=0) out vec4 x;\n"
5779 "void main(){\n"
5780 " x = texture(s, vec2(1));\n"
5781 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005782 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5783 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5784 VkPipelineObj pipe(m_device);
5785 pipe.AddShader(&vs);
5786 pipe.AddShader(&fs);
5787 pipe.AddColorAttachment();
5788 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5789
Tony Barbour552f6c02016-12-21 14:34:07 -07005790 m_commandBuffer->BeginCommandBuffer();
5791 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005792 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5793 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5794 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07005795
5796 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5797 VkRect2D scissor = {{0, 0}, {16, 16}};
5798 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5799 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
5800
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005801 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005802 m_commandBuffer->EndRenderPass();
5803 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005804 // Submit cmd buffer to put pool in-flight
5805 VkSubmitInfo submit_info = {};
5806 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5807 submit_info.commandBufferCount = 1;
5808 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5809 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5810 // Destroy pool while in-flight, causing error
5811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
5812 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5813 m_errorMonitor->VerifyFound();
5814 vkQueueWaitIdle(m_device->m_queue);
5815 // Cleanup
5816 vkDestroySampler(m_device->device(), sampler, NULL);
5817 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5818 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5819 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07005820 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005821}
5822
Tobin Ehlis50a095d2016-09-21 17:32:49 -06005823TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
5824 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
5825 ASSERT_NO_FATAL_FAILURE(InitState());
5826 ASSERT_NO_FATAL_FAILURE(InitViewport());
5827 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5828
5829 VkDescriptorPoolSize ds_type_count = {};
5830 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5831 ds_type_count.descriptorCount = 1;
5832
5833 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5834 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5835 ds_pool_ci.pNext = NULL;
5836 ds_pool_ci.maxSets = 1;
5837 ds_pool_ci.poolSizeCount = 1;
5838 ds_pool_ci.pPoolSizes = &ds_type_count;
5839
5840 VkDescriptorPool ds_pool;
5841 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5842 ASSERT_VK_SUCCESS(err);
5843
5844 VkDescriptorSetLayoutBinding dsl_binding = {};
5845 dsl_binding.binding = 0;
5846 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5847 dsl_binding.descriptorCount = 1;
5848 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5849 dsl_binding.pImmutableSamplers = NULL;
5850
5851 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5852 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5853 ds_layout_ci.pNext = NULL;
5854 ds_layout_ci.bindingCount = 1;
5855 ds_layout_ci.pBindings = &dsl_binding;
5856 VkDescriptorSetLayout ds_layout;
5857 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
5858 ASSERT_VK_SUCCESS(err);
5859
5860 VkDescriptorSet descriptorSet;
5861 VkDescriptorSetAllocateInfo alloc_info = {};
5862 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5863 alloc_info.descriptorSetCount = 1;
5864 alloc_info.descriptorPool = ds_pool;
5865 alloc_info.pSetLayouts = &ds_layout;
5866 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
5867 ASSERT_VK_SUCCESS(err);
5868
5869 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5870 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5871 pipeline_layout_ci.pNext = NULL;
5872 pipeline_layout_ci.setLayoutCount = 1;
5873 pipeline_layout_ci.pSetLayouts = &ds_layout;
5874
5875 VkPipelineLayout pipeline_layout;
5876 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5877 ASSERT_VK_SUCCESS(err);
5878
5879 // Create images to update the descriptor with
5880 VkImage image;
5881 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5882 const int32_t tex_width = 32;
5883 const int32_t tex_height = 32;
5884 VkImageCreateInfo image_create_info = {};
5885 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5886 image_create_info.pNext = NULL;
5887 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5888 image_create_info.format = tex_format;
5889 image_create_info.extent.width = tex_width;
5890 image_create_info.extent.height = tex_height;
5891 image_create_info.extent.depth = 1;
5892 image_create_info.mipLevels = 1;
5893 image_create_info.arrayLayers = 1;
5894 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5895 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5896 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5897 image_create_info.flags = 0;
5898 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5899 ASSERT_VK_SUCCESS(err);
5900 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
5901 VkMemoryRequirements memory_reqs;
5902 VkDeviceMemory image_memory;
5903 bool pass;
5904 VkMemoryAllocateInfo memory_info = {};
5905 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5906 memory_info.pNext = NULL;
5907 memory_info.allocationSize = 0;
5908 memory_info.memoryTypeIndex = 0;
5909 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5910 // Allocate enough memory for image
5911 memory_info.allocationSize = memory_reqs.size;
5912 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5913 ASSERT_TRUE(pass);
5914 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5915 ASSERT_VK_SUCCESS(err);
5916 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5917 ASSERT_VK_SUCCESS(err);
5918
5919 VkImageViewCreateInfo image_view_create_info = {};
5920 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5921 image_view_create_info.image = image;
5922 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5923 image_view_create_info.format = tex_format;
5924 image_view_create_info.subresourceRange.layerCount = 1;
5925 image_view_create_info.subresourceRange.baseMipLevel = 0;
5926 image_view_create_info.subresourceRange.levelCount = 1;
5927 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5928
5929 VkImageView view;
5930 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
5931 ASSERT_VK_SUCCESS(err);
5932 // Create Samplers
5933 VkSamplerCreateInfo sampler_ci = {};
5934 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5935 sampler_ci.pNext = NULL;
5936 sampler_ci.magFilter = VK_FILTER_NEAREST;
5937 sampler_ci.minFilter = VK_FILTER_NEAREST;
5938 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5939 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5940 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5941 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5942 sampler_ci.mipLodBias = 1.0;
5943 sampler_ci.anisotropyEnable = VK_FALSE;
5944 sampler_ci.maxAnisotropy = 1;
5945 sampler_ci.compareEnable = VK_FALSE;
5946 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5947 sampler_ci.minLod = 1.0;
5948 sampler_ci.maxLod = 1.0;
5949 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5950 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5951 VkSampler sampler;
5952 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5953 ASSERT_VK_SUCCESS(err);
5954 // Update descriptor with image and sampler
5955 VkDescriptorImageInfo img_info = {};
5956 img_info.sampler = sampler;
5957 img_info.imageView = view;
5958 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5959
5960 VkWriteDescriptorSet descriptor_write;
5961 memset(&descriptor_write, 0, sizeof(descriptor_write));
5962 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5963 descriptor_write.dstSet = descriptorSet;
5964 descriptor_write.dstBinding = 0;
5965 descriptor_write.descriptorCount = 1;
5966 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5967 descriptor_write.pImageInfo = &img_info;
5968 // Break memory binding and attempt update
5969 vkFreeMemory(m_device->device(), image_memory, nullptr);
5970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005971 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06005972 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5973 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
5974 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5975 m_errorMonitor->VerifyFound();
5976 // Cleanup
5977 vkDestroyImage(m_device->device(), image, NULL);
5978 vkDestroySampler(m_device->device(), sampler, NULL);
5979 vkDestroyImageView(m_device->device(), view, NULL);
5980 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5981 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5982 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5983}
5984
Karl Schultz6addd812016-02-02 17:17:23 -07005985TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06005986 // Attempt to bind an invalid Pipeline to a valid Command Buffer
5987 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005988 // Create a valid cmd buffer
5989 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06005990 uint64_t fake_pipeline_handle = 0xbaad6001;
5991 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06005992 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005993 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5994
Karl Schultzf78bcdd2016-11-30 12:36:01 -07005995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07005996 m_commandBuffer->BeginCommandBuffer();
5997 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005998 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06005999 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006000
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006001 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006002 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 -06006003 Draw(1, 0, 0, 0);
6004 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006005
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006006 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006007 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 -07006008 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006009 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6010 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006011}
6012
Karl Schultz6addd812016-02-02 17:17:23 -07006013TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006014 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006015 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006016
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006017 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006018
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006019 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006020 ASSERT_NO_FATAL_FAILURE(InitViewport());
6021 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006022 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006023 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6024 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006025
6026 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006027 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6028 ds_pool_ci.pNext = NULL;
6029 ds_pool_ci.maxSets = 1;
6030 ds_pool_ci.poolSizeCount = 1;
6031 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006032
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006033 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006034 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006035 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006036
Tony Barboureb254902015-07-15 12:50:33 -06006037 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006038 dsl_binding.binding = 0;
6039 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6040 dsl_binding.descriptorCount = 1;
6041 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6042 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006043
Tony Barboureb254902015-07-15 12:50:33 -06006044 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006045 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6046 ds_layout_ci.pNext = NULL;
6047 ds_layout_ci.bindingCount = 1;
6048 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006049 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006050 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006051 ASSERT_VK_SUCCESS(err);
6052
6053 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006054 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006055 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006056 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006057 alloc_info.descriptorPool = ds_pool;
6058 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006059 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006060 ASSERT_VK_SUCCESS(err);
6061
Tony Barboureb254902015-07-15 12:50:33 -06006062 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006063 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6064 pipeline_layout_ci.pNext = NULL;
6065 pipeline_layout_ci.setLayoutCount = 1;
6066 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006067
6068 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006069 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006070 ASSERT_VK_SUCCESS(err);
6071
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006072 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006073 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006074 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006075 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006076
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006077 VkPipelineObj pipe(m_device);
6078 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006079 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006080 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006081 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006082
Tony Barbour552f6c02016-12-21 14:34:07 -07006083 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006084 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6085 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6086 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006087
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006088 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006089
Chia-I Wuf7458c52015-10-26 21:10:41 +08006090 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6091 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6092 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006093}
6094
Karl Schultz6addd812016-02-02 17:17:23 -07006095TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006096 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006097 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006098
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006099 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006100
6101 ASSERT_NO_FATAL_FAILURE(InitState());
6102 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006103 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6104 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006105
6106 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006107 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6108 ds_pool_ci.pNext = NULL;
6109 ds_pool_ci.maxSets = 1;
6110 ds_pool_ci.poolSizeCount = 1;
6111 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006112
6113 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006114 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006115 ASSERT_VK_SUCCESS(err);
6116
6117 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006118 dsl_binding.binding = 0;
6119 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6120 dsl_binding.descriptorCount = 1;
6121 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6122 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006123
6124 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006125 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6126 ds_layout_ci.pNext = NULL;
6127 ds_layout_ci.bindingCount = 1;
6128 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006129 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006130 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006131 ASSERT_VK_SUCCESS(err);
6132
6133 VkDescriptorSet descriptorSet;
6134 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006135 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006136 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006137 alloc_info.descriptorPool = ds_pool;
6138 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006139 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006140 ASSERT_VK_SUCCESS(err);
6141
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006142 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006143 VkWriteDescriptorSet descriptor_write;
6144 memset(&descriptor_write, 0, sizeof(descriptor_write));
6145 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6146 descriptor_write.dstSet = descriptorSet;
6147 descriptor_write.dstBinding = 0;
6148 descriptor_write.descriptorCount = 1;
6149 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6150 descriptor_write.pTexelBufferView = &view;
6151
6152 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6153
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006154 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006155
6156 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6157 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6158}
6159
Mark Youngd339ba32016-05-30 13:28:35 -06006160TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006161 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 -06006162
6163 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006165 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006166
6167 ASSERT_NO_FATAL_FAILURE(InitState());
6168
6169 // Create a buffer with no bound memory and then attempt to create
6170 // a buffer view.
6171 VkBufferCreateInfo buff_ci = {};
6172 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006173 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006174 buff_ci.size = 256;
6175 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6176 VkBuffer buffer;
6177 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6178 ASSERT_VK_SUCCESS(err);
6179
6180 VkBufferViewCreateInfo buff_view_ci = {};
6181 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6182 buff_view_ci.buffer = buffer;
6183 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6184 buff_view_ci.range = VK_WHOLE_SIZE;
6185 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006186 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006187
6188 m_errorMonitor->VerifyFound();
6189 vkDestroyBuffer(m_device->device(), buffer, NULL);
6190 // If last error is success, it still created the view, so delete it.
6191 if (err == VK_SUCCESS) {
6192 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6193 }
6194}
6195
Karl Schultz6addd812016-02-02 17:17:23 -07006196TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6197 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6198 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006199 // 1. No dynamicOffset supplied
6200 // 2. Too many dynamicOffsets supplied
6201 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006202 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6204 " requires 1 dynamicOffsets, but only "
6205 "0 dynamicOffsets are left in "
6206 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006207
6208 ASSERT_NO_FATAL_FAILURE(InitState());
6209 ASSERT_NO_FATAL_FAILURE(InitViewport());
6210 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6211
6212 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006213 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6214 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006215
6216 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006217 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6218 ds_pool_ci.pNext = NULL;
6219 ds_pool_ci.maxSets = 1;
6220 ds_pool_ci.poolSizeCount = 1;
6221 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006222
6223 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006224 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006225 ASSERT_VK_SUCCESS(err);
6226
6227 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006228 dsl_binding.binding = 0;
6229 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6230 dsl_binding.descriptorCount = 1;
6231 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6232 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006233
6234 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006235 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6236 ds_layout_ci.pNext = NULL;
6237 ds_layout_ci.bindingCount = 1;
6238 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006239 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006240 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006241 ASSERT_VK_SUCCESS(err);
6242
6243 VkDescriptorSet descriptorSet;
6244 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006245 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006246 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006247 alloc_info.descriptorPool = ds_pool;
6248 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006249 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006250 ASSERT_VK_SUCCESS(err);
6251
6252 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006253 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6254 pipeline_layout_ci.pNext = NULL;
6255 pipeline_layout_ci.setLayoutCount = 1;
6256 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006257
6258 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006259 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006260 ASSERT_VK_SUCCESS(err);
6261
6262 // Create a buffer to update the descriptor with
6263 uint32_t qfi = 0;
6264 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006265 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6266 buffCI.size = 1024;
6267 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6268 buffCI.queueFamilyIndexCount = 1;
6269 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006270
6271 VkBuffer dyub;
6272 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6273 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006274 // Allocate memory and bind to buffer so we can make it to the appropriate
6275 // error
6276 VkMemoryAllocateInfo mem_alloc = {};
6277 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6278 mem_alloc.pNext = NULL;
6279 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006280 mem_alloc.memoryTypeIndex = 0;
6281
6282 VkMemoryRequirements memReqs;
6283 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006284 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006285 if (!pass) {
6286 vkDestroyBuffer(m_device->device(), dyub, NULL);
6287 return;
6288 }
6289
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006290 VkDeviceMemory mem;
6291 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6292 ASSERT_VK_SUCCESS(err);
6293 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6294 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006295 // Correctly update descriptor to avoid "NOT_UPDATED" error
6296 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006297 buffInfo.buffer = dyub;
6298 buffInfo.offset = 0;
6299 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006300
6301 VkWriteDescriptorSet descriptor_write;
6302 memset(&descriptor_write, 0, sizeof(descriptor_write));
6303 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6304 descriptor_write.dstSet = descriptorSet;
6305 descriptor_write.dstBinding = 0;
6306 descriptor_write.descriptorCount = 1;
6307 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6308 descriptor_write.pBufferInfo = &buffInfo;
6309
6310 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6311
Tony Barbour552f6c02016-12-21 14:34:07 -07006312 m_commandBuffer->BeginCommandBuffer();
6313 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006314 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6315 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006316 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006317 uint32_t pDynOff[2] = {512, 756};
6318 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6320 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6321 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6322 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006323 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006324 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006325 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6326 " dynamic offset 512 combined with "
6327 "offset 0 and range 1024 that "
6328 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006329 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006330 char const *vsSource =
6331 "#version 450\n"
6332 "\n"
6333 "out gl_PerVertex { \n"
6334 " vec4 gl_Position;\n"
6335 "};\n"
6336 "void main(){\n"
6337 " gl_Position = vec4(1);\n"
6338 "}\n";
6339 char const *fsSource =
6340 "#version 450\n"
6341 "\n"
6342 "layout(location=0) out vec4 x;\n"
6343 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6344 "void main(){\n"
6345 " x = vec4(bar.y);\n"
6346 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006347 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6348 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6349 VkPipelineObj pipe(m_device);
6350 pipe.AddShader(&vs);
6351 pipe.AddShader(&fs);
6352 pipe.AddColorAttachment();
6353 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6354
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006355 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6356 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6357 VkRect2D scissor = {{0, 0}, {16, 16}};
6358 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6359
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006360 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006361 // This update should succeed, but offset size of 512 will overstep buffer
6362 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006363 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6364 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006365 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006366 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006367
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006368 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006369 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006370
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006371 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006372 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006373 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6374}
6375
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006376TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006377 TEST_DESCRIPTION(
6378 "Attempt to update a descriptor with a non-sparse buffer "
6379 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006380 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006381 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006382 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6384 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006385
6386 ASSERT_NO_FATAL_FAILURE(InitState());
6387 ASSERT_NO_FATAL_FAILURE(InitViewport());
6388 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6389
6390 VkDescriptorPoolSize ds_type_count = {};
6391 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6392 ds_type_count.descriptorCount = 1;
6393
6394 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6395 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6396 ds_pool_ci.pNext = NULL;
6397 ds_pool_ci.maxSets = 1;
6398 ds_pool_ci.poolSizeCount = 1;
6399 ds_pool_ci.pPoolSizes = &ds_type_count;
6400
6401 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006402 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006403 ASSERT_VK_SUCCESS(err);
6404
6405 VkDescriptorSetLayoutBinding dsl_binding = {};
6406 dsl_binding.binding = 0;
6407 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6408 dsl_binding.descriptorCount = 1;
6409 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6410 dsl_binding.pImmutableSamplers = NULL;
6411
6412 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6413 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6414 ds_layout_ci.pNext = NULL;
6415 ds_layout_ci.bindingCount = 1;
6416 ds_layout_ci.pBindings = &dsl_binding;
6417 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006418 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006419 ASSERT_VK_SUCCESS(err);
6420
6421 VkDescriptorSet descriptorSet;
6422 VkDescriptorSetAllocateInfo alloc_info = {};
6423 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6424 alloc_info.descriptorSetCount = 1;
6425 alloc_info.descriptorPool = ds_pool;
6426 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006427 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006428 ASSERT_VK_SUCCESS(err);
6429
6430 // Create a buffer to update the descriptor with
6431 uint32_t qfi = 0;
6432 VkBufferCreateInfo buffCI = {};
6433 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6434 buffCI.size = 1024;
6435 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6436 buffCI.queueFamilyIndexCount = 1;
6437 buffCI.pQueueFamilyIndices = &qfi;
6438
6439 VkBuffer dyub;
6440 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6441 ASSERT_VK_SUCCESS(err);
6442
6443 // Attempt to update descriptor without binding memory to it
6444 VkDescriptorBufferInfo buffInfo = {};
6445 buffInfo.buffer = dyub;
6446 buffInfo.offset = 0;
6447 buffInfo.range = 1024;
6448
6449 VkWriteDescriptorSet descriptor_write;
6450 memset(&descriptor_write, 0, sizeof(descriptor_write));
6451 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6452 descriptor_write.dstSet = descriptorSet;
6453 descriptor_write.dstBinding = 0;
6454 descriptor_write.descriptorCount = 1;
6455 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6456 descriptor_write.pBufferInfo = &buffInfo;
6457
6458 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6459 m_errorMonitor->VerifyFound();
6460
6461 vkDestroyBuffer(m_device->device(), dyub, NULL);
6462 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6463 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6464}
6465
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006466TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006467 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006468 ASSERT_NO_FATAL_FAILURE(InitState());
6469 ASSERT_NO_FATAL_FAILURE(InitViewport());
6470 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6471
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006472 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006473 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006474 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6475 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6476 pipeline_layout_ci.pushConstantRangeCount = 1;
6477 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6478
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006479 //
6480 // Check for invalid push constant ranges in pipeline layouts.
6481 //
6482 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006483 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006484 char const *msg;
6485 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006486
Karl Schultzc81037d2016-05-12 08:11:23 -06006487 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6488 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6489 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6490 "vkCreatePipelineLayout() call has push constants index 0 with "
6491 "size 0."},
6492 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6493 "vkCreatePipelineLayout() call has push constants index 0 with "
6494 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006495 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006496 "vkCreatePipelineLayout() call has push constants index 0 with "
6497 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006498 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006499 "vkCreatePipelineLayout() call has push constants index 0 with "
6500 "size 0."},
6501 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6502 "vkCreatePipelineLayout() call has push constants index 0 with "
6503 "offset 1. Offset must"},
6504 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6505 "vkCreatePipelineLayout() call has push constants index 0 "
6506 "with offset "},
6507 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6508 "vkCreatePipelineLayout() call has push constants "
6509 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006510 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006511 "vkCreatePipelineLayout() call has push constants index 0 "
6512 "with offset "},
6513 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6514 "vkCreatePipelineLayout() call has push "
6515 "constants index 0 with offset "},
6516 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6517 "vkCreatePipelineLayout() call has push "
6518 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006519 }};
6520
6521 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006522 for (const auto &iter : range_tests) {
6523 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006524 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6525 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006526 m_errorMonitor->VerifyFound();
6527 if (VK_SUCCESS == err) {
6528 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6529 }
6530 }
6531
6532 // Check for invalid stage flag
6533 pc_range.offset = 0;
6534 pc_range.size = 16;
6535 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006536 m_errorMonitor->SetDesiredFailureMsg(
6537 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6538 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006539 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006540 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006541 if (VK_SUCCESS == err) {
6542 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6543 }
6544
6545 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06006546 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006547 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006548 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006549 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006550 };
6551
Karl Schultzc81037d2016-05-12 08:11:23 -06006552 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006553 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6554 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6555 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6556 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6557 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006558 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[0, 4), 1:[0, 4)",
6559 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[0, 4), 2:[0, 4)",
6560 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[0, 4), 3:[0, 4)",
6561 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[0, 4), 4:[0, 4)",
6562 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 1:[0, 4), 2:[0, 4)",
6563 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 1:[0, 4), 3:[0, 4)",
6564 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 1:[0, 4), 4:[0, 4)",
6565 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 2:[0, 4), 3:[0, 4)",
6566 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 2:[0, 4), 4:[0, 4)",
6567 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 3:[0, 4), 4:[0, 4)"}},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006568 {
6569 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6570 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6571 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6572 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6573 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006574 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 3:[12, 20), 4:[16, 20)"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006575 },
6576 {
6577 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6578 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6579 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6580 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6581 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006582 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 1:[12, 20)"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006583 },
6584 {
6585 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6586 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6587 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6588 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6589 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006590 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 3:[12, 20)"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006591 },
6592 {
6593 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6594 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
6595 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
6596 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
6597 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006598 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 2:[4, 100)",
6599 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 1:[32, 36), 2:[4, 100)",
6600 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 2:[4, 100), 3:[40, 48)",
6601 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 2:[4, 100), 4:[52, 56)"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006602 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006603
Karl Schultzc81037d2016-05-12 08:11:23 -06006604 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006605 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006606 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006608 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006609 m_errorMonitor->VerifyFound();
6610 if (VK_SUCCESS == err) {
6611 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6612 }
6613 }
6614
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006615 //
6616 // CmdPushConstants tests
6617 //
Karl Schultzc81037d2016-05-12 08:11:23 -06006618 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006619
6620 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006621 const std::array<PipelineLayoutTestCase, 11> cmd_range_tests = {{
6622 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "vkCmdPushConstants: parameter size must be greater than 0"},
Karl Schultzc81037d2016-05-12 08:11:23 -06006623 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
Dave Houlton197211a2016-12-23 15:26:29 -07006624 "vkCmdPushConstants() call has push constants index 0 with size 1. "
6625 "Size must be a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006626 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Dave Houlton197211a2016-12-23 15:26:29 -07006627 "vkCmdPushConstants() call has push constants index 0 with size 1. "
6628 "Size must be a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006629 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006630 "vkCmdPushConstants() call has push constants with offset 1. "
6631 "Offset must be a multiple of 4."},
6632 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6633 "vkCmdPushConstants() call has push constants with offset 1. "
6634 "Offset must be a multiple of 4."},
6635 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
6636 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
6637 "0x1 not within flag-matching ranges in pipeline layout"},
6638 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
6639 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
6640 "0x1 not within flag-matching ranges in pipeline layout"},
6641 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
6642 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
6643 "0x1 not within flag-matching ranges in pipeline layout"},
6644 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
6645 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
6646 "0x1 not within flag-matching ranges in pipeline layout"},
6647 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6648 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
6649 "any of the ranges in pipeline layout"},
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006650 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06006651 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
6652 "any of the ranges in pipeline layout"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006653 }};
6654
Tony Barbour552f6c02016-12-21 14:34:07 -07006655 m_commandBuffer->BeginCommandBuffer();
6656 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006657
6658 // Setup ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06006659 const VkPushConstantRange pc_range2[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006660 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006661 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006662 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006663 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006664 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006665 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06006666 for (const auto &iter : cmd_range_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6668 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06006669 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006670 m_errorMonitor->VerifyFound();
6671 }
6672
6673 // Check for invalid stage flag
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006675 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006676 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06006677 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006678
Karl Schultzc81037d2016-05-12 08:11:23 -06006679 // overlapping range tests with cmd
6680 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
6681 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
6682 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
6683 "0x1 not within flag-matching ranges in pipeline layout"},
6684 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6685 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
6686 "0x1 not within flag-matching ranges in pipeline layout"},
6687 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
6688 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
6689 "0x1 not within flag-matching ranges in pipeline layout"},
6690 }};
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006691 // Setup ranges: [0,16), [20,36), [36,44), [44,52), [80,92)
Karl Schultzc81037d2016-05-12 08:11:23 -06006692 const VkPushConstantRange pc_range3[] = {
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006693 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
6694 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12}, {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
Karl Schultzc81037d2016-05-12 08:11:23 -06006695 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006696 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range3) / sizeof(VkPushConstantRange);
Karl Schultzc81037d2016-05-12 08:11:23 -06006697 pipeline_layout_ci.pPushConstantRanges = pc_range3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006698 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzc81037d2016-05-12 08:11:23 -06006699 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06006700 for (const auto &iter : cmd_overlap_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006701 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6702 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06006703 iter.range.size, dummy_values);
6704 m_errorMonitor->VerifyFound();
6705 }
Karl Schultzc81037d2016-05-12 08:11:23 -06006706 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6707
Tony Barbour552f6c02016-12-21 14:34:07 -07006708 m_commandBuffer->EndRenderPass();
6709 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006710}
6711
Karl Schultz6addd812016-02-02 17:17:23 -07006712TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07006713 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07006714 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006715
6716 ASSERT_NO_FATAL_FAILURE(InitState());
6717 ASSERT_NO_FATAL_FAILURE(InitViewport());
6718 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6719
6720 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
6721 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006722 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6723 ds_type_count[0].descriptorCount = 10;
6724 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6725 ds_type_count[1].descriptorCount = 2;
6726 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
6727 ds_type_count[2].descriptorCount = 2;
6728 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
6729 ds_type_count[3].descriptorCount = 5;
6730 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
6731 // type
6732 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6733 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
6734 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006735
6736 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006737 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6738 ds_pool_ci.pNext = NULL;
6739 ds_pool_ci.maxSets = 5;
6740 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
6741 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006742
6743 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006744 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006745 ASSERT_VK_SUCCESS(err);
6746
6747 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
6748 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006749 dsl_binding[0].binding = 0;
6750 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6751 dsl_binding[0].descriptorCount = 5;
6752 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6753 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006754
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006755 // Create layout identical to set0 layout but w/ different stageFlags
6756 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006757 dsl_fs_stage_only.binding = 0;
6758 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6759 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006760 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
6761 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07006762 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006763 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006764 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6765 ds_layout_ci.pNext = NULL;
6766 ds_layout_ci.bindingCount = 1;
6767 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006768 static const uint32_t NUM_LAYOUTS = 4;
6769 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006770 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006771 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
6772 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006773 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006774 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006775 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006776 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006777 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006778 dsl_binding[0].binding = 0;
6779 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006780 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006781 dsl_binding[1].binding = 1;
6782 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
6783 dsl_binding[1].descriptorCount = 2;
6784 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
6785 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006786 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006787 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006788 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006789 ASSERT_VK_SUCCESS(err);
6790 dsl_binding[0].binding = 0;
6791 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006792 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006793 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006794 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006795 ASSERT_VK_SUCCESS(err);
6796 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006797 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006798 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006799 ASSERT_VK_SUCCESS(err);
6800
6801 static const uint32_t NUM_SETS = 4;
6802 VkDescriptorSet descriptorSet[NUM_SETS] = {};
6803 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006804 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006805 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006806 alloc_info.descriptorPool = ds_pool;
6807 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006808 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006809 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006810 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07006811 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006812 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006813 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006814 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006815
6816 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006817 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6818 pipeline_layout_ci.pNext = NULL;
6819 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
6820 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006821
6822 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006823 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006824 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006825 // Create pipelineLayout with only one setLayout
6826 pipeline_layout_ci.setLayoutCount = 1;
6827 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006828 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006829 ASSERT_VK_SUCCESS(err);
6830 // Create pipelineLayout with 2 descriptor setLayout at index 0
6831 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
6832 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006833 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006834 ASSERT_VK_SUCCESS(err);
6835 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
6836 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
6837 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006838 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006839 ASSERT_VK_SUCCESS(err);
6840 // Create pipelineLayout with UB type, but stageFlags for FS only
6841 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
6842 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006843 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006844 ASSERT_VK_SUCCESS(err);
6845 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
6846 VkDescriptorSetLayout pl_bad_s0[2] = {};
6847 pl_bad_s0[0] = ds_layout_fs_only;
6848 pl_bad_s0[1] = ds_layout[1];
6849 pipeline_layout_ci.setLayoutCount = 2;
6850 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
6851 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006852 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006853 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006854
Tobin Ehlis88452832015-12-03 09:40:56 -07006855 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006856 char const *vsSource =
6857 "#version 450\n"
6858 "\n"
6859 "out gl_PerVertex {\n"
6860 " vec4 gl_Position;\n"
6861 "};\n"
6862 "void main(){\n"
6863 " gl_Position = vec4(1);\n"
6864 "}\n";
6865 char const *fsSource =
6866 "#version 450\n"
6867 "\n"
6868 "layout(location=0) out vec4 x;\n"
6869 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6870 "void main(){\n"
6871 " x = vec4(bar.y);\n"
6872 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07006873 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6874 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006875 VkPipelineObj pipe(m_device);
6876 pipe.AddShader(&vs);
6877 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07006878 pipe.AddColorAttachment();
6879 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07006880
Tony Barbour552f6c02016-12-21 14:34:07 -07006881 m_commandBuffer->BeginCommandBuffer();
6882 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07006883
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006884 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006885 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
6886 // of PSO
6887 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
6888 // cmd_pipeline.c
6889 // due to the fact that cmd_alloc_dset_data() has not been called in
6890 // cmd_bind_graphics_pipeline()
6891 // TODO : Want to cause various binding incompatibility issues here to test
6892 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07006893 // First cause various verify_layout_compatibility() fails
6894 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006895 // verify_set_layout_compatibility fail cases:
6896 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006898 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
6899 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006900 m_errorMonitor->VerifyFound();
6901
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006902 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
6904 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
6905 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006906 m_errorMonitor->VerifyFound();
6907
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006908 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07006909 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
6910 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
6912 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
6913 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006914 m_errorMonitor->VerifyFound();
6915
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006916 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
6917 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
6919 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
6920 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006921 m_errorMonitor->VerifyFound();
6922
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006923 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
6924 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6926 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
6927 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
6928 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006929 m_errorMonitor->VerifyFound();
6930
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006931 // Cause INFO messages due to disturbing previously bound Sets
6932 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006933 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6934 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006935 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006936 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
6937 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
6938 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006939 m_errorMonitor->VerifyFound();
6940
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006941 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6942 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006943 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6945 " newly bound as set #0 so set #1 and "
6946 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006947 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
6948 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006949 m_errorMonitor->VerifyFound();
6950
Tobin Ehlis10fad692016-07-07 12:00:36 -06006951 // Now that we're done actively using the pipelineLayout that gfx pipeline
6952 // was created with, we should be able to delete it. Do that now to verify
6953 // that validation obeys pipelineLayout lifetime
6954 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
6955
Tobin Ehlis88452832015-12-03 09:40:56 -07006956 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07006957 // 1. Error due to not binding required set (we actually use same code as
6958 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006959 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6960 &descriptorSet[0], 0, NULL);
6961 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
6962 &descriptorSet[1], 0, NULL);
6963 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 -07006964
6965 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6966 VkRect2D scissor = {{0, 0}, {16, 16}};
6967 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6968 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6969
Tobin Ehlis88452832015-12-03 09:40:56 -07006970 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006971 m_errorMonitor->VerifyFound();
6972
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006973 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07006974 // 2. Error due to bound set not being compatible with PSO's
6975 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006976 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6977 &descriptorSet[0], 0, NULL);
6978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07006979 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006980 m_errorMonitor->VerifyFound();
6981
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006982 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07006983 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006984 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
6985 }
6986 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006987 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6988 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6989}
Tobin Ehlis559c6382015-11-05 09:52:49 -07006990
Karl Schultz6addd812016-02-02 17:17:23 -07006991TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006992 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6993 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006994
6995 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006996 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006997 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006998 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006999
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007000 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007001}
7002
Karl Schultz6addd812016-02-02 17:17:23 -07007003TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7004 VkResult err;
7005 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007006
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007007 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007008
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007009 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007010
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007011 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007012 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007013 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007014 cmd.commandPool = m_commandPool;
7015 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007016 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007017
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007018 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007019 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007020
7021 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007022 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007023 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7024
7025 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007026 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007027 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007028 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 -07007029 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007030
7031 // The error should be caught by validation of the BeginCommandBuffer call
7032 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7033
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007034 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007035 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007036}
7037
Karl Schultz6addd812016-02-02 17:17:23 -07007038TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007039 // Cause error due to Begin while recording CB
7040 // Then cause 2 errors for attempting to reset CB w/o having
7041 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7042 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007043 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007044
7045 ASSERT_NO_FATAL_FAILURE(InitState());
7046
7047 // Calls AllocateCommandBuffers
7048 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7049
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007050 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007051 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007052 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7053 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007054 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7055 cmd_buf_info.pNext = NULL;
7056 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007057 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007058
7059 // Begin CB to transition to recording state
7060 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7061 // Can't re-begin. This should trigger error
7062 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007063 m_errorMonitor->VerifyFound();
7064
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007066 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007067 // Reset attempt will trigger error due to incorrect CommandPool state
7068 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007069 m_errorMonitor->VerifyFound();
7070
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007072 // Transition CB to RECORDED state
7073 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7074 // Now attempting to Begin will implicitly reset, which triggers error
7075 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007076 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007077}
7078
Karl Schultz6addd812016-02-02 17:17:23 -07007079TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007080 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007081 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007082
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7084 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007085
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007086 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007087 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007088
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007089 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007090 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7091 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007092
7093 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007094 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7095 ds_pool_ci.pNext = NULL;
7096 ds_pool_ci.maxSets = 1;
7097 ds_pool_ci.poolSizeCount = 1;
7098 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007099
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007100 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007101 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007102 ASSERT_VK_SUCCESS(err);
7103
Tony Barboureb254902015-07-15 12:50:33 -06007104 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007105 dsl_binding.binding = 0;
7106 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7107 dsl_binding.descriptorCount = 1;
7108 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7109 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007110
Tony Barboureb254902015-07-15 12:50:33 -06007111 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007112 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7113 ds_layout_ci.pNext = NULL;
7114 ds_layout_ci.bindingCount = 1;
7115 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007116
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007117 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007118 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007119 ASSERT_VK_SUCCESS(err);
7120
7121 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007122 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007123 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007124 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007125 alloc_info.descriptorPool = ds_pool;
7126 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007127 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007128 ASSERT_VK_SUCCESS(err);
7129
Tony Barboureb254902015-07-15 12:50:33 -06007130 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007131 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7132 pipeline_layout_ci.setLayoutCount = 1;
7133 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007134
7135 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007136 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007137 ASSERT_VK_SUCCESS(err);
7138
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007139 VkViewport vp = {}; // Just need dummy vp to point to
7140 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007141
7142 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007143 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7144 vp_state_ci.scissorCount = 1;
7145 vp_state_ci.pScissors = &sc;
7146 vp_state_ci.viewportCount = 1;
7147 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007148
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007149 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7150 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7151 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7152 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7153 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7154 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007155 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007156 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007157 rs_state_ci.lineWidth = 1.0f;
7158
7159 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7160 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7161 vi_ci.pNext = nullptr;
7162 vi_ci.vertexBindingDescriptionCount = 0;
7163 vi_ci.pVertexBindingDescriptions = nullptr;
7164 vi_ci.vertexAttributeDescriptionCount = 0;
7165 vi_ci.pVertexAttributeDescriptions = nullptr;
7166
7167 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7168 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7169 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7170
7171 VkPipelineShaderStageCreateInfo shaderStages[2];
7172 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7173
7174 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7175 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7176 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
7177 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007178
Tony Barboureb254902015-07-15 12:50:33 -06007179 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007180 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7181 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007182 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007183 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7184 gp_ci.layout = pipeline_layout;
7185 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007186 gp_ci.pVertexInputState = &vi_ci;
7187 gp_ci.pInputAssemblyState = &ia_ci;
7188
7189 gp_ci.stageCount = 1;
7190 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007191
7192 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007193 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7194 pc_ci.initialDataSize = 0;
7195 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007196
7197 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007198 VkPipelineCache pipelineCache;
7199
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007200 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007201 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007202 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007203 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007204
Chia-I Wuf7458c52015-10-26 21:10:41 +08007205 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7206 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7207 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7208 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007209}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007210
Tobin Ehlis912df022015-09-17 08:46:18 -06007211/*// TODO : This test should be good, but needs Tess support in compiler to run
7212TEST_F(VkLayerTest, InvalidPatchControlPoints)
7213{
7214 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007215 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007216
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007218 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7219primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007220
Tobin Ehlis912df022015-09-17 08:46:18 -06007221 ASSERT_NO_FATAL_FAILURE(InitState());
7222 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007223
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007224 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007225 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007226 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007227
7228 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7229 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7230 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007231 ds_pool_ci.poolSizeCount = 1;
7232 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007233
7234 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007235 err = vkCreateDescriptorPool(m_device->device(),
7236VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007237 ASSERT_VK_SUCCESS(err);
7238
7239 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007240 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007241 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007242 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007243 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7244 dsl_binding.pImmutableSamplers = NULL;
7245
7246 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007247 ds_layout_ci.sType =
7248VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007249 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007250 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007251 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007252
7253 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007254 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7255&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007256 ASSERT_VK_SUCCESS(err);
7257
7258 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007259 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7260VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007261 ASSERT_VK_SUCCESS(err);
7262
7263 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007264 pipeline_layout_ci.sType =
7265VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007266 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007267 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007268 pipeline_layout_ci.pSetLayouts = &ds_layout;
7269
7270 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007271 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7272&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007273 ASSERT_VK_SUCCESS(err);
7274
7275 VkPipelineShaderStageCreateInfo shaderStages[3];
7276 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7277
Karl Schultz6addd812016-02-02 17:17:23 -07007278 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7279this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007280 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007281 VkShaderObj
7282tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7283this);
7284 VkShaderObj
7285te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7286this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007287
Karl Schultz6addd812016-02-02 17:17:23 -07007288 shaderStages[0].sType =
7289VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007290 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007291 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007292 shaderStages[1].sType =
7293VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007294 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007295 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007296 shaderStages[2].sType =
7297VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007298 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007299 shaderStages[2].shader = te.handle();
7300
7301 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007302 iaCI.sType =
7303VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007304 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007305
7306 VkPipelineTessellationStateCreateInfo tsCI = {};
7307 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7308 tsCI.patchControlPoints = 0; // This will cause an error
7309
7310 VkGraphicsPipelineCreateInfo gp_ci = {};
7311 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7312 gp_ci.pNext = NULL;
7313 gp_ci.stageCount = 3;
7314 gp_ci.pStages = shaderStages;
7315 gp_ci.pVertexInputState = NULL;
7316 gp_ci.pInputAssemblyState = &iaCI;
7317 gp_ci.pTessellationState = &tsCI;
7318 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007319 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007320 gp_ci.pMultisampleState = NULL;
7321 gp_ci.pDepthStencilState = NULL;
7322 gp_ci.pColorBlendState = NULL;
7323 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7324 gp_ci.layout = pipeline_layout;
7325 gp_ci.renderPass = renderPass();
7326
7327 VkPipelineCacheCreateInfo pc_ci = {};
7328 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7329 pc_ci.pNext = NULL;
7330 pc_ci.initialSize = 0;
7331 pc_ci.initialData = 0;
7332 pc_ci.maxSize = 0;
7333
7334 VkPipeline pipeline;
7335 VkPipelineCache pipelineCache;
7336
Karl Schultz6addd812016-02-02 17:17:23 -07007337 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7338&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007339 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007340 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7341&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007342
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007343 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007344
Chia-I Wuf7458c52015-10-26 21:10:41 +08007345 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7346 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7347 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7348 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007349}
7350*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007351
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007352TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007353 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007354
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007355 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007356
Tobin Ehlise68360f2015-10-01 11:15:13 -06007357 ASSERT_NO_FATAL_FAILURE(InitState());
7358 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007359
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007360 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007361 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7362 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007363
7364 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007365 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7366 ds_pool_ci.maxSets = 1;
7367 ds_pool_ci.poolSizeCount = 1;
7368 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007369
7370 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007371 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007372 ASSERT_VK_SUCCESS(err);
7373
7374 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007375 dsl_binding.binding = 0;
7376 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7377 dsl_binding.descriptorCount = 1;
7378 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007379
7380 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007381 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7382 ds_layout_ci.bindingCount = 1;
7383 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007384
7385 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007386 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007387 ASSERT_VK_SUCCESS(err);
7388
7389 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007390 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007391 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007392 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007393 alloc_info.descriptorPool = ds_pool;
7394 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007395 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007396 ASSERT_VK_SUCCESS(err);
7397
7398 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007399 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7400 pipeline_layout_ci.setLayoutCount = 1;
7401 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007402
7403 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007404 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007405 ASSERT_VK_SUCCESS(err);
7406
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007407 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007408 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007409 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007410 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007411 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007412 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007413
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007414 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7415 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7416 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7417 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7418 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7419 rs_state_ci.depthClampEnable = VK_FALSE;
7420 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7421 rs_state_ci.depthBiasEnable = VK_FALSE;
7422
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007423 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7424 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7425 vi_ci.pNext = nullptr;
7426 vi_ci.vertexBindingDescriptionCount = 0;
7427 vi_ci.pVertexBindingDescriptions = nullptr;
7428 vi_ci.vertexAttributeDescriptionCount = 0;
7429 vi_ci.pVertexAttributeDescriptions = nullptr;
7430
7431 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7432 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7433 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7434
7435 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7436 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7437 pipe_ms_state_ci.pNext = NULL;
7438 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7439 pipe_ms_state_ci.sampleShadingEnable = 0;
7440 pipe_ms_state_ci.minSampleShading = 1.0;
7441 pipe_ms_state_ci.pSampleMask = NULL;
7442
Cody Northropeb3a6c12015-10-05 14:44:45 -06007443 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007444 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007445
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007446 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007447 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007448 shaderStages[0] = vs.GetStageCreateInfo();
7449 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007450
7451 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007452 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7453 gp_ci.stageCount = 2;
7454 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007455 gp_ci.pVertexInputState = &vi_ci;
7456 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007457 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007458 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007459 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007460 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7461 gp_ci.layout = pipeline_layout;
7462 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007463
7464 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007465 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007466
7467 VkPipeline pipeline;
7468 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007469 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007470 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007471
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007472 if (!m_device->phy().features().multiViewport) {
7473 printf("MultiViewport feature is disabled -- skipping enabled-state checks.\n");
7474
7475 // Check case where multiViewport is disabled and viewport count is not 1
7476 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7477 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7479 vp_state_ci.scissorCount = 0;
7480 vp_state_ci.viewportCount = 0;
7481 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7482 m_errorMonitor->VerifyFound();
7483 } else {
7484 if (m_device->props.limits.maxViewports == 1) {
7485 printf("Device limit maxViewports is 1, skipping tests that require higher limits.\n");
7486 } else {
7487 printf("MultiViewport feature is enabled -- skipping disabled-state checks.\n");
7488
7489 // Check is that viewportcount and scissorcount match
7490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7491 vp_state_ci.scissorCount = 1;
7492 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
7493 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7494 m_errorMonitor->VerifyFound();
7495
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007496 // Check case where multiViewport is enabled and viewport count is greater than max
7497 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
7499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
7500 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
7501 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
7502 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7503 m_errorMonitor->VerifyFound();
7504 }
7505 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06007506
Chia-I Wuf7458c52015-10-26 21:10:41 +08007507 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7508 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7509 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7510 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007511}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007512
7513// 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
7514// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007515TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07007516 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007517
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007518 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
7519
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007520 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007521
Tobin Ehlise68360f2015-10-01 11:15:13 -06007522 ASSERT_NO_FATAL_FAILURE(InitState());
7523 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007524
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007525 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007526 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7527 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007528
7529 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007530 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7531 ds_pool_ci.maxSets = 1;
7532 ds_pool_ci.poolSizeCount = 1;
7533 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007534
7535 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007536 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007537 ASSERT_VK_SUCCESS(err);
7538
7539 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007540 dsl_binding.binding = 0;
7541 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7542 dsl_binding.descriptorCount = 1;
7543 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007544
7545 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007546 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7547 ds_layout_ci.bindingCount = 1;
7548 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007549
7550 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007551 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007552 ASSERT_VK_SUCCESS(err);
7553
7554 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007555 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007556 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007557 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007558 alloc_info.descriptorPool = ds_pool;
7559 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007560 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007561 ASSERT_VK_SUCCESS(err);
7562
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007563 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7564 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7565 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7566
7567 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7568 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7569 vi_ci.pNext = nullptr;
7570 vi_ci.vertexBindingDescriptionCount = 0;
7571 vi_ci.pVertexBindingDescriptions = nullptr;
7572 vi_ci.vertexAttributeDescriptionCount = 0;
7573 vi_ci.pVertexAttributeDescriptions = nullptr;
7574
7575 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7576 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7577 pipe_ms_state_ci.pNext = NULL;
7578 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7579 pipe_ms_state_ci.sampleShadingEnable = 0;
7580 pipe_ms_state_ci.minSampleShading = 1.0;
7581 pipe_ms_state_ci.pSampleMask = NULL;
7582
Tobin Ehlise68360f2015-10-01 11:15:13 -06007583 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007584 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7585 pipeline_layout_ci.setLayoutCount = 1;
7586 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007587
7588 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007589 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007590 ASSERT_VK_SUCCESS(err);
7591
7592 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7593 // Set scissor as dynamic to avoid second error
7594 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007595 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7596 dyn_state_ci.dynamicStateCount = 1;
7597 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007598
Cody Northropeb3a6c12015-10-05 14:44:45 -06007599 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007600 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007601
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007602 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007603 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7604 // 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 +08007605 shaderStages[0] = vs.GetStageCreateInfo();
7606 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007607
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007608 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7609 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7610 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7611 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7612 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7613 rs_state_ci.depthClampEnable = VK_FALSE;
7614 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7615 rs_state_ci.depthBiasEnable = VK_FALSE;
7616
Tobin Ehlise68360f2015-10-01 11:15:13 -06007617 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007618 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7619 gp_ci.stageCount = 2;
7620 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007621 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007622 // Not setting VP state w/o dynamic vp state should cause validation error
7623 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007624 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007625 gp_ci.pVertexInputState = &vi_ci;
7626 gp_ci.pInputAssemblyState = &ia_ci;
7627 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007628 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7629 gp_ci.layout = pipeline_layout;
7630 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007631
7632 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007633 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007634
7635 VkPipeline pipeline;
7636 VkPipelineCache pipelineCache;
7637
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007638 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007639 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007640 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007641
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007642 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007643
Chia-I Wuf7458c52015-10-26 21:10:41 +08007644 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7645 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7646 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7647 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007648}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007649
7650// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
7651// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07007652TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7653 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007654
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007656
Tobin Ehlise68360f2015-10-01 11:15:13 -06007657 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007658
7659 if (!m_device->phy().features().multiViewport) {
7660 printf("Device does not support multiple viewports/scissors; skipped.\n");
7661 return;
7662 }
7663
Tobin Ehlise68360f2015-10-01 11:15:13 -06007664 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007665
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007666 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007667 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7668 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007669
7670 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007671 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7672 ds_pool_ci.maxSets = 1;
7673 ds_pool_ci.poolSizeCount = 1;
7674 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007675
7676 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007677 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007678 ASSERT_VK_SUCCESS(err);
7679
7680 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007681 dsl_binding.binding = 0;
7682 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7683 dsl_binding.descriptorCount = 1;
7684 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007685
7686 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007687 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7688 ds_layout_ci.bindingCount = 1;
7689 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007690
7691 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007692 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007693 ASSERT_VK_SUCCESS(err);
7694
7695 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007696 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007697 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007698 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007699 alloc_info.descriptorPool = ds_pool;
7700 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007701 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007702 ASSERT_VK_SUCCESS(err);
7703
7704 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007705 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7706 pipeline_layout_ci.setLayoutCount = 1;
7707 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007708
7709 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007710 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007711 ASSERT_VK_SUCCESS(err);
7712
7713 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007714 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7715 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007716 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07007717 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007718 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06007719
7720 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7721 // Set scissor as dynamic to avoid that error
7722 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007723 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7724 dyn_state_ci.dynamicStateCount = 1;
7725 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007726
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007727 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7728 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7729 pipe_ms_state_ci.pNext = NULL;
7730 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7731 pipe_ms_state_ci.sampleShadingEnable = 0;
7732 pipe_ms_state_ci.minSampleShading = 1.0;
7733 pipe_ms_state_ci.pSampleMask = NULL;
7734
Cody Northropeb3a6c12015-10-05 14:44:45 -06007735 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007736 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007737
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007738 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007739 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7740 // 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 +08007741 shaderStages[0] = vs.GetStageCreateInfo();
7742 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007743
Cody Northropf6622dc2015-10-06 10:33:21 -06007744 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7745 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7746 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007747 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007748 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007749 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007750 vi_ci.pVertexAttributeDescriptions = nullptr;
7751
7752 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7753 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7754 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7755
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007756 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007757 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007758 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06007759 rs_ci.pNext = nullptr;
7760
Mark Youngc89c6312016-03-31 16:03:20 -06007761 VkPipelineColorBlendAttachmentState att = {};
7762 att.blendEnable = VK_FALSE;
7763 att.colorWriteMask = 0xf;
7764
Cody Northropf6622dc2015-10-06 10:33:21 -06007765 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7766 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7767 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06007768 cb_ci.attachmentCount = 1;
7769 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06007770
Tobin Ehlise68360f2015-10-01 11:15:13 -06007771 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007772 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7773 gp_ci.stageCount = 2;
7774 gp_ci.pStages = shaderStages;
7775 gp_ci.pVertexInputState = &vi_ci;
7776 gp_ci.pInputAssemblyState = &ia_ci;
7777 gp_ci.pViewportState = &vp_state_ci;
7778 gp_ci.pRasterizationState = &rs_ci;
7779 gp_ci.pColorBlendState = &cb_ci;
7780 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007781 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007782 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7783 gp_ci.layout = pipeline_layout;
7784 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007785
7786 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007787 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007788
7789 VkPipeline pipeline;
7790 VkPipelineCache pipelineCache;
7791
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007792 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007793 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007794 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007795
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007796 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007797
Tobin Ehlisd332f282015-10-02 11:00:56 -06007798 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07007799 // First need to successfully create the PSO from above by setting
7800 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06007801 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 -07007802
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007803 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07007804 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007805 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07007806 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07007807 m_commandBuffer->BeginCommandBuffer();
7808 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007809 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007810 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07007811 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007812 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07007813 Draw(1, 0, 0, 0);
7814
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007815 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07007816
7817 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7818 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7819 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7820 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007821 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007822}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007823
7824// 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 -07007825// viewportCount
7826TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
7827 VkResult err;
7828
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007829 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07007830
7831 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007832
7833 if (!m_device->phy().features().multiViewport) {
7834 printf("Device does not support multiple viewports/scissors; skipped.\n");
7835 return;
7836 }
7837
Karl Schultz6addd812016-02-02 17:17:23 -07007838 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7839
7840 VkDescriptorPoolSize ds_type_count = {};
7841 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7842 ds_type_count.descriptorCount = 1;
7843
7844 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7845 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7846 ds_pool_ci.maxSets = 1;
7847 ds_pool_ci.poolSizeCount = 1;
7848 ds_pool_ci.pPoolSizes = &ds_type_count;
7849
7850 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007851 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07007852 ASSERT_VK_SUCCESS(err);
7853
7854 VkDescriptorSetLayoutBinding dsl_binding = {};
7855 dsl_binding.binding = 0;
7856 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7857 dsl_binding.descriptorCount = 1;
7858 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7859
7860 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7861 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7862 ds_layout_ci.bindingCount = 1;
7863 ds_layout_ci.pBindings = &dsl_binding;
7864
7865 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007866 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07007867 ASSERT_VK_SUCCESS(err);
7868
7869 VkDescriptorSet descriptorSet;
7870 VkDescriptorSetAllocateInfo alloc_info = {};
7871 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7872 alloc_info.descriptorSetCount = 1;
7873 alloc_info.descriptorPool = ds_pool;
7874 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007875 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07007876 ASSERT_VK_SUCCESS(err);
7877
7878 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7879 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7880 pipeline_layout_ci.setLayoutCount = 1;
7881 pipeline_layout_ci.pSetLayouts = &ds_layout;
7882
7883 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007884 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07007885 ASSERT_VK_SUCCESS(err);
7886
7887 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7888 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7889 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007890 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07007891 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007892 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07007893
7894 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
7895 // Set scissor as dynamic to avoid that error
7896 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7897 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7898 dyn_state_ci.dynamicStateCount = 1;
7899 dyn_state_ci.pDynamicStates = &vp_state;
7900
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007901 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7902 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7903 pipe_ms_state_ci.pNext = NULL;
7904 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7905 pipe_ms_state_ci.sampleShadingEnable = 0;
7906 pipe_ms_state_ci.minSampleShading = 1.0;
7907 pipe_ms_state_ci.pSampleMask = NULL;
7908
Karl Schultz6addd812016-02-02 17:17:23 -07007909 VkPipelineShaderStageCreateInfo shaderStages[2];
7910 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7911
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007912 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007913 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7914 // 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 -07007915 shaderStages[0] = vs.GetStageCreateInfo();
7916 shaderStages[1] = fs.GetStageCreateInfo();
7917
7918 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7919 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7920 vi_ci.pNext = nullptr;
7921 vi_ci.vertexBindingDescriptionCount = 0;
7922 vi_ci.pVertexBindingDescriptions = nullptr;
7923 vi_ci.vertexAttributeDescriptionCount = 0;
7924 vi_ci.pVertexAttributeDescriptions = nullptr;
7925
7926 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7927 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7928 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7929
7930 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7931 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007932 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07007933 rs_ci.pNext = nullptr;
7934
Mark Youngc89c6312016-03-31 16:03:20 -06007935 VkPipelineColorBlendAttachmentState att = {};
7936 att.blendEnable = VK_FALSE;
7937 att.colorWriteMask = 0xf;
7938
Karl Schultz6addd812016-02-02 17:17:23 -07007939 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7940 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7941 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06007942 cb_ci.attachmentCount = 1;
7943 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07007944
7945 VkGraphicsPipelineCreateInfo gp_ci = {};
7946 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7947 gp_ci.stageCount = 2;
7948 gp_ci.pStages = shaderStages;
7949 gp_ci.pVertexInputState = &vi_ci;
7950 gp_ci.pInputAssemblyState = &ia_ci;
7951 gp_ci.pViewportState = &vp_state_ci;
7952 gp_ci.pRasterizationState = &rs_ci;
7953 gp_ci.pColorBlendState = &cb_ci;
7954 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007955 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007956 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7957 gp_ci.layout = pipeline_layout;
7958 gp_ci.renderPass = renderPass();
7959
7960 VkPipelineCacheCreateInfo pc_ci = {};
7961 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7962
7963 VkPipeline pipeline;
7964 VkPipelineCache pipelineCache;
7965
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007966 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07007967 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007968 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07007969
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007970 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07007971
7972 // Now hit second fail case where we set scissor w/ different count than PSO
7973 // First need to successfully create the PSO from above by setting
7974 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7976 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007977
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007978 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06007979 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007980 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007981 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07007982 m_commandBuffer->BeginCommandBuffer();
7983 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007984 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007985 VkViewport viewports[1] = {};
7986 viewports[0].width = 8;
7987 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06007988 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007989 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007990 Draw(1, 0, 0, 0);
7991
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007992 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007993
Chia-I Wuf7458c52015-10-26 21:10:41 +08007994 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7995 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7996 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7997 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007998 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007999}
8000
Mark Young7394fdd2016-03-31 14:56:43 -06008001TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8002 VkResult err;
8003
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008005
8006 ASSERT_NO_FATAL_FAILURE(InitState());
8007 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8008
8009 VkDescriptorPoolSize ds_type_count = {};
8010 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8011 ds_type_count.descriptorCount = 1;
8012
8013 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8014 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8015 ds_pool_ci.maxSets = 1;
8016 ds_pool_ci.poolSizeCount = 1;
8017 ds_pool_ci.pPoolSizes = &ds_type_count;
8018
8019 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008020 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008021 ASSERT_VK_SUCCESS(err);
8022
8023 VkDescriptorSetLayoutBinding dsl_binding = {};
8024 dsl_binding.binding = 0;
8025 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8026 dsl_binding.descriptorCount = 1;
8027 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8028
8029 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8030 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8031 ds_layout_ci.bindingCount = 1;
8032 ds_layout_ci.pBindings = &dsl_binding;
8033
8034 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008035 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008036 ASSERT_VK_SUCCESS(err);
8037
8038 VkDescriptorSet descriptorSet;
8039 VkDescriptorSetAllocateInfo alloc_info = {};
8040 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8041 alloc_info.descriptorSetCount = 1;
8042 alloc_info.descriptorPool = ds_pool;
8043 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008044 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008045 ASSERT_VK_SUCCESS(err);
8046
8047 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8048 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8049 pipeline_layout_ci.setLayoutCount = 1;
8050 pipeline_layout_ci.pSetLayouts = &ds_layout;
8051
8052 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008053 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008054 ASSERT_VK_SUCCESS(err);
8055
8056 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8057 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8058 vp_state_ci.scissorCount = 1;
8059 vp_state_ci.pScissors = NULL;
8060 vp_state_ci.viewportCount = 1;
8061 vp_state_ci.pViewports = NULL;
8062
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008063 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008064 // Set scissor as dynamic to avoid that error
8065 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8066 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8067 dyn_state_ci.dynamicStateCount = 2;
8068 dyn_state_ci.pDynamicStates = dynamic_states;
8069
8070 VkPipelineShaderStageCreateInfo shaderStages[2];
8071 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8072
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008073 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8074 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008075 this); // TODO - We shouldn't need a fragment shader
8076 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008077 shaderStages[0] = vs.GetStageCreateInfo();
8078 shaderStages[1] = fs.GetStageCreateInfo();
8079
8080 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8081 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8082 vi_ci.pNext = nullptr;
8083 vi_ci.vertexBindingDescriptionCount = 0;
8084 vi_ci.pVertexBindingDescriptions = nullptr;
8085 vi_ci.vertexAttributeDescriptionCount = 0;
8086 vi_ci.pVertexAttributeDescriptions = nullptr;
8087
8088 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8089 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8090 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8091
8092 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8093 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8094 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008095 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008096
Mark Young47107952016-05-02 15:59:55 -06008097 // Check too low (line width of -1.0f).
8098 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008099
8100 VkPipelineColorBlendAttachmentState att = {};
8101 att.blendEnable = VK_FALSE;
8102 att.colorWriteMask = 0xf;
8103
8104 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8105 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8106 cb_ci.pNext = nullptr;
8107 cb_ci.attachmentCount = 1;
8108 cb_ci.pAttachments = &att;
8109
8110 VkGraphicsPipelineCreateInfo gp_ci = {};
8111 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8112 gp_ci.stageCount = 2;
8113 gp_ci.pStages = shaderStages;
8114 gp_ci.pVertexInputState = &vi_ci;
8115 gp_ci.pInputAssemblyState = &ia_ci;
8116 gp_ci.pViewportState = &vp_state_ci;
8117 gp_ci.pRasterizationState = &rs_ci;
8118 gp_ci.pColorBlendState = &cb_ci;
8119 gp_ci.pDynamicState = &dyn_state_ci;
8120 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8121 gp_ci.layout = pipeline_layout;
8122 gp_ci.renderPass = renderPass();
8123
8124 VkPipelineCacheCreateInfo pc_ci = {};
8125 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8126
8127 VkPipeline pipeline;
8128 VkPipelineCache pipelineCache;
8129
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008130 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008131 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008132 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008133
8134 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008135 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008136
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008137 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008138
8139 // Check too high (line width of 65536.0f).
8140 rs_ci.lineWidth = 65536.0f;
8141
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008142 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008143 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008144 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008145
8146 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008147 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008148
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008149 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008150
8151 dyn_state_ci.dynamicStateCount = 3;
8152
8153 rs_ci.lineWidth = 1.0f;
8154
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008155 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008156 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008157 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008158 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008159 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008160
8161 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008162 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008163 m_errorMonitor->VerifyFound();
8164
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008165 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008166
8167 // Check too high with dynamic setting.
8168 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8169 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008170 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008171
8172 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8173 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8174 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8175 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008176 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008177}
8178
Karl Schultz6addd812016-02-02 17:17:23 -07008179TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008180 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008182 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008183
8184 ASSERT_NO_FATAL_FAILURE(InitState());
8185 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008186
Tony Barbour552f6c02016-12-21 14:34:07 -07008187 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008188 // Don't care about RenderPass handle b/c error should be flagged before
8189 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008190 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008191
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008192 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008193}
8194
Karl Schultz6addd812016-02-02 17:17:23 -07008195TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008196 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008197 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8198 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008199
8200 ASSERT_NO_FATAL_FAILURE(InitState());
8201 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008202
Tony Barbour552f6c02016-12-21 14:34:07 -07008203 m_commandBuffer->BeginCommandBuffer();
8204 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008205 // Just create a dummy Renderpass that's non-NULL so we can get to the
8206 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008207 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008208
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008209 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008210}
8211
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008212TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008213 TEST_DESCRIPTION(
8214 "Begin a renderPass where clearValueCount is less than"
8215 "the number of renderPass attachments that use loadOp"
8216 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008217
8218 ASSERT_NO_FATAL_FAILURE(InitState());
8219 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8220
8221 // Create a renderPass with a single attachment that uses loadOp CLEAR
8222 VkAttachmentReference attach = {};
8223 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8224 VkSubpassDescription subpass = {};
8225 subpass.inputAttachmentCount = 1;
8226 subpass.pInputAttachments = &attach;
8227 VkRenderPassCreateInfo rpci = {};
8228 rpci.subpassCount = 1;
8229 rpci.pSubpasses = &subpass;
8230 rpci.attachmentCount = 1;
8231 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008232 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008233 // Set loadOp to CLEAR
8234 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8235 rpci.pAttachments = &attach_desc;
8236 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8237 VkRenderPass rp;
8238 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8239
8240 VkCommandBufferInheritanceInfo hinfo = {};
8241 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8242 hinfo.renderPass = VK_NULL_HANDLE;
8243 hinfo.subpass = 0;
8244 hinfo.framebuffer = VK_NULL_HANDLE;
8245 hinfo.occlusionQueryEnable = VK_FALSE;
8246 hinfo.queryFlags = 0;
8247 hinfo.pipelineStatistics = 0;
8248 VkCommandBufferBeginInfo info = {};
8249 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8250 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8251 info.pInheritanceInfo = &hinfo;
8252
8253 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8254 VkRenderPassBeginInfo rp_begin = {};
8255 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8256 rp_begin.pNext = NULL;
8257 rp_begin.renderPass = renderPass();
8258 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008259 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008260
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008261 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008262
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008263 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008264
8265 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008266
8267 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008268}
8269
Slawomir Cygan0808f392016-11-28 17:53:23 +01008270TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008271 TEST_DESCRIPTION(
8272 "Begin a renderPass where clearValueCount is greater than"
8273 "the number of renderPass attachments that use loadOp"
8274 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008275
8276 ASSERT_NO_FATAL_FAILURE(InitState());
8277 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8278
8279 // Create a renderPass with a single attachment that uses loadOp CLEAR
8280 VkAttachmentReference attach = {};
8281 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8282 VkSubpassDescription subpass = {};
8283 subpass.inputAttachmentCount = 1;
8284 subpass.pInputAttachments = &attach;
8285 VkRenderPassCreateInfo rpci = {};
8286 rpci.subpassCount = 1;
8287 rpci.pSubpasses = &subpass;
8288 rpci.attachmentCount = 1;
8289 VkAttachmentDescription attach_desc = {};
8290 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8291 // Set loadOp to CLEAR
8292 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8293 rpci.pAttachments = &attach_desc;
8294 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8295 VkRenderPass rp;
8296 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8297
8298 VkCommandBufferBeginInfo info = {};
8299 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8300 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8301
8302 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8303 VkRenderPassBeginInfo rp_begin = {};
8304 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8305 rp_begin.pNext = NULL;
8306 rp_begin.renderPass = renderPass();
8307 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008308 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008309
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8311 " has a clearValueCount of"
8312 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008313
8314 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8315
8316 m_errorMonitor->VerifyFound();
8317
8318 vkDestroyRenderPass(m_device->device(), rp, NULL);
8319}
8320
Cody Northrop3bb4d962016-05-09 16:15:57 -06008321TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008322 TEST_DESCRIPTION("End a command buffer with an active render pass");
8323
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8325 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008326
8327 ASSERT_NO_FATAL_FAILURE(InitState());
8328 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8329
Tony Barbour552f6c02016-12-21 14:34:07 -07008330 m_commandBuffer->BeginCommandBuffer();
8331 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8332 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008333
8334 m_errorMonitor->VerifyFound();
8335
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008336 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8337 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008338}
8339
Karl Schultz6addd812016-02-02 17:17:23 -07008340TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008341 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008342 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8343 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008344
8345 ASSERT_NO_FATAL_FAILURE(InitState());
8346 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008347
Tony Barbour552f6c02016-12-21 14:34:07 -07008348 m_commandBuffer->BeginCommandBuffer();
8349 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008350
8351 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008352 vk_testing::Buffer dstBuffer;
8353 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008354
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008355 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008356
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008357 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008358}
8359
Karl Schultz6addd812016-02-02 17:17:23 -07008360TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008361 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008362 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8363 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008364
8365 ASSERT_NO_FATAL_FAILURE(InitState());
8366 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008367
Tony Barbour552f6c02016-12-21 14:34:07 -07008368 m_commandBuffer->BeginCommandBuffer();
8369 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008370
8371 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008372 vk_testing::Buffer dstBuffer;
8373 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008374
Karl Schultz6addd812016-02-02 17:17:23 -07008375 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008376 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8377 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8378 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008379
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008380 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008381}
8382
Karl Schultz6addd812016-02-02 17:17:23 -07008383TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008384 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8386 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008387
8388 ASSERT_NO_FATAL_FAILURE(InitState());
8389 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008390
Tony Barbour552f6c02016-12-21 14:34:07 -07008391 m_commandBuffer->BeginCommandBuffer();
8392 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008393
Michael Lentine0a369f62016-02-03 16:51:46 -06008394 VkClearColorValue clear_color;
8395 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008396 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8397 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8398 const int32_t tex_width = 32;
8399 const int32_t tex_height = 32;
8400 VkImageCreateInfo image_create_info = {};
8401 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8402 image_create_info.pNext = NULL;
8403 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8404 image_create_info.format = tex_format;
8405 image_create_info.extent.width = tex_width;
8406 image_create_info.extent.height = tex_height;
8407 image_create_info.extent.depth = 1;
8408 image_create_info.mipLevels = 1;
8409 image_create_info.arrayLayers = 1;
8410 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8411 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8412 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008413
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008414 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008415 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008416
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008417 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008418
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008419 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008420
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008421 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008422}
8423
Karl Schultz6addd812016-02-02 17:17:23 -07008424TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008425 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8427 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008428
8429 ASSERT_NO_FATAL_FAILURE(InitState());
8430 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008431
Tony Barbour552f6c02016-12-21 14:34:07 -07008432 m_commandBuffer->BeginCommandBuffer();
8433 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008434
8435 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008436 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008437 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8438 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8439 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8440 image_create_info.extent.width = 64;
8441 image_create_info.extent.height = 64;
8442 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8443 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008444
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008445 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008446 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008447
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008448 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008449
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008450 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
8451 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008452
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008453 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008454}
8455
Karl Schultz6addd812016-02-02 17:17:23 -07008456TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008457 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008458 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008459
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8461 "vkCmdClearAttachments(): This call "
8462 "must be issued inside an active "
8463 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008464
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008465 ASSERT_NO_FATAL_FAILURE(InitState());
8466 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008467
8468 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008469 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008470 ASSERT_VK_SUCCESS(err);
8471
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008472 VkClearAttachment color_attachment;
8473 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8474 color_attachment.clearValue.color.float32[0] = 0;
8475 color_attachment.clearValue.color.float32[1] = 0;
8476 color_attachment.clearValue.color.float32[2] = 0;
8477 color_attachment.clearValue.color.float32[3] = 0;
8478 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008479 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008480 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008481
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008482 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008483}
8484
Chris Forbes3b97e932016-09-07 11:29:24 +12008485TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008486 TEST_DESCRIPTION(
8487 "Test that an error is produced when CmdNextSubpass is "
8488 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12008489
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8491 "vkCmdNextSubpass(): Attempted to advance "
8492 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008493
8494 ASSERT_NO_FATAL_FAILURE(InitState());
8495 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8496
Tony Barbour552f6c02016-12-21 14:34:07 -07008497 m_commandBuffer->BeginCommandBuffer();
8498 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12008499
8500 // error here.
8501 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8502 m_errorMonitor->VerifyFound();
8503
Tony Barbour552f6c02016-12-21 14:34:07 -07008504 m_commandBuffer->EndRenderPass();
8505 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12008506}
8507
Chris Forbes6d624702016-09-07 13:57:05 +12008508TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008509 TEST_DESCRIPTION(
8510 "Test that an error is produced when CmdEndRenderPass is "
8511 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12008512
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8514 "vkCmdEndRenderPass(): Called before reaching "
8515 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008516
8517 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008518 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8519 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008520
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008521 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008522
8523 VkRenderPass rp;
8524 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8525 ASSERT_VK_SUCCESS(err);
8526
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008527 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008528
8529 VkFramebuffer fb;
8530 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8531 ASSERT_VK_SUCCESS(err);
8532
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008533 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008534
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008535 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 +12008536
8537 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8538
8539 // Error here.
8540 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8541 m_errorMonitor->VerifyFound();
8542
8543 // Clean up.
8544 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8545 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8546}
8547
Karl Schultz9e66a292016-04-21 15:57:51 -06008548TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8549 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008550 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8551 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008552
8553 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour552f6c02016-12-21 14:34:07 -07008554 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06008555
8556 VkBufferMemoryBarrier buf_barrier = {};
8557 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8558 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8559 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8560 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8561 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8562 buf_barrier.buffer = VK_NULL_HANDLE;
8563 buf_barrier.offset = 0;
8564 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008565 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8566 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008567
8568 m_errorMonitor->VerifyFound();
8569}
8570
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008571TEST_F(VkLayerTest, InvalidBarriers) {
8572 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8573
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008574 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008575
8576 ASSERT_NO_FATAL_FAILURE(InitState());
8577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8578
8579 VkMemoryBarrier mem_barrier = {};
8580 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8581 mem_barrier.pNext = NULL;
8582 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8583 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07008584 m_commandBuffer->BeginCommandBuffer();
8585 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008586 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008587 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008588 &mem_barrier, 0, nullptr, 0, nullptr);
8589 m_errorMonitor->VerifyFound();
8590
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008592 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008593 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 -06008594 ASSERT_TRUE(image.initialized());
8595 VkImageMemoryBarrier img_barrier = {};
8596 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8597 img_barrier.pNext = NULL;
8598 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8599 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8600 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8601 // New layout can't be UNDEFINED
8602 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8603 img_barrier.image = image.handle();
8604 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8605 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8606 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8607 img_barrier.subresourceRange.baseArrayLayer = 0;
8608 img_barrier.subresourceRange.baseMipLevel = 0;
8609 img_barrier.subresourceRange.layerCount = 1;
8610 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008611 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8612 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008613 m_errorMonitor->VerifyFound();
8614 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8615
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8617 "Subresource must have the sum of the "
8618 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008619 // baseArrayLayer + layerCount must be <= image's arrayLayers
8620 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008621 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8622 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008623 m_errorMonitor->VerifyFound();
8624 img_barrier.subresourceRange.baseArrayLayer = 0;
8625
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008626 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008627 // baseMipLevel + levelCount must be <= image's mipLevels
8628 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008629 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8630 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008631 m_errorMonitor->VerifyFound();
8632 img_barrier.subresourceRange.baseMipLevel = 0;
8633
Mike Weiblen7053aa32017-01-25 15:21:10 -07008634 // levelCount must be non-zero.
8635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
8636 img_barrier.subresourceRange.levelCount = 0;
8637 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8638 nullptr, 0, nullptr, 1, &img_barrier);
8639 m_errorMonitor->VerifyFound();
8640 img_barrier.subresourceRange.levelCount = 1;
8641
8642 // layerCount must be non-zero.
8643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
8644 img_barrier.subresourceRange.layerCount = 0;
8645 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8646 nullptr, 0, nullptr, 1, &img_barrier);
8647 m_errorMonitor->VerifyFound();
8648 img_barrier.subresourceRange.layerCount = 1;
8649
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008650 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 -06008651 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008652 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8653 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008654 VkBufferMemoryBarrier buf_barrier = {};
8655 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8656 buf_barrier.pNext = NULL;
8657 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8658 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8659 buf_barrier.buffer = buffer.handle();
8660 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8661 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8662 buf_barrier.offset = 0;
8663 buf_barrier.size = VK_WHOLE_SIZE;
8664 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008665 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8666 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008667 m_errorMonitor->VerifyFound();
8668 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8669
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008670 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008671 buf_barrier.offset = 257;
8672 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008673 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8674 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008675 m_errorMonitor->VerifyFound();
8676 buf_barrier.offset = 0;
8677
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008679 buf_barrier.size = 257;
8680 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008681 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8682 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008683 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008684
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008685 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008686 m_errorMonitor->SetDesiredFailureMsg(
8687 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008688 "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 -06008689 VkDepthStencilObj ds_image(m_device);
8690 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
8691 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06008692 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
8693 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008694 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07008695
8696 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07008697 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008698 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8699 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008700 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07008701
8702 // Having anything other than DEPTH or STENCIL is an error
8703 m_errorMonitor->SetDesiredFailureMsg(
8704 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8705 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
8706 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
8707 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8708 nullptr, 0, nullptr, 1, &img_barrier);
8709 m_errorMonitor->VerifyFound();
8710
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008711 // Now test depth-only
8712 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008713 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
8714 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008715 VkDepthStencilObj d_image(m_device);
8716 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
8717 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008718 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06008719 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008720 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07008721
8722 // DEPTH bit must be set
8723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8724 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07008725 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07008726 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8727 0, nullptr, 0, nullptr, 1, &img_barrier);
8728 m_errorMonitor->VerifyFound();
8729
8730 // No bits other than DEPTH may be set
8731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8732 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
8733 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008734 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8735 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008736 m_errorMonitor->VerifyFound();
8737 }
Dave Houltonfbf52152017-01-06 12:55:29 -07008738
8739 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008740 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
8741 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8743 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008744 VkDepthStencilObj s_image(m_device);
8745 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
8746 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008747 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06008748 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008749 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06008750 // Use of COLOR aspect on depth image is error
8751 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008752 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8753 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008754 m_errorMonitor->VerifyFound();
8755 }
Dave Houltonfbf52152017-01-06 12:55:29 -07008756
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008757 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008758 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008759 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 -06008760 ASSERT_TRUE(c_image.initialized());
8761 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8762 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
8763 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07008764
8765 // COLOR bit must be set
8766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8767 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07008768 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07008769 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8770 nullptr, 0, nullptr, 1, &img_barrier);
8771 m_errorMonitor->VerifyFound();
8772
8773 // No bits other than COLOR may be set
8774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8775 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
8776 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008777 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8778 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008779 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008780
8781 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
8782
8783 // Create command pool with incompatible queueflags
8784 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
8785 uint32_t queue_family_index = UINT32_MAX;
8786 for (uint32_t i = 0; i < queue_props.size(); i++) {
8787 if ((queue_props[i].queueFlags & VK_QUEUE_COMPUTE_BIT) == 0) {
8788 queue_family_index = i;
8789 break;
8790 }
8791 }
8792 if (queue_family_index == UINT32_MAX) {
8793 printf("No non-compute queue found; skipped.\n");
8794 return;
8795 }
8796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
8797
8798 VkCommandPool command_pool;
8799 VkCommandPoolCreateInfo pool_create_info{};
8800 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
8801 pool_create_info.queueFamilyIndex = queue_family_index;
8802 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
8803 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
8804
8805 // Allocate a command buffer
8806 VkCommandBuffer bad_command_buffer;
8807 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
8808 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
8809 command_buffer_allocate_info.commandPool = command_pool;
8810 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
8811 command_buffer_allocate_info.commandBufferCount = 1;
8812 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
8813
8814 VkCommandBufferBeginInfo cbbi = {};
8815 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8816 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
8817 buf_barrier.offset = 0;
8818 buf_barrier.size = VK_WHOLE_SIZE;
8819 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
8820 &buf_barrier, 0, nullptr);
8821 m_errorMonitor->VerifyFound();
8822
8823 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
8824 vkEndCommandBuffer(bad_command_buffer);
8825 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
8826 printf("The non-compute queue does not support graphics; skipped.\n");
8827 return;
8828 }
8829 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
8830 VkEvent event;
8831 VkEventCreateInfo event_create_info{};
8832 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
8833 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
8834 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
8835 nullptr, 0, nullptr);
8836 m_errorMonitor->VerifyFound();
8837
8838 vkEndCommandBuffer(bad_command_buffer);
8839 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008840}
8841
Tony Barbour18ba25c2016-09-29 13:42:40 -06008842TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
8843 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
8844
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour18ba25c2016-09-29 13:42:40 -06008846 ASSERT_NO_FATAL_FAILURE(InitState());
8847 VkImageObj image(m_device);
Tony Barbour256c80a2016-10-05 13:23:46 -06008848 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 -06008849 ASSERT_TRUE(image.initialized());
8850
8851 VkImageMemoryBarrier barrier = {};
8852 VkImageSubresourceRange range;
8853 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8854 barrier.srcAccessMask = 0;
8855 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
8856 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
8857 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8858 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
8859 barrier.image = image.handle();
8860 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8861 range.baseMipLevel = 0;
8862 range.levelCount = 1;
8863 range.baseArrayLayer = 0;
8864 range.layerCount = 1;
8865 barrier.subresourceRange = range;
8866 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
8867 cmdbuf.BeginCommandBuffer();
8868 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
8869 &barrier);
8870 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
8871 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
8872 barrier.srcAccessMask = 0;
8873 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
8874 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
8875 &barrier);
8876
8877 m_errorMonitor->VerifyFound();
8878}
8879
Karl Schultz6addd812016-02-02 17:17:23 -07008880TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008881 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008882 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008883
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008885
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008886 ASSERT_NO_FATAL_FAILURE(InitState());
8887 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008888 uint32_t qfi = 0;
8889 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008890 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8891 buffCI.size = 1024;
8892 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
8893 buffCI.queueFamilyIndexCount = 1;
8894 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008895
8896 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008897 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008898 ASSERT_VK_SUCCESS(err);
8899
Tony Barbour552f6c02016-12-21 14:34:07 -07008900 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008901 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008902 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8903 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008904 // Should error before calling to driver so don't care about actual data
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008905 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7, VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008906
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008907 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008908
Chia-I Wuf7458c52015-10-26 21:10:41 +08008909 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008910}
8911
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008912TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
8913 // Create an out-of-range queueFamilyIndex
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008914 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8915 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
8916 "of the indices specified when the device was created, via the "
8917 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008918
8919 ASSERT_NO_FATAL_FAILURE(InitState());
8920 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8921 VkBufferCreateInfo buffCI = {};
8922 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8923 buffCI.size = 1024;
8924 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
8925 buffCI.queueFamilyIndexCount = 1;
8926 // Introduce failure by specifying invalid queue_family_index
8927 uint32_t qfi = 777;
8928 buffCI.pQueueFamilyIndices = &qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008929 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008930
8931 VkBuffer ib;
8932 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
8933
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008934 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008935 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008936}
8937
Karl Schultz6addd812016-02-02 17:17:23 -07008938TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008939 TEST_DESCRIPTION(
8940 "Attempt vkCmdExecuteCommands with a primary command buffer"
8941 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008942
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008943 ASSERT_NO_FATAL_FAILURE(InitState());
8944 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008945
Chris Forbesf29a84f2016-10-06 18:39:28 +13008946 // An empty primary command buffer
8947 VkCommandBufferObj cb(m_device, m_commandPool);
8948 cb.BeginCommandBuffer();
8949 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06008950
Chris Forbesf29a84f2016-10-06 18:39:28 +13008951 m_commandBuffer->BeginCommandBuffer();
8952 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
8953 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008954
Chris Forbesf29a84f2016-10-06 18:39:28 +13008955 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
8956 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008957 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008958}
8959
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008960TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008961 TEST_DESCRIPTION(
8962 "Attempt to update descriptor sets for images and buffers "
8963 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008964 VkResult err;
8965
8966 ASSERT_NO_FATAL_FAILURE(InitState());
8967 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
8968 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8969 ds_type_count[i].type = VkDescriptorType(i);
8970 ds_type_count[i].descriptorCount = 1;
8971 }
8972 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8973 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8974 ds_pool_ci.pNext = NULL;
8975 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8976 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8977 ds_pool_ci.pPoolSizes = ds_type_count;
8978
8979 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008980 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008981 ASSERT_VK_SUCCESS(err);
8982
8983 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008984 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008985 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8986 dsl_binding[i].binding = 0;
8987 dsl_binding[i].descriptorType = VkDescriptorType(i);
8988 dsl_binding[i].descriptorCount = 1;
8989 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
8990 dsl_binding[i].pImmutableSamplers = NULL;
8991 }
8992
8993 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8994 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8995 ds_layout_ci.pNext = NULL;
8996 ds_layout_ci.bindingCount = 1;
8997 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
8998 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8999 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009000 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009001 ASSERT_VK_SUCCESS(err);
9002 }
9003 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9004 VkDescriptorSetAllocateInfo alloc_info = {};
9005 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9006 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9007 alloc_info.descriptorPool = ds_pool;
9008 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009009 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009010 ASSERT_VK_SUCCESS(err);
9011
9012 // Create a buffer & bufferView to be used for invalid updates
9013 VkBufferCreateInfo buff_ci = {};
9014 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009015 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009016 buff_ci.size = 256;
9017 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009018 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009019 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9020 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009021
9022 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9023 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9024 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9025 ASSERT_VK_SUCCESS(err);
9026
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009027 VkMemoryRequirements mem_reqs;
9028 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9029 VkMemoryAllocateInfo mem_alloc_info = {};
9030 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9031 mem_alloc_info.pNext = NULL;
9032 mem_alloc_info.memoryTypeIndex = 0;
9033 mem_alloc_info.allocationSize = mem_reqs.size;
9034 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9035 if (!pass) {
9036 vkDestroyBuffer(m_device->device(), buffer, NULL);
9037 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9038 return;
9039 }
9040 VkDeviceMemory mem;
9041 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9042 ASSERT_VK_SUCCESS(err);
9043 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9044 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009045
9046 VkBufferViewCreateInfo buff_view_ci = {};
9047 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9048 buff_view_ci.buffer = buffer;
9049 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9050 buff_view_ci.range = VK_WHOLE_SIZE;
9051 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009052 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009053 ASSERT_VK_SUCCESS(err);
9054
Tony Barbour415497c2017-01-24 10:06:09 -07009055 // Now get resources / view for storage_texel_buffer
9056 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9057 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9058 if (!pass) {
9059 vkDestroyBuffer(m_device->device(), buffer, NULL);
9060 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9061 vkFreeMemory(m_device->device(), mem, NULL);
9062 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9063 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9064 return;
9065 }
9066 VkDeviceMemory storage_texel_buffer_mem;
9067 VkBufferView storage_texel_buffer_view;
9068 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9069 ASSERT_VK_SUCCESS(err);
9070 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9071 ASSERT_VK_SUCCESS(err);
9072 buff_view_ci.buffer = storage_texel_buffer;
9073 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9074 ASSERT_VK_SUCCESS(err);
9075
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009076 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009077 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009078 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009079 image_ci.format = VK_FORMAT_UNDEFINED;
9080 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9081 VkFormat format = static_cast<VkFormat>(f);
9082 VkFormatProperties fProps = m_device->format_properties(format);
9083 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9084 image_ci.format = format;
9085 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9086 break;
9087 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9088 image_ci.format = format;
9089 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9090 break;
9091 }
9092 }
9093 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9094 return;
9095 }
9096
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009097 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9098 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009099 image_ci.extent.width = 64;
9100 image_ci.extent.height = 64;
9101 image_ci.extent.depth = 1;
9102 image_ci.mipLevels = 1;
9103 image_ci.arrayLayers = 1;
9104 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009105 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009106 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009107 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9108 VkImage image;
9109 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9110 ASSERT_VK_SUCCESS(err);
9111 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009112 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009113
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009114 VkMemoryAllocateInfo mem_alloc = {};
9115 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9116 mem_alloc.pNext = NULL;
9117 mem_alloc.allocationSize = 0;
9118 mem_alloc.memoryTypeIndex = 0;
9119 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9120 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009121 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009122 ASSERT_TRUE(pass);
9123 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9124 ASSERT_VK_SUCCESS(err);
9125 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9126 ASSERT_VK_SUCCESS(err);
9127 // Now create view for image
9128 VkImageViewCreateInfo image_view_ci = {};
9129 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9130 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009131 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009132 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9133 image_view_ci.subresourceRange.layerCount = 1;
9134 image_view_ci.subresourceRange.baseArrayLayer = 0;
9135 image_view_ci.subresourceRange.levelCount = 1;
9136 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9137 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009138 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009139 ASSERT_VK_SUCCESS(err);
9140
9141 VkDescriptorBufferInfo buff_info = {};
9142 buff_info.buffer = buffer;
9143 VkDescriptorImageInfo img_info = {};
9144 img_info.imageView = image_view;
9145 VkWriteDescriptorSet descriptor_write = {};
9146 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9147 descriptor_write.dstBinding = 0;
9148 descriptor_write.descriptorCount = 1;
9149 descriptor_write.pTexelBufferView = &buff_view;
9150 descriptor_write.pBufferInfo = &buff_info;
9151 descriptor_write.pImageInfo = &img_info;
9152
9153 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009154 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009155 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9156 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9157 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9158 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9159 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9160 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9161 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9162 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9163 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9164 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9165 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009166 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009167 // Start loop at 1 as SAMPLER desc type has no usage bit error
9168 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009169 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9170 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9171 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9172 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009173 descriptor_write.descriptorType = VkDescriptorType(i);
9174 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009176
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009177 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009178
9179 m_errorMonitor->VerifyFound();
9180 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009181 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9182 descriptor_write.pTexelBufferView = &buff_view;
9183 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009184 }
Tony Barbour415497c2017-01-24 10:06:09 -07009185
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009186 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9187 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009188 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009189 vkDestroyImageView(m_device->device(), image_view, NULL);
9190 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009191 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009192 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009193 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009194 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009195 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009196 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9197}
9198
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009199TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009200 TEST_DESCRIPTION(
9201 "Attempt to update buffer descriptor set that has incorrect "
9202 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
9203 "1. offset value greater than buffer size\n"
9204 "2. range value of 0\n"
9205 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009206 VkResult err;
9207
9208 ASSERT_NO_FATAL_FAILURE(InitState());
9209 VkDescriptorPoolSize ds_type_count = {};
9210 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9211 ds_type_count.descriptorCount = 1;
9212
9213 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9214 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9215 ds_pool_ci.pNext = NULL;
9216 ds_pool_ci.maxSets = 1;
9217 ds_pool_ci.poolSizeCount = 1;
9218 ds_pool_ci.pPoolSizes = &ds_type_count;
9219
9220 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009221 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009222 ASSERT_VK_SUCCESS(err);
9223
9224 // Create layout with single uniform buffer descriptor
9225 VkDescriptorSetLayoutBinding dsl_binding = {};
9226 dsl_binding.binding = 0;
9227 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9228 dsl_binding.descriptorCount = 1;
9229 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9230 dsl_binding.pImmutableSamplers = NULL;
9231
9232 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9233 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9234 ds_layout_ci.pNext = NULL;
9235 ds_layout_ci.bindingCount = 1;
9236 ds_layout_ci.pBindings = &dsl_binding;
9237 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009238 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009239 ASSERT_VK_SUCCESS(err);
9240
9241 VkDescriptorSet descriptor_set = {};
9242 VkDescriptorSetAllocateInfo alloc_info = {};
9243 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9244 alloc_info.descriptorSetCount = 1;
9245 alloc_info.descriptorPool = ds_pool;
9246 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009247 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009248 ASSERT_VK_SUCCESS(err);
9249
9250 // Create a buffer to be used for invalid updates
9251 VkBufferCreateInfo buff_ci = {};
9252 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9253 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9254 buff_ci.size = 256;
9255 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9256 VkBuffer buffer;
9257 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9258 ASSERT_VK_SUCCESS(err);
9259 // Have to bind memory to buffer before descriptor update
9260 VkMemoryAllocateInfo mem_alloc = {};
9261 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9262 mem_alloc.pNext = NULL;
9263 mem_alloc.allocationSize = 256;
9264 mem_alloc.memoryTypeIndex = 0;
9265
9266 VkMemoryRequirements mem_reqs;
9267 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009268 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009269 if (!pass) {
9270 vkDestroyBuffer(m_device->device(), buffer, NULL);
9271 return;
9272 }
9273
9274 VkDeviceMemory mem;
9275 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9276 ASSERT_VK_SUCCESS(err);
9277 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9278 ASSERT_VK_SUCCESS(err);
9279
9280 VkDescriptorBufferInfo buff_info = {};
9281 buff_info.buffer = buffer;
9282 // First make offset 1 larger than buffer size
9283 buff_info.offset = 257;
9284 buff_info.range = VK_WHOLE_SIZE;
9285 VkWriteDescriptorSet descriptor_write = {};
9286 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9287 descriptor_write.dstBinding = 0;
9288 descriptor_write.descriptorCount = 1;
9289 descriptor_write.pTexelBufferView = nullptr;
9290 descriptor_write.pBufferInfo = &buff_info;
9291 descriptor_write.pImageInfo = nullptr;
9292
9293 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9294 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009295 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009296
9297 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9298
9299 m_errorMonitor->VerifyFound();
9300 // Now cause error due to range of 0
9301 buff_info.offset = 0;
9302 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009303 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009304
9305 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9306
9307 m_errorMonitor->VerifyFound();
9308 // Now cause error due to range exceeding buffer size - offset
9309 buff_info.offset = 128;
9310 buff_info.range = 200;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009311 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009312
9313 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9314
9315 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009316 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009317 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9318 vkDestroyBuffer(m_device->device(), buffer, NULL);
9319 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9320 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9321}
9322
Tobin Ehlis845887e2017-02-02 19:01:44 -07009323TEST_F(VkLayerTest, DSBufferLimitErrors) {
9324 TEST_DESCRIPTION(
9325 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
9326 "Test cases include:\n"
9327 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
9328 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
9329 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
9330 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
9331 VkResult err;
9332
9333 ASSERT_NO_FATAL_FAILURE(InitState());
9334 VkDescriptorPoolSize ds_type_count[2] = {};
9335 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9336 ds_type_count[0].descriptorCount = 1;
9337 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9338 ds_type_count[1].descriptorCount = 1;
9339
9340 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9341 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9342 ds_pool_ci.pNext = NULL;
9343 ds_pool_ci.maxSets = 1;
9344 ds_pool_ci.poolSizeCount = 2;
9345 ds_pool_ci.pPoolSizes = ds_type_count;
9346
9347 VkDescriptorPool ds_pool;
9348 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9349 ASSERT_VK_SUCCESS(err);
9350
9351 // Create layout with single uniform buffer & single storage buffer descriptor
9352 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
9353 dsl_binding[0].binding = 0;
9354 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9355 dsl_binding[0].descriptorCount = 1;
9356 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9357 dsl_binding[0].pImmutableSamplers = NULL;
9358 dsl_binding[1].binding = 1;
9359 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9360 dsl_binding[1].descriptorCount = 1;
9361 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9362 dsl_binding[1].pImmutableSamplers = NULL;
9363
9364 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9365 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9366 ds_layout_ci.pNext = NULL;
9367 ds_layout_ci.bindingCount = 2;
9368 ds_layout_ci.pBindings = dsl_binding;
9369 VkDescriptorSetLayout ds_layout;
9370 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9371 ASSERT_VK_SUCCESS(err);
9372
9373 VkDescriptorSet descriptor_set = {};
9374 VkDescriptorSetAllocateInfo alloc_info = {};
9375 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9376 alloc_info.descriptorSetCount = 1;
9377 alloc_info.descriptorPool = ds_pool;
9378 alloc_info.pSetLayouts = &ds_layout;
9379 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9380 ASSERT_VK_SUCCESS(err);
9381
9382 // Create a buffer to be used for invalid updates
9383 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
9384 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
9385 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
9386 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
9387 VkBufferCreateInfo ub_ci = {};
9388 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9389 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9390 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
9391 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9392 VkBuffer uniform_buffer;
9393 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
9394 ASSERT_VK_SUCCESS(err);
9395 VkBufferCreateInfo sb_ci = {};
9396 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9397 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
9398 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
9399 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9400 VkBuffer storage_buffer;
9401 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
9402 ASSERT_VK_SUCCESS(err);
9403 // Have to bind memory to buffer before descriptor update
9404 VkMemoryAllocateInfo mem_alloc = {};
9405 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9406 mem_alloc.pNext = NULL;
9407 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
9408 mem_alloc.memoryTypeIndex = 0;
9409
9410 VkMemoryRequirements mem_reqs;
9411 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &mem_reqs);
9412 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9413 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &mem_reqs);
9414 pass &= m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9415 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -07009416 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009417 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009418 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9419 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009420 return;
9421 }
9422
9423 VkDeviceMemory mem;
9424 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009425 if (VK_SUCCESS != err) {
9426 printf("Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
9427 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9428 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9429 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9430 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9431 return;
9432 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009433 ASSERT_VK_SUCCESS(err);
9434 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
9435 ASSERT_VK_SUCCESS(err);
9436 auto sb_offset = ub_ci.size + 1024;
9437 // Verify offset alignment, I know there's a bit trick to do this but it escapes me
9438 sb_offset = (sb_offset % mem_reqs.alignment) ? sb_offset - (sb_offset % mem_reqs.alignment) : sb_offset;
9439 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
9440 ASSERT_VK_SUCCESS(err);
9441
9442 VkDescriptorBufferInfo buff_info = {};
9443 buff_info.buffer = uniform_buffer;
9444 buff_info.range = ub_ci.size; // This will exceed limit
9445 VkWriteDescriptorSet descriptor_write = {};
9446 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9447 descriptor_write.dstBinding = 0;
9448 descriptor_write.descriptorCount = 1;
9449 descriptor_write.pTexelBufferView = nullptr;
9450 descriptor_write.pBufferInfo = &buff_info;
9451 descriptor_write.pImageInfo = nullptr;
9452
9453 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9454 descriptor_write.dstSet = descriptor_set;
9455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
9456 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9457 m_errorMonitor->VerifyFound();
9458
9459 // Reduce size of range to acceptable limit & cause offset error
9460 buff_info.range = max_ub_range;
9461 buff_info.offset = min_ub_align - 1;
9462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
9463 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9464 m_errorMonitor->VerifyFound();
9465
9466 // Now break storage updates
9467 buff_info.buffer = storage_buffer;
9468 buff_info.range = sb_ci.size; // This will exceed limit
9469 buff_info.offset = 0; // Reset offset for this update
9470
9471 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9472 descriptor_write.dstBinding = 1;
9473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
9474 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9475 m_errorMonitor->VerifyFound();
9476
9477 // Reduce size of range to acceptable limit & cause offset error
9478 buff_info.range = max_sb_range;
9479 buff_info.offset = min_sb_align - 1;
9480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
9481 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9482 m_errorMonitor->VerifyFound();
9483
9484 vkFreeMemory(m_device->device(), mem, NULL);
9485 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9486 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9487 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9488 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9489}
9490
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009491TEST_F(VkLayerTest, DSAspectBitsErrors) {
9492 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9493 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009494 TEST_DESCRIPTION(
9495 "Attempt to update descriptor sets for images "
9496 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009497 VkResult err;
9498
9499 ASSERT_NO_FATAL_FAILURE(InitState());
9500 VkDescriptorPoolSize ds_type_count = {};
9501 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9502 ds_type_count.descriptorCount = 1;
9503
9504 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9505 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9506 ds_pool_ci.pNext = NULL;
9507 ds_pool_ci.maxSets = 5;
9508 ds_pool_ci.poolSizeCount = 1;
9509 ds_pool_ci.pPoolSizes = &ds_type_count;
9510
9511 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009512 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009513 ASSERT_VK_SUCCESS(err);
9514
9515 VkDescriptorSetLayoutBinding dsl_binding = {};
9516 dsl_binding.binding = 0;
9517 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9518 dsl_binding.descriptorCount = 1;
9519 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9520 dsl_binding.pImmutableSamplers = NULL;
9521
9522 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9523 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9524 ds_layout_ci.pNext = NULL;
9525 ds_layout_ci.bindingCount = 1;
9526 ds_layout_ci.pBindings = &dsl_binding;
9527 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009528 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009529 ASSERT_VK_SUCCESS(err);
9530
9531 VkDescriptorSet descriptor_set = {};
9532 VkDescriptorSetAllocateInfo alloc_info = {};
9533 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9534 alloc_info.descriptorSetCount = 1;
9535 alloc_info.descriptorPool = ds_pool;
9536 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009537 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009538 ASSERT_VK_SUCCESS(err);
9539
9540 // Create an image to be used for invalid updates
9541 VkImageCreateInfo image_ci = {};
9542 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9543 image_ci.imageType = VK_IMAGE_TYPE_2D;
9544 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9545 image_ci.extent.width = 64;
9546 image_ci.extent.height = 64;
9547 image_ci.extent.depth = 1;
9548 image_ci.mipLevels = 1;
9549 image_ci.arrayLayers = 1;
9550 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
9551 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9552 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9553 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9554 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9555 VkImage image;
9556 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9557 ASSERT_VK_SUCCESS(err);
9558 // Bind memory to image
9559 VkMemoryRequirements mem_reqs;
9560 VkDeviceMemory image_mem;
9561 bool pass;
9562 VkMemoryAllocateInfo mem_alloc = {};
9563 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9564 mem_alloc.pNext = NULL;
9565 mem_alloc.allocationSize = 0;
9566 mem_alloc.memoryTypeIndex = 0;
9567 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9568 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009569 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009570 ASSERT_TRUE(pass);
9571 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9572 ASSERT_VK_SUCCESS(err);
9573 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9574 ASSERT_VK_SUCCESS(err);
9575 // Now create view for image
9576 VkImageViewCreateInfo image_view_ci = {};
9577 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9578 image_view_ci.image = image;
9579 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9580 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9581 image_view_ci.subresourceRange.layerCount = 1;
9582 image_view_ci.subresourceRange.baseArrayLayer = 0;
9583 image_view_ci.subresourceRange.levelCount = 1;
9584 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009585 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009586
9587 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009588 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009589 ASSERT_VK_SUCCESS(err);
9590
9591 VkDescriptorImageInfo img_info = {};
9592 img_info.imageView = image_view;
9593 VkWriteDescriptorSet descriptor_write = {};
9594 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9595 descriptor_write.dstBinding = 0;
9596 descriptor_write.descriptorCount = 1;
9597 descriptor_write.pTexelBufferView = NULL;
9598 descriptor_write.pBufferInfo = NULL;
9599 descriptor_write.pImageInfo = &img_info;
9600 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9601 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009602 const char *error_msg =
9603 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
9604 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009605 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009606
9607 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9608
9609 m_errorMonitor->VerifyFound();
9610 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9611 vkDestroyImage(m_device->device(), image, NULL);
9612 vkFreeMemory(m_device->device(), image_mem, NULL);
9613 vkDestroyImageView(m_device->device(), image_view, NULL);
9614 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9615 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9616}
9617
Karl Schultz6addd812016-02-02 17:17:23 -07009618TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009619 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07009620 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009621
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009622 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9623 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
9624 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009625
Tobin Ehlis3b780662015-05-28 12:11:26 -06009626 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009627 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009628 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009629 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9630 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009631
9632 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009633 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9634 ds_pool_ci.pNext = NULL;
9635 ds_pool_ci.maxSets = 1;
9636 ds_pool_ci.poolSizeCount = 1;
9637 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009638
Tobin Ehlis3b780662015-05-28 12:11:26 -06009639 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009640 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009641 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009642 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009643 dsl_binding.binding = 0;
9644 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9645 dsl_binding.descriptorCount = 1;
9646 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9647 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009648
Tony Barboureb254902015-07-15 12:50:33 -06009649 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009650 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9651 ds_layout_ci.pNext = NULL;
9652 ds_layout_ci.bindingCount = 1;
9653 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009654
Tobin Ehlis3b780662015-05-28 12:11:26 -06009655 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009656 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009657 ASSERT_VK_SUCCESS(err);
9658
9659 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009660 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009661 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009662 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009663 alloc_info.descriptorPool = ds_pool;
9664 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009665 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009666 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009667
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009668 VkSamplerCreateInfo sampler_ci = {};
9669 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9670 sampler_ci.pNext = NULL;
9671 sampler_ci.magFilter = VK_FILTER_NEAREST;
9672 sampler_ci.minFilter = VK_FILTER_NEAREST;
9673 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9674 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9675 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9676 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9677 sampler_ci.mipLodBias = 1.0;
9678 sampler_ci.anisotropyEnable = VK_FALSE;
9679 sampler_ci.maxAnisotropy = 1;
9680 sampler_ci.compareEnable = VK_FALSE;
9681 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9682 sampler_ci.minLod = 1.0;
9683 sampler_ci.maxLod = 1.0;
9684 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9685 sampler_ci.unnormalizedCoordinates = VK_FALSE;
9686 VkSampler sampler;
9687 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
9688 ASSERT_VK_SUCCESS(err);
9689
9690 VkDescriptorImageInfo info = {};
9691 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009692
9693 VkWriteDescriptorSet descriptor_write;
9694 memset(&descriptor_write, 0, sizeof(descriptor_write));
9695 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009696 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009697 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009698 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009699 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009700 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009701
9702 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9703
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009704 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009705
Chia-I Wuf7458c52015-10-26 21:10:41 +08009706 vkDestroySampler(m_device->device(), sampler, NULL);
9707 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9708 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009709}
9710
Karl Schultz6addd812016-02-02 17:17:23 -07009711TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009712 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07009713 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009714
Tobin Ehlisf922ef82016-11-30 10:19:14 -07009715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009716
Tobin Ehlis3b780662015-05-28 12:11:26 -06009717 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009718 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009719 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009720 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9721 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009722
9723 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009724 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9725 ds_pool_ci.pNext = NULL;
9726 ds_pool_ci.maxSets = 1;
9727 ds_pool_ci.poolSizeCount = 1;
9728 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009729
Tobin Ehlis3b780662015-05-28 12:11:26 -06009730 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009731 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009732 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009733
Tony Barboureb254902015-07-15 12:50:33 -06009734 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009735 dsl_binding.binding = 0;
9736 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9737 dsl_binding.descriptorCount = 1;
9738 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9739 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06009740
9741 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009742 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9743 ds_layout_ci.pNext = NULL;
9744 ds_layout_ci.bindingCount = 1;
9745 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009746
Tobin Ehlis3b780662015-05-28 12:11:26 -06009747 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009748 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009749 ASSERT_VK_SUCCESS(err);
9750
9751 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009752 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009753 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009754 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009755 alloc_info.descriptorPool = ds_pool;
9756 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009757 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009758 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009759
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009760 // Correctly update descriptor to avoid "NOT_UPDATED" error
9761 VkDescriptorBufferInfo buff_info = {};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009762 buff_info.buffer = VkBuffer(0); // Don't care about buffer handle for this test
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009763 buff_info.offset = 0;
9764 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009765
9766 VkWriteDescriptorSet descriptor_write;
9767 memset(&descriptor_write, 0, sizeof(descriptor_write));
9768 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009769 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009770 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08009771 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06009772 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9773 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009774
9775 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9776
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009777 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009778
Chia-I Wuf7458c52015-10-26 21:10:41 +08009779 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9780 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009781}
9782
Karl Schultz6addd812016-02-02 17:17:23 -07009783TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -07009784 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -07009785 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009786
Tobin Ehlisc8d352d2016-11-21 10:33:40 -07009787 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009788
Tobin Ehlis3b780662015-05-28 12:11:26 -06009789 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009790 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009791 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009792 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9793 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009794
9795 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009796 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9797 ds_pool_ci.pNext = NULL;
9798 ds_pool_ci.maxSets = 1;
9799 ds_pool_ci.poolSizeCount = 1;
9800 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009801
Tobin Ehlis3b780662015-05-28 12:11:26 -06009802 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009803 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009804 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009805
Tony Barboureb254902015-07-15 12:50:33 -06009806 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009807 dsl_binding.binding = 0;
9808 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9809 dsl_binding.descriptorCount = 1;
9810 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9811 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06009812
9813 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009814 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9815 ds_layout_ci.pNext = NULL;
9816 ds_layout_ci.bindingCount = 1;
9817 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009818 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009819 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009820 ASSERT_VK_SUCCESS(err);
9821
9822 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009823 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009824 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009825 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009826 alloc_info.descriptorPool = ds_pool;
9827 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009828 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009829 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009830
Tony Barboureb254902015-07-15 12:50:33 -06009831 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009832 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9833 sampler_ci.pNext = NULL;
9834 sampler_ci.magFilter = VK_FILTER_NEAREST;
9835 sampler_ci.minFilter = VK_FILTER_NEAREST;
9836 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9837 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9838 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9839 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9840 sampler_ci.mipLodBias = 1.0;
9841 sampler_ci.anisotropyEnable = VK_FALSE;
9842 sampler_ci.maxAnisotropy = 1;
9843 sampler_ci.compareEnable = VK_FALSE;
9844 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9845 sampler_ci.minLod = 1.0;
9846 sampler_ci.maxLod = 1.0;
9847 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9848 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06009849
Tobin Ehlis3b780662015-05-28 12:11:26 -06009850 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009851 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009852 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009853
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009854 VkDescriptorImageInfo info = {};
9855 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009856
9857 VkWriteDescriptorSet descriptor_write;
9858 memset(&descriptor_write, 0, sizeof(descriptor_write));
9859 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009860 descriptor_write.dstSet = descriptorSet;
9861 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009862 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009863 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009864 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009865 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009866
9867 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9868
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009869 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009870
Chia-I Wuf7458c52015-10-26 21:10:41 +08009871 vkDestroySampler(m_device->device(), sampler, NULL);
9872 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9873 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009874}
9875
Tobin Ehlise202b2d2016-11-21 10:36:16 -07009876TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
9877 // Create layout w/ empty binding and attempt to update it
9878 VkResult err;
9879
9880 ASSERT_NO_FATAL_FAILURE(InitState());
9881
9882 VkDescriptorPoolSize ds_type_count = {};
9883 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
9884 ds_type_count.descriptorCount = 1;
9885
9886 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9887 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9888 ds_pool_ci.pNext = NULL;
9889 ds_pool_ci.maxSets = 1;
9890 ds_pool_ci.poolSizeCount = 1;
9891 ds_pool_ci.pPoolSizes = &ds_type_count;
9892
9893 VkDescriptorPool ds_pool;
9894 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9895 ASSERT_VK_SUCCESS(err);
9896
9897 VkDescriptorSetLayoutBinding dsl_binding = {};
9898 dsl_binding.binding = 0;
9899 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9900 dsl_binding.descriptorCount = 0;
9901 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9902 dsl_binding.pImmutableSamplers = NULL;
9903
9904 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9905 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9906 ds_layout_ci.pNext = NULL;
9907 ds_layout_ci.bindingCount = 1;
9908 ds_layout_ci.pBindings = &dsl_binding;
9909 VkDescriptorSetLayout ds_layout;
9910 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9911 ASSERT_VK_SUCCESS(err);
9912
9913 VkDescriptorSet descriptor_set;
9914 VkDescriptorSetAllocateInfo alloc_info = {};
9915 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9916 alloc_info.descriptorSetCount = 1;
9917 alloc_info.descriptorPool = ds_pool;
9918 alloc_info.pSetLayouts = &ds_layout;
9919 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9920 ASSERT_VK_SUCCESS(err);
9921
9922 VkSamplerCreateInfo sampler_ci = {};
9923 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9924 sampler_ci.magFilter = VK_FILTER_NEAREST;
9925 sampler_ci.minFilter = VK_FILTER_NEAREST;
9926 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9927 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9928 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9929 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9930 sampler_ci.mipLodBias = 1.0;
9931 sampler_ci.maxAnisotropy = 1;
9932 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9933 sampler_ci.minLod = 1.0;
9934 sampler_ci.maxLod = 1.0;
9935 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9936
9937 VkSampler sampler;
9938 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
9939 ASSERT_VK_SUCCESS(err);
9940
9941 VkDescriptorImageInfo info = {};
9942 info.sampler = sampler;
9943
9944 VkWriteDescriptorSet descriptor_write;
9945 memset(&descriptor_write, 0, sizeof(descriptor_write));
9946 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9947 descriptor_write.dstSet = descriptor_set;
9948 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009949 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -07009950 // This is the wrong type, but empty binding error will be flagged first
9951 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9952 descriptor_write.pImageInfo = &info;
9953
9954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
9955 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9956 m_errorMonitor->VerifyFound();
9957
9958 vkDestroySampler(m_device->device(), sampler, NULL);
9959 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9960 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9961}
9962
Karl Schultz6addd812016-02-02 17:17:23 -07009963TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
9964 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
9965 // types
9966 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009967
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009968 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 -06009969
Tobin Ehlis3b780662015-05-28 12:11:26 -06009970 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009971
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009972 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009973 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9974 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009975
9976 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009977 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9978 ds_pool_ci.pNext = NULL;
9979 ds_pool_ci.maxSets = 1;
9980 ds_pool_ci.poolSizeCount = 1;
9981 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009982
Tobin Ehlis3b780662015-05-28 12:11:26 -06009983 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009984 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009985 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009986 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009987 dsl_binding.binding = 0;
9988 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9989 dsl_binding.descriptorCount = 1;
9990 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9991 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009992
Tony Barboureb254902015-07-15 12:50:33 -06009993 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009994 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9995 ds_layout_ci.pNext = NULL;
9996 ds_layout_ci.bindingCount = 1;
9997 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009998
Tobin Ehlis3b780662015-05-28 12:11:26 -06009999 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010000 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010001 ASSERT_VK_SUCCESS(err);
10002
10003 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010004 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010005 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010006 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010007 alloc_info.descriptorPool = ds_pool;
10008 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010009 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010010 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010011
Tony Barboureb254902015-07-15 12:50:33 -060010012 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010013 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10014 sampler_ci.pNext = NULL;
10015 sampler_ci.magFilter = VK_FILTER_NEAREST;
10016 sampler_ci.minFilter = VK_FILTER_NEAREST;
10017 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10018 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10019 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10020 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10021 sampler_ci.mipLodBias = 1.0;
10022 sampler_ci.anisotropyEnable = VK_FALSE;
10023 sampler_ci.maxAnisotropy = 1;
10024 sampler_ci.compareEnable = VK_FALSE;
10025 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10026 sampler_ci.minLod = 1.0;
10027 sampler_ci.maxLod = 1.0;
10028 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10029 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010030 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010031 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010032 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010033
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010034 VkDescriptorImageInfo info = {};
10035 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010036
10037 VkWriteDescriptorSet descriptor_write;
10038 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010039 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010040 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010041 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010042 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010043 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010044 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010045
10046 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10047
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010048 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010049
Chia-I Wuf7458c52015-10-26 21:10:41 +080010050 vkDestroySampler(m_device->device(), sampler, NULL);
10051 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10052 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010053}
10054
Karl Schultz6addd812016-02-02 17:17:23 -070010055TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010056 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010057 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010058
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010060
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010061 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010062 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10063 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010064 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010065 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10066 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010067
10068 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010069 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10070 ds_pool_ci.pNext = NULL;
10071 ds_pool_ci.maxSets = 1;
10072 ds_pool_ci.poolSizeCount = 1;
10073 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010074
10075 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010076 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010077 ASSERT_VK_SUCCESS(err);
10078
10079 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010080 dsl_binding.binding = 0;
10081 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10082 dsl_binding.descriptorCount = 1;
10083 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10084 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010085
10086 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010087 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10088 ds_layout_ci.pNext = NULL;
10089 ds_layout_ci.bindingCount = 1;
10090 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010091 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010092 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010093 ASSERT_VK_SUCCESS(err);
10094
10095 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010096 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010097 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010098 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010099 alloc_info.descriptorPool = ds_pool;
10100 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010101 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010102 ASSERT_VK_SUCCESS(err);
10103
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010104 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010105
10106 VkDescriptorImageInfo descriptor_info;
10107 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10108 descriptor_info.sampler = sampler;
10109
10110 VkWriteDescriptorSet descriptor_write;
10111 memset(&descriptor_write, 0, sizeof(descriptor_write));
10112 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010113 descriptor_write.dstSet = descriptorSet;
10114 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010115 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010116 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10117 descriptor_write.pImageInfo = &descriptor_info;
10118
10119 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10120
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010121 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010122
Chia-I Wuf7458c52015-10-26 21:10:41 +080010123 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10124 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010125}
10126
Karl Schultz6addd812016-02-02 17:17:23 -070010127TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10128 // Create a single combined Image/Sampler descriptor and send it an invalid
10129 // imageView
10130 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010131
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010133
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010134 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010135 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010136 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10137 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010138
10139 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010140 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10141 ds_pool_ci.pNext = NULL;
10142 ds_pool_ci.maxSets = 1;
10143 ds_pool_ci.poolSizeCount = 1;
10144 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010145
10146 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010147 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010148 ASSERT_VK_SUCCESS(err);
10149
10150 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010151 dsl_binding.binding = 0;
10152 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10153 dsl_binding.descriptorCount = 1;
10154 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10155 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010156
10157 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010158 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10159 ds_layout_ci.pNext = NULL;
10160 ds_layout_ci.bindingCount = 1;
10161 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010162 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010163 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010164 ASSERT_VK_SUCCESS(err);
10165
10166 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010167 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010168 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010169 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010170 alloc_info.descriptorPool = ds_pool;
10171 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010172 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010173 ASSERT_VK_SUCCESS(err);
10174
10175 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010176 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10177 sampler_ci.pNext = NULL;
10178 sampler_ci.magFilter = VK_FILTER_NEAREST;
10179 sampler_ci.minFilter = VK_FILTER_NEAREST;
10180 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10181 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10182 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10183 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10184 sampler_ci.mipLodBias = 1.0;
10185 sampler_ci.anisotropyEnable = VK_FALSE;
10186 sampler_ci.maxAnisotropy = 1;
10187 sampler_ci.compareEnable = VK_FALSE;
10188 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10189 sampler_ci.minLod = 1.0;
10190 sampler_ci.maxLod = 1.0;
10191 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10192 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010193
10194 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010195 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010196 ASSERT_VK_SUCCESS(err);
10197
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010198 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010199
10200 VkDescriptorImageInfo descriptor_info;
10201 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10202 descriptor_info.sampler = sampler;
10203 descriptor_info.imageView = view;
10204
10205 VkWriteDescriptorSet descriptor_write;
10206 memset(&descriptor_write, 0, sizeof(descriptor_write));
10207 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010208 descriptor_write.dstSet = descriptorSet;
10209 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010210 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010211 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10212 descriptor_write.pImageInfo = &descriptor_info;
10213
10214 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10215
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010216 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010217
Chia-I Wuf7458c52015-10-26 21:10:41 +080010218 vkDestroySampler(m_device->device(), sampler, NULL);
10219 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10220 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010221}
10222
Karl Schultz6addd812016-02-02 17:17:23 -070010223TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10224 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10225 // into the other
10226 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010227
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10229 " binding #1 with type "
10230 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10231 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010232
Tobin Ehlis04356f92015-10-27 16:35:27 -060010233 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010234 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010235 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010236 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10237 ds_type_count[0].descriptorCount = 1;
10238 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10239 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010240
10241 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010242 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10243 ds_pool_ci.pNext = NULL;
10244 ds_pool_ci.maxSets = 1;
10245 ds_pool_ci.poolSizeCount = 2;
10246 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010247
10248 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010249 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010250 ASSERT_VK_SUCCESS(err);
10251 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010252 dsl_binding[0].binding = 0;
10253 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10254 dsl_binding[0].descriptorCount = 1;
10255 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10256 dsl_binding[0].pImmutableSamplers = NULL;
10257 dsl_binding[1].binding = 1;
10258 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10259 dsl_binding[1].descriptorCount = 1;
10260 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10261 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010262
10263 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010264 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10265 ds_layout_ci.pNext = NULL;
10266 ds_layout_ci.bindingCount = 2;
10267 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010268
10269 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010270 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010271 ASSERT_VK_SUCCESS(err);
10272
10273 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010274 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010275 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010276 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010277 alloc_info.descriptorPool = ds_pool;
10278 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010279 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010280 ASSERT_VK_SUCCESS(err);
10281
10282 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010283 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10284 sampler_ci.pNext = NULL;
10285 sampler_ci.magFilter = VK_FILTER_NEAREST;
10286 sampler_ci.minFilter = VK_FILTER_NEAREST;
10287 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10288 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10289 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10290 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10291 sampler_ci.mipLodBias = 1.0;
10292 sampler_ci.anisotropyEnable = VK_FALSE;
10293 sampler_ci.maxAnisotropy = 1;
10294 sampler_ci.compareEnable = VK_FALSE;
10295 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10296 sampler_ci.minLod = 1.0;
10297 sampler_ci.maxLod = 1.0;
10298 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10299 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010300
10301 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010302 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010303 ASSERT_VK_SUCCESS(err);
10304
10305 VkDescriptorImageInfo info = {};
10306 info.sampler = sampler;
10307
10308 VkWriteDescriptorSet descriptor_write;
10309 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10310 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010311 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010312 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010313 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010314 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10315 descriptor_write.pImageInfo = &info;
10316 // This write update should succeed
10317 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10318 // Now perform a copy update that fails due to type mismatch
10319 VkCopyDescriptorSet copy_ds_update;
10320 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10321 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10322 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010323 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010324 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010325 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
10326 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010327 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10328
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010329 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010330 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010331 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 -060010332 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10333 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10334 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010335 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010336 copy_ds_update.dstSet = descriptorSet;
10337 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010338 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010339 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10340
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010341 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010342
Tobin Ehlis04356f92015-10-27 16:35:27 -060010343 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10345 " binding#1 with offset index of 1 plus "
10346 "update array offset of 0 and update of "
10347 "5 descriptors oversteps total number "
10348 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010349
Tobin Ehlis04356f92015-10-27 16:35:27 -060010350 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10351 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10352 copy_ds_update.srcSet = descriptorSet;
10353 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010354 copy_ds_update.dstSet = descriptorSet;
10355 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010356 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010357 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10358
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010359 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010360
Chia-I Wuf7458c52015-10-26 21:10:41 +080010361 vkDestroySampler(m_device->device(), sampler, NULL);
10362 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10363 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010364}
10365
Karl Schultz6addd812016-02-02 17:17:23 -070010366TEST_F(VkLayerTest, NumSamplesMismatch) {
10367 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10368 // sampleCount
10369 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010370
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010372
Tobin Ehlis3b780662015-05-28 12:11:26 -060010373 ASSERT_NO_FATAL_FAILURE(InitState());
10374 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010375 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010376 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010377 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010378
10379 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010380 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10381 ds_pool_ci.pNext = NULL;
10382 ds_pool_ci.maxSets = 1;
10383 ds_pool_ci.poolSizeCount = 1;
10384 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010385
Tobin Ehlis3b780662015-05-28 12:11:26 -060010386 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010387 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010388 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010389
Tony Barboureb254902015-07-15 12:50:33 -060010390 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010391 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010392 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010393 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010394 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10395 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010396
Tony Barboureb254902015-07-15 12:50:33 -060010397 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10398 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10399 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010400 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010401 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010402
Tobin Ehlis3b780662015-05-28 12:11:26 -060010403 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010404 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010405 ASSERT_VK_SUCCESS(err);
10406
10407 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010408 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010409 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010410 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010411 alloc_info.descriptorPool = ds_pool;
10412 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010413 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010414 ASSERT_VK_SUCCESS(err);
10415
Tony Barboureb254902015-07-15 12:50:33 -060010416 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010417 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010418 pipe_ms_state_ci.pNext = NULL;
10419 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10420 pipe_ms_state_ci.sampleShadingEnable = 0;
10421 pipe_ms_state_ci.minSampleShading = 1.0;
10422 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010423
Tony Barboureb254902015-07-15 12:50:33 -060010424 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010425 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10426 pipeline_layout_ci.pNext = NULL;
10427 pipeline_layout_ci.setLayoutCount = 1;
10428 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010429
10430 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010431 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010432 ASSERT_VK_SUCCESS(err);
10433
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010434 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010435 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 -060010436 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010437 VkPipelineObj pipe(m_device);
10438 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010439 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010440 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010441 pipe.SetMSAA(&pipe_ms_state_ci);
10442 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010443
Tony Barbour552f6c02016-12-21 14:34:07 -070010444 m_commandBuffer->BeginCommandBuffer();
10445 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010446 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010447
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070010448 VkViewport viewport = {0, 0, 16, 16, 0, 1};
10449 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
10450 VkRect2D scissor = {{0, 0}, {16, 16}};
10451 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
10452
Mark Young29927482016-05-04 14:38:51 -060010453 // Render triangle (the error should trigger on the attempt to draw).
10454 Draw(3, 1, 0, 0);
10455
10456 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010457 m_commandBuffer->EndRenderPass();
10458 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060010459
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010460 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010461
Chia-I Wuf7458c52015-10-26 21:10:41 +080010462 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10463 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10464 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010465}
Mark Young29927482016-05-04 14:38:51 -060010466
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010467TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010468 TEST_DESCRIPTION(
10469 "Hit RenderPass incompatible cases. "
10470 "Initial case is drawing with an active renderpass that's "
10471 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010472 VkResult err;
10473
10474 ASSERT_NO_FATAL_FAILURE(InitState());
10475 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10476
10477 VkDescriptorSetLayoutBinding dsl_binding = {};
10478 dsl_binding.binding = 0;
10479 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10480 dsl_binding.descriptorCount = 1;
10481 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10482 dsl_binding.pImmutableSamplers = NULL;
10483
10484 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10485 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10486 ds_layout_ci.pNext = NULL;
10487 ds_layout_ci.bindingCount = 1;
10488 ds_layout_ci.pBindings = &dsl_binding;
10489
10490 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010491 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010492 ASSERT_VK_SUCCESS(err);
10493
10494 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10495 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10496 pipeline_layout_ci.pNext = NULL;
10497 pipeline_layout_ci.setLayoutCount = 1;
10498 pipeline_layout_ci.pSetLayouts = &ds_layout;
10499
10500 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010501 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010502 ASSERT_VK_SUCCESS(err);
10503
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010504 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010505 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 -060010506 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010507 // Create a renderpass that will be incompatible with default renderpass
10508 VkAttachmentReference attach = {};
10509 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
10510 VkAttachmentReference color_att = {};
10511 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10512 VkSubpassDescription subpass = {};
10513 subpass.inputAttachmentCount = 1;
10514 subpass.pInputAttachments = &attach;
10515 subpass.colorAttachmentCount = 1;
10516 subpass.pColorAttachments = &color_att;
10517 VkRenderPassCreateInfo rpci = {};
10518 rpci.subpassCount = 1;
10519 rpci.pSubpasses = &subpass;
10520 rpci.attachmentCount = 1;
10521 VkAttachmentDescription attach_desc = {};
10522 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060010523 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
10524 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010525 rpci.pAttachments = &attach_desc;
10526 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
10527 VkRenderPass rp;
10528 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10529 VkPipelineObj pipe(m_device);
10530 pipe.AddShader(&vs);
10531 pipe.AddShader(&fs);
10532 pipe.AddColorAttachment();
10533 VkViewport view_port = {};
10534 m_viewports.push_back(view_port);
10535 pipe.SetViewport(m_viewports);
10536 VkRect2D rect = {};
10537 m_scissors.push_back(rect);
10538 pipe.SetScissor(m_scissors);
10539 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10540
10541 VkCommandBufferInheritanceInfo cbii = {};
10542 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
10543 cbii.renderPass = rp;
10544 cbii.subpass = 0;
10545 VkCommandBufferBeginInfo cbbi = {};
10546 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
10547 cbbi.pInheritanceInfo = &cbii;
10548 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
10549 VkRenderPassBeginInfo rpbi = {};
10550 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
10551 rpbi.framebuffer = m_framebuffer;
10552 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010553 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
10554 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010555
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010556 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010557 // Render triangle (the error should trigger on the attempt to draw).
10558 Draw(3, 1, 0, 0);
10559
10560 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010561 m_commandBuffer->EndRenderPass();
10562 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010563
10564 m_errorMonitor->VerifyFound();
10565
10566 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10567 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10568 vkDestroyRenderPass(m_device->device(), rp, NULL);
10569}
10570
Mark Youngc89c6312016-03-31 16:03:20 -060010571TEST_F(VkLayerTest, NumBlendAttachMismatch) {
10572 // Create Pipeline where the number of blend attachments doesn't match the
10573 // number of color attachments. In this case, we don't add any color
10574 // blend attachments even though we have a color attachment.
10575 VkResult err;
10576
Tobin Ehlis974c0d92017-02-01 13:31:22 -070010577 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060010578
10579 ASSERT_NO_FATAL_FAILURE(InitState());
10580 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10581 VkDescriptorPoolSize ds_type_count = {};
10582 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10583 ds_type_count.descriptorCount = 1;
10584
10585 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10586 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10587 ds_pool_ci.pNext = NULL;
10588 ds_pool_ci.maxSets = 1;
10589 ds_pool_ci.poolSizeCount = 1;
10590 ds_pool_ci.pPoolSizes = &ds_type_count;
10591
10592 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010593 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060010594 ASSERT_VK_SUCCESS(err);
10595
10596 VkDescriptorSetLayoutBinding dsl_binding = {};
10597 dsl_binding.binding = 0;
10598 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10599 dsl_binding.descriptorCount = 1;
10600 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10601 dsl_binding.pImmutableSamplers = NULL;
10602
10603 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10604 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10605 ds_layout_ci.pNext = NULL;
10606 ds_layout_ci.bindingCount = 1;
10607 ds_layout_ci.pBindings = &dsl_binding;
10608
10609 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010610 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060010611 ASSERT_VK_SUCCESS(err);
10612
10613 VkDescriptorSet descriptorSet;
10614 VkDescriptorSetAllocateInfo alloc_info = {};
10615 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10616 alloc_info.descriptorSetCount = 1;
10617 alloc_info.descriptorPool = ds_pool;
10618 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010619 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060010620 ASSERT_VK_SUCCESS(err);
10621
10622 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010623 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060010624 pipe_ms_state_ci.pNext = NULL;
10625 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10626 pipe_ms_state_ci.sampleShadingEnable = 0;
10627 pipe_ms_state_ci.minSampleShading = 1.0;
10628 pipe_ms_state_ci.pSampleMask = NULL;
10629
10630 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10631 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10632 pipeline_layout_ci.pNext = NULL;
10633 pipeline_layout_ci.setLayoutCount = 1;
10634 pipeline_layout_ci.pSetLayouts = &ds_layout;
10635
10636 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010637 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060010638 ASSERT_VK_SUCCESS(err);
10639
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010640 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010641 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 -060010642 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060010643 VkPipelineObj pipe(m_device);
10644 pipe.AddShader(&vs);
10645 pipe.AddShader(&fs);
10646 pipe.SetMSAA(&pipe_ms_state_ci);
10647 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010648 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060010649
10650 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10651 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10652 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10653}
Mark Young29927482016-05-04 14:38:51 -060010654
Mark Muellerd4914412016-06-13 17:52:06 -060010655TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010656 TEST_DESCRIPTION(
10657 "Points to a wrong colorAttachment index in a VkClearAttachment "
10658 "structure passed to vkCmdClearAttachments");
Cody Northropc31a84f2016-08-22 10:41:47 -060010659 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060010661
10662 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
10663 m_errorMonitor->VerifyFound();
10664}
10665
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010666TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010667 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
10668 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010669
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010670 ASSERT_NO_FATAL_FAILURE(InitState());
10671 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010672
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010673 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010674 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10675 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010676
10677 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010678 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10679 ds_pool_ci.pNext = NULL;
10680 ds_pool_ci.maxSets = 1;
10681 ds_pool_ci.poolSizeCount = 1;
10682 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010683
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010684 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010685 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010686 ASSERT_VK_SUCCESS(err);
10687
Tony Barboureb254902015-07-15 12:50:33 -060010688 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010689 dsl_binding.binding = 0;
10690 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10691 dsl_binding.descriptorCount = 1;
10692 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10693 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010694
Tony Barboureb254902015-07-15 12:50:33 -060010695 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010696 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10697 ds_layout_ci.pNext = NULL;
10698 ds_layout_ci.bindingCount = 1;
10699 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010700
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010701 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010702 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010703 ASSERT_VK_SUCCESS(err);
10704
10705 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010706 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010707 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010708 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010709 alloc_info.descriptorPool = ds_pool;
10710 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010711 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010712 ASSERT_VK_SUCCESS(err);
10713
Tony Barboureb254902015-07-15 12:50:33 -060010714 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010715 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010716 pipe_ms_state_ci.pNext = NULL;
10717 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10718 pipe_ms_state_ci.sampleShadingEnable = 0;
10719 pipe_ms_state_ci.minSampleShading = 1.0;
10720 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010721
Tony Barboureb254902015-07-15 12:50:33 -060010722 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010723 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10724 pipeline_layout_ci.pNext = NULL;
10725 pipeline_layout_ci.setLayoutCount = 1;
10726 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010727
10728 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010729 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010730 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010731
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010732 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060010733 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070010734 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010735 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010736
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010737 VkPipelineObj pipe(m_device);
10738 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010739 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010740 pipe.SetMSAA(&pipe_ms_state_ci);
10741 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060010742
Tony Barbour552f6c02016-12-21 14:34:07 -070010743 m_commandBuffer->BeginCommandBuffer();
10744 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010745
Karl Schultz6addd812016-02-02 17:17:23 -070010746 // Main thing we care about for this test is that the VkImage obj we're
10747 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010748 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010749 VkClearAttachment color_attachment;
10750 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10751 color_attachment.clearValue.color.float32[0] = 1.0;
10752 color_attachment.clearValue.color.float32[1] = 1.0;
10753 color_attachment.clearValue.color.float32[2] = 1.0;
10754 color_attachment.clearValue.color.float32[3] = 1.0;
10755 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010756 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010757
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010758 // Call for full-sized FB Color attachment prior to issuing a Draw
10759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070010760 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010761 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010762 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010763
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010764 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
10765 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
10766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
10767 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
10768 m_errorMonitor->VerifyFound();
10769
10770 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
10771 clear_rect.layerCount = 2;
10772 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
10773 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010774 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010775
Chia-I Wuf7458c52015-10-26 21:10:41 +080010776 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10777 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10778 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010779}
10780
Karl Schultz6addd812016-02-02 17:17:23 -070010781TEST_F(VkLayerTest, VtxBufferBadIndex) {
10782 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010783
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10785 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010786
Tobin Ehlis502480b2015-06-24 15:53:07 -060010787 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060010788 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060010789 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010790
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010791 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010792 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10793 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010794
10795 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010796 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10797 ds_pool_ci.pNext = NULL;
10798 ds_pool_ci.maxSets = 1;
10799 ds_pool_ci.poolSizeCount = 1;
10800 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010801
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010802 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010803 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010804 ASSERT_VK_SUCCESS(err);
10805
Tony Barboureb254902015-07-15 12:50:33 -060010806 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010807 dsl_binding.binding = 0;
10808 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10809 dsl_binding.descriptorCount = 1;
10810 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10811 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010812
Tony Barboureb254902015-07-15 12:50:33 -060010813 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010814 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10815 ds_layout_ci.pNext = NULL;
10816 ds_layout_ci.bindingCount = 1;
10817 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010818
Tobin Ehlis502480b2015-06-24 15:53:07 -060010819 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010820 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010821 ASSERT_VK_SUCCESS(err);
10822
10823 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010824 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010825 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010826 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010827 alloc_info.descriptorPool = ds_pool;
10828 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010829 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010830 ASSERT_VK_SUCCESS(err);
10831
Tony Barboureb254902015-07-15 12:50:33 -060010832 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010833 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010834 pipe_ms_state_ci.pNext = NULL;
10835 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10836 pipe_ms_state_ci.sampleShadingEnable = 0;
10837 pipe_ms_state_ci.minSampleShading = 1.0;
10838 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010839
Tony Barboureb254902015-07-15 12:50:33 -060010840 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010841 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10842 pipeline_layout_ci.pNext = NULL;
10843 pipeline_layout_ci.setLayoutCount = 1;
10844 pipeline_layout_ci.pSetLayouts = &ds_layout;
10845 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010846
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010847 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010848 ASSERT_VK_SUCCESS(err);
10849
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010850 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010851 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 -060010852 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010853 VkPipelineObj pipe(m_device);
10854 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010855 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010856 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010857 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060010858 pipe.SetViewport(m_viewports);
10859 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010860 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060010861
Tony Barbour552f6c02016-12-21 14:34:07 -070010862 m_commandBuffer->BeginCommandBuffer();
10863 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010864 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060010865 // Don't care about actual data, just need to get to draw to flag error
10866 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010867 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010868 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060010869 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010870
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010871 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010872
Chia-I Wuf7458c52015-10-26 21:10:41 +080010873 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10874 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10875 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010876}
Mark Muellerdfe37552016-07-07 14:47:42 -060010877
Mark Mueller2ee294f2016-08-04 12:59:48 -060010878TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010879 TEST_DESCRIPTION(
10880 "Use an invalid count in a vkEnumeratePhysicalDevices call."
10881 "Use invalid Queue Family Index in vkCreateDevice");
Cody Northropc31a84f2016-08-22 10:41:47 -060010882 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Mueller2ee294f2016-08-04 12:59:48 -060010883
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010884 const char *invalid_queueFamilyIndex_message =
10885 "Invalid queue create request in vkCreateDevice(). Invalid "
10886 "queueFamilyIndex ";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010887
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010888 const char *unavailable_feature_message = "While calling vkCreateDevice(), requesting feature #";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010889
Mark Mueller880fce52016-08-17 15:23:23 -060010890 // The following test fails with recent NVidia drivers.
10891 // By the time core_validation is reached, the NVidia
10892 // driver has sanitized the invalid condition and core_validation
10893 // is not introduced to the failure condition. This is not the case
10894 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010895 // uint32_t count = static_cast<uint32_t>(~0);
10896 // VkPhysicalDevice physical_device;
10897 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
10898 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060010899
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queueFamilyIndex_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010901 float queue_priority = 0.0;
10902
10903 VkDeviceQueueCreateInfo queue_create_info = {};
10904 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
10905 queue_create_info.queueCount = 1;
10906 queue_create_info.pQueuePriorities = &queue_priority;
10907 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
10908
10909 VkPhysicalDeviceFeatures features = m_device->phy().features();
10910 VkDevice testDevice;
10911 VkDeviceCreateInfo device_create_info = {};
10912 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
10913 device_create_info.queueCreateInfoCount = 1;
10914 device_create_info.pQueueCreateInfos = &queue_create_info;
10915 device_create_info.pEnabledFeatures = &features;
10916 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
10917 m_errorMonitor->VerifyFound();
10918
10919 queue_create_info.queueFamilyIndex = 1;
10920
10921 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
10922 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
10923 for (unsigned i = 0; i < feature_count; i++) {
10924 if (VK_FALSE == feature_array[i]) {
10925 feature_array[i] = VK_TRUE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, unavailable_feature_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010927 device_create_info.pEnabledFeatures = &features;
10928 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
10929 m_errorMonitor->VerifyFound();
10930 break;
10931 }
10932 }
10933}
10934
Tobin Ehlis16edf082016-11-21 12:33:49 -070010935TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
10936 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
10937
10938 ASSERT_NO_FATAL_FAILURE(InitState());
10939
10940 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
10941 std::vector<VkDeviceQueueCreateInfo> queue_info;
10942 queue_info.reserve(queue_props.size());
10943 std::vector<std::vector<float>> queue_priorities;
10944 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
10945 VkDeviceQueueCreateInfo qi{};
10946 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
10947 qi.queueFamilyIndex = i;
10948 qi.queueCount = queue_props[i].queueCount;
10949 queue_priorities.emplace_back(qi.queueCount, 0.0f);
10950 qi.pQueuePriorities = queue_priorities[i].data();
10951 queue_info.push_back(qi);
10952 }
10953
10954 std::vector<const char *> device_extension_names;
10955
10956 VkDevice local_device;
10957 VkDeviceCreateInfo device_create_info = {};
10958 auto features = m_device->phy().features();
10959 // Intentionally disable pipeline stats
10960 features.pipelineStatisticsQuery = VK_FALSE;
10961 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
10962 device_create_info.pNext = NULL;
10963 device_create_info.queueCreateInfoCount = queue_info.size();
10964 device_create_info.pQueueCreateInfos = queue_info.data();
10965 device_create_info.enabledLayerCount = 0;
10966 device_create_info.ppEnabledLayerNames = NULL;
10967 device_create_info.pEnabledFeatures = &features;
10968 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
10969 ASSERT_VK_SUCCESS(err);
10970
10971 VkQueryPoolCreateInfo qpci{};
10972 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
10973 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
10974 qpci.queryCount = 1;
10975 VkQueryPool query_pool;
10976
10977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
10978 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
10979 m_errorMonitor->VerifyFound();
10980
10981 vkDestroyDevice(local_device, nullptr);
10982}
10983
Mark Mueller2ee294f2016-08-04 12:59:48 -060010984TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010985 TEST_DESCRIPTION(
10986 "Use an invalid queue index in a vkCmdWaitEvents call."
10987 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060010988
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010989 const char *invalid_queue_index =
10990 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
10991 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
10992 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010993
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010994 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010995
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010997
10998 ASSERT_NO_FATAL_FAILURE(InitState());
10999
11000 VkEvent event;
11001 VkEventCreateInfo event_create_info{};
11002 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11003 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11004
Mark Mueller2ee294f2016-08-04 12:59:48 -060011005 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011006 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011007
Tony Barbour552f6c02016-12-21 14:34:07 -070011008 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011009
11010 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011011 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 -060011012 ASSERT_TRUE(image.initialized());
11013 VkImageMemoryBarrier img_barrier = {};
11014 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11015 img_barrier.pNext = NULL;
11016 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11017 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11018 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11019 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11020 img_barrier.image = image.handle();
11021 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011022
11023 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11024 // that layer validation catches the case when it is not.
11025 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011026 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11027 img_barrier.subresourceRange.baseArrayLayer = 0;
11028 img_barrier.subresourceRange.baseMipLevel = 0;
11029 img_barrier.subresourceRange.layerCount = 1;
11030 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011031 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11032 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011033 m_errorMonitor->VerifyFound();
11034
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011035 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011036
11037 VkQueryPool query_pool;
11038 VkQueryPoolCreateInfo query_pool_create_info = {};
11039 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11040 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11041 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011042 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011043
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011044 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011045 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11046
11047 vkEndCommandBuffer(m_commandBuffer->handle());
11048 m_errorMonitor->VerifyFound();
11049
11050 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11051 vkDestroyEvent(m_device->device(), event, nullptr);
11052}
11053
Mark Muellerdfe37552016-07-07 14:47:42 -060011054TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011055 TEST_DESCRIPTION(
11056 "Submit a command buffer using deleted vertex buffer, "
11057 "delete a buffer twice, use an invalid offset for each "
11058 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011059
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011060 const char *deleted_buffer_in_command_buffer =
11061 "Cannot submit cmd buffer "
11062 "using deleted buffer ";
11063 const char *invalid_offset_message =
11064 "vkBindBufferMemory(): "
11065 "memoryOffset is 0x";
11066 const char *invalid_storage_buffer_offset_message =
11067 "vkBindBufferMemory(): "
11068 "storage memoryOffset "
11069 "is 0x";
11070 const char *invalid_texel_buffer_offset_message =
11071 "vkBindBufferMemory(): "
11072 "texel memoryOffset "
11073 "is 0x";
11074 const char *invalid_uniform_buffer_offset_message =
11075 "vkBindBufferMemory(): "
11076 "uniform memoryOffset "
11077 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011078
11079 ASSERT_NO_FATAL_FAILURE(InitState());
11080 ASSERT_NO_FATAL_FAILURE(InitViewport());
11081 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11082
11083 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011084 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011085 pipe_ms_state_ci.pNext = NULL;
11086 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11087 pipe_ms_state_ci.sampleShadingEnable = 0;
11088 pipe_ms_state_ci.minSampleShading = 1.0;
11089 pipe_ms_state_ci.pSampleMask = nullptr;
11090
11091 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11092 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11093 VkPipelineLayout pipeline_layout;
11094
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011095 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011096 ASSERT_VK_SUCCESS(err);
11097
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011098 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11099 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011100 VkPipelineObj pipe(m_device);
11101 pipe.AddShader(&vs);
11102 pipe.AddShader(&fs);
11103 pipe.AddColorAttachment();
11104 pipe.SetMSAA(&pipe_ms_state_ci);
11105 pipe.SetViewport(m_viewports);
11106 pipe.SetScissor(m_scissors);
11107 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11108
Tony Barbour552f6c02016-12-21 14:34:07 -070011109 m_commandBuffer->BeginCommandBuffer();
11110 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011111 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011112
11113 {
11114 // Create and bind a vertex buffer in a reduced scope, which will cause
11115 // it to be deleted upon leaving this scope
11116 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011117 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011118 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11119 draw_verticies.AddVertexInputToPipe(pipe);
11120 }
11121
11122 Draw(1, 0, 0, 0);
11123
Tony Barbour552f6c02016-12-21 14:34:07 -070011124 m_commandBuffer->EndRenderPass();
11125 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011126
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011127 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011128 QueueCommandBuffer(false);
11129 m_errorMonitor->VerifyFound();
11130
11131 {
11132 // Create and bind a vertex buffer in a reduced scope, and delete it
11133 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011134 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011135 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011136 buffer_test.TestDoubleDestroy();
11137 }
11138 m_errorMonitor->VerifyFound();
11139
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011140 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011141 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
11143 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11144 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011145 m_errorMonitor->VerifyFound();
11146 }
11147
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011148 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11149 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011150 // Create and bind a memory buffer with an invalid offset again,
11151 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
11153 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11154 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011155 m_errorMonitor->VerifyFound();
11156 }
11157
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011158 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011159 // Create and bind a memory buffer with an invalid offset again, but
11160 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011161 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
11162 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11163 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011164 m_errorMonitor->VerifyFound();
11165 }
11166
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011167 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011168 // Create and bind a memory buffer with an invalid offset again, but
11169 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
11171 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11172 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011173 m_errorMonitor->VerifyFound();
11174 }
11175
11176 {
11177 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011179 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11180 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011181 m_errorMonitor->VerifyFound();
11182 }
11183
11184 {
11185 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011186 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011187 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11188 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011189 }
11190 m_errorMonitor->VerifyFound();
11191
11192 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11193}
11194
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011195// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11196TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011197 TEST_DESCRIPTION(
11198 "Hit all possible validation checks associated with the "
11199 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11200 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011201 // 3 in ValidateCmdBufImageLayouts
11202 // * -1 Attempt to submit cmd buf w/ deleted image
11203 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11204 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011205
11206 ASSERT_NO_FATAL_FAILURE(InitState());
11207 // Create src & dst images to use for copy operations
11208 VkImage src_image;
11209 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011210 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011211
11212 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11213 const int32_t tex_width = 32;
11214 const int32_t tex_height = 32;
11215
11216 VkImageCreateInfo image_create_info = {};
11217 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11218 image_create_info.pNext = NULL;
11219 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11220 image_create_info.format = tex_format;
11221 image_create_info.extent.width = tex_width;
11222 image_create_info.extent.height = tex_height;
11223 image_create_info.extent.depth = 1;
11224 image_create_info.mipLevels = 1;
11225 image_create_info.arrayLayers = 4;
11226 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11227 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11228 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011229 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011230 image_create_info.flags = 0;
11231
11232 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11233 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011234 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011235 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11236 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011237 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11238 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11239 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11240 ASSERT_VK_SUCCESS(err);
11241
11242 // Allocate memory
11243 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011244 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011245 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011246 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11247 mem_alloc.pNext = NULL;
11248 mem_alloc.allocationSize = 0;
11249 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011250
11251 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011252 mem_alloc.allocationSize = img_mem_reqs.size;
11253 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011254 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011255 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011256 ASSERT_VK_SUCCESS(err);
11257
11258 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011259 mem_alloc.allocationSize = img_mem_reqs.size;
11260 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011261 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011262 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080011263 ASSERT_VK_SUCCESS(err);
11264
11265 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011266 mem_alloc.allocationSize = img_mem_reqs.size;
11267 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011268 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011269 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080011270 ASSERT_VK_SUCCESS(err);
11271
11272 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
11273 ASSERT_VK_SUCCESS(err);
11274 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
11275 ASSERT_VK_SUCCESS(err);
11276 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
11277 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011278
Tony Barbour552f6c02016-12-21 14:34:07 -070011279 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080011280 VkImageCopy copy_region;
11281 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11282 copy_region.srcSubresource.mipLevel = 0;
11283 copy_region.srcSubresource.baseArrayLayer = 0;
11284 copy_region.srcSubresource.layerCount = 1;
11285 copy_region.srcOffset.x = 0;
11286 copy_region.srcOffset.y = 0;
11287 copy_region.srcOffset.z = 0;
11288 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11289 copy_region.dstSubresource.mipLevel = 0;
11290 copy_region.dstSubresource.baseArrayLayer = 0;
11291 copy_region.dstSubresource.layerCount = 1;
11292 copy_region.dstOffset.x = 0;
11293 copy_region.dstOffset.y = 0;
11294 copy_region.dstOffset.z = 0;
11295 copy_region.extent.width = 1;
11296 copy_region.extent.height = 1;
11297 copy_region.extent.depth = 1;
11298
11299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11300 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11301 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 -060011302 m_errorMonitor->VerifyFound();
11303 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11305 "Cannot copy from an image whose source layout is "
11306 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
11307 "layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011308 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 -060011309 m_errorMonitor->VerifyFound();
11310 // Final src error is due to bad layout type
11311 m_errorMonitor->SetDesiredFailureMsg(
11312 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11313 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011314 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 -060011315 m_errorMonitor->VerifyFound();
11316 // Now verify same checks for dst
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011317 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11318 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011319 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 -060011320 m_errorMonitor->VerifyFound();
11321 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011322 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11323 "Cannot copy from an image whose dest layout is "
11324 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
11325 "layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011326 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 -060011327 m_errorMonitor->VerifyFound();
11328 m_errorMonitor->SetDesiredFailureMsg(
11329 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11330 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011331 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 -060011332 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011333
Cort3b021012016-12-07 12:00:57 -080011334 // Convert dst and depth images to TRANSFER_DST for subsequent tests
11335 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
11336 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11337 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11338 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
11339 transfer_dst_image_barrier[0].srcAccessMask = 0;
11340 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
11341 transfer_dst_image_barrier[0].image = dst_image;
11342 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11343 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
11344 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11345 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11346 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11347 transfer_dst_image_barrier[0].image = depth_image;
11348 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
11349 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11350 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11351
11352 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080011353 VkClearColorValue color_clear_value = {};
11354 VkImageSubresourceRange clear_range;
11355 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11356 clear_range.baseMipLevel = 0;
11357 clear_range.baseArrayLayer = 0;
11358 clear_range.layerCount = 1;
11359 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011360
Cort3b021012016-12-07 12:00:57 -080011361 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
11362 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11363 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
11364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011365 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011366 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011367 // Fail due to provided layout not matching actual current layout for color clear.
11368 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011369 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011370 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011371
Cort530cf382016-12-08 09:59:47 -080011372 VkClearDepthStencilValue depth_clear_value = {};
11373 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080011374
11375 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
11376 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11377 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
11378 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011379 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011380 m_errorMonitor->VerifyFound();
11381 // Fail due to provided layout not matching actual current layout for depth clear.
11382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011383 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011384 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011385
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011386 // Now cause error due to bad image layout transition in PipelineBarrier
11387 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080011388 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011389 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080011390 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011391 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080011392 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11393 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011394 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11396 "You cannot transition the layout of aspect 1 from "
11397 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when "
11398 "current layout is VK_IMAGE_LAYOUT_GENERAL.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011399 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11400 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011401 m_errorMonitor->VerifyFound();
11402
11403 // Finally some layout errors at RenderPass create time
11404 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11405 VkAttachmentReference attach = {};
11406 // perf warning for GENERAL layout w/ non-DS input attachment
11407 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11408 VkSubpassDescription subpass = {};
11409 subpass.inputAttachmentCount = 1;
11410 subpass.pInputAttachments = &attach;
11411 VkRenderPassCreateInfo rpci = {};
11412 rpci.subpassCount = 1;
11413 rpci.pSubpasses = &subpass;
11414 rpci.attachmentCount = 1;
11415 VkAttachmentDescription attach_desc = {};
11416 attach_desc.format = VK_FORMAT_UNDEFINED;
11417 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011418 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011419 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11421 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011422 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11423 m_errorMonitor->VerifyFound();
11424 // error w/ non-general layout
11425 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11426
11427 m_errorMonitor->SetDesiredFailureMsg(
11428 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11429 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11430 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11431 m_errorMonitor->VerifyFound();
11432 subpass.inputAttachmentCount = 0;
11433 subpass.colorAttachmentCount = 1;
11434 subpass.pColorAttachments = &attach;
11435 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11436 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11438 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011439 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11440 m_errorMonitor->VerifyFound();
11441 // error w/ non-color opt or GENERAL layout for color attachment
11442 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11443 m_errorMonitor->SetDesiredFailureMsg(
11444 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11445 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11446 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11447 m_errorMonitor->VerifyFound();
11448 subpass.colorAttachmentCount = 0;
11449 subpass.pDepthStencilAttachment = &attach;
11450 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11451 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11453 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011454 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11455 m_errorMonitor->VerifyFound();
11456 // error w/ non-ds opt or GENERAL layout for color attachment
11457 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011458 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11459 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
11460 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011461 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11462 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060011463 // For this error we need a valid renderpass so create default one
11464 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11465 attach.attachment = 0;
11466 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
11467 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
11468 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
11469 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
11470 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
11471 // Can't do a CLEAR load on READ_ONLY initialLayout
11472 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
11473 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11474 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11476 " with invalid first layout "
11477 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
11478 "ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060011479 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11480 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011481
Cort3b021012016-12-07 12:00:57 -080011482 vkFreeMemory(m_device->device(), src_image_mem, NULL);
11483 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
11484 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011485 vkDestroyImage(m_device->device(), src_image, NULL);
11486 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080011487 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011488}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060011489
Tobin Ehlise0936662016-10-11 08:10:51 -060011490TEST_F(VkLayerTest, InvalidStorageImageLayout) {
11491 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
11492 VkResult err;
11493
11494 ASSERT_NO_FATAL_FAILURE(InitState());
11495
11496 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
11497 VkImageTiling tiling;
11498 VkFormatProperties format_properties;
11499 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
11500 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
11501 tiling = VK_IMAGE_TILING_LINEAR;
11502 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
11503 tiling = VK_IMAGE_TILING_OPTIMAL;
11504 } else {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011505 printf(
11506 "Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
11507 "skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060011508 return;
11509 }
11510
11511 VkDescriptorPoolSize ds_type = {};
11512 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
11513 ds_type.descriptorCount = 1;
11514
11515 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11516 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11517 ds_pool_ci.maxSets = 1;
11518 ds_pool_ci.poolSizeCount = 1;
11519 ds_pool_ci.pPoolSizes = &ds_type;
11520 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
11521
11522 VkDescriptorPool ds_pool;
11523 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11524 ASSERT_VK_SUCCESS(err);
11525
11526 VkDescriptorSetLayoutBinding dsl_binding = {};
11527 dsl_binding.binding = 0;
11528 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
11529 dsl_binding.descriptorCount = 1;
11530 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11531 dsl_binding.pImmutableSamplers = NULL;
11532
11533 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11534 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11535 ds_layout_ci.pNext = NULL;
11536 ds_layout_ci.bindingCount = 1;
11537 ds_layout_ci.pBindings = &dsl_binding;
11538
11539 VkDescriptorSetLayout ds_layout;
11540 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11541 ASSERT_VK_SUCCESS(err);
11542
11543 VkDescriptorSetAllocateInfo alloc_info = {};
11544 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11545 alloc_info.descriptorSetCount = 1;
11546 alloc_info.descriptorPool = ds_pool;
11547 alloc_info.pSetLayouts = &ds_layout;
11548 VkDescriptorSet descriptor_set;
11549 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11550 ASSERT_VK_SUCCESS(err);
11551
11552 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11553 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11554 pipeline_layout_ci.pNext = NULL;
11555 pipeline_layout_ci.setLayoutCount = 1;
11556 pipeline_layout_ci.pSetLayouts = &ds_layout;
11557 VkPipelineLayout pipeline_layout;
11558 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
11559 ASSERT_VK_SUCCESS(err);
11560
11561 VkImageObj image(m_device);
11562 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
11563 ASSERT_TRUE(image.initialized());
11564 VkImageView view = image.targetView(tex_format);
11565
11566 VkDescriptorImageInfo image_info = {};
11567 image_info.imageView = view;
11568 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11569
11570 VkWriteDescriptorSet descriptor_write = {};
11571 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11572 descriptor_write.dstSet = descriptor_set;
11573 descriptor_write.dstBinding = 0;
11574 descriptor_write.descriptorCount = 1;
11575 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
11576 descriptor_write.pImageInfo = &image_info;
11577
11578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11579 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
11580 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
11581 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11582 m_errorMonitor->VerifyFound();
11583
11584 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11585 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11586 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
11587 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11588}
11589
Mark Mueller93b938f2016-08-18 10:27:40 -060011590TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011591 TEST_DESCRIPTION(
11592 "Use vkCmdExecuteCommands with invalid state "
11593 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060011594
11595 ASSERT_NO_FATAL_FAILURE(InitState());
11596 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11597
Mike Weiblen95dd0f92016-10-19 12:28:27 -060011598 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011599 const char *simultaneous_use_message2 =
11600 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
11601 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060011602
11603 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011604 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060011605 command_buffer_allocate_info.commandPool = m_commandPool;
11606 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
11607 command_buffer_allocate_info.commandBufferCount = 1;
11608
11609 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011610 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060011611 VkCommandBufferBeginInfo command_buffer_begin_info = {};
11612 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011613 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060011614 command_buffer_inheritance_info.renderPass = m_renderPass;
11615 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070011616
Mark Mueller93b938f2016-08-18 10:27:40 -060011617 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011618 command_buffer_begin_info.flags =
11619 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060011620 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
11621
11622 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
11623 vkEndCommandBuffer(secondary_command_buffer);
11624
Mark Mueller93b938f2016-08-18 10:27:40 -060011625 VkSubmitInfo submit_info = {};
11626 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11627 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011628 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060011629
Mark Mueller4042b652016-09-05 22:52:21 -060011630 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011631 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
11632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
11633 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070011634 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060011635 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060011636 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11637 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060011638
Dave Houltonfbf52152017-01-06 12:55:29 -070011639 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060011640 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070011641 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060011642
Mark Mueller4042b652016-09-05 22:52:21 -060011643 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060011644 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011645 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060011646
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
11648 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060011649 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060011650 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11651 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070011652
11653 vkQueueWaitIdle(m_device->m_queue);
Mark Mueller93b938f2016-08-18 10:27:40 -060011654}
11655
Tony Barbour626994c2017-02-08 15:29:37 -070011656TEST_F(VkLayerTest, SimultaneousUseOneShot) {
11657 TEST_DESCRIPTION(
11658 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
11659 "errors");
11660 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
11661 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
11662 ASSERT_NO_FATAL_FAILURE(InitState());
11663
11664 VkCommandBuffer cmd_bufs[2];
11665 VkCommandBufferAllocateInfo alloc_info;
11666 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
11667 alloc_info.pNext = NULL;
11668 alloc_info.commandBufferCount = 2;
11669 alloc_info.commandPool = m_commandPool;
11670 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
11671 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
11672
11673 VkCommandBufferBeginInfo cb_binfo;
11674 cb_binfo.pNext = NULL;
11675 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11676 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
11677 cb_binfo.flags = 0;
11678 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
11679 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11680 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
11681 vkEndCommandBuffer(cmd_bufs[0]);
11682 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
11683
11684 VkSubmitInfo submit_info = {};
11685 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11686 submit_info.commandBufferCount = 2;
11687 submit_info.pCommandBuffers = duplicates;
11688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
11689 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11690 m_errorMonitor->VerifyFound();
11691 vkQueueWaitIdle(m_device->m_queue);
11692
11693 // Set one time use and now look for one time submit
11694 duplicates[0] = duplicates[1] = cmd_bufs[1];
11695 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
11696 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
11697 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
11698 vkEndCommandBuffer(cmd_bufs[1]);
11699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
11700 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11701 m_errorMonitor->VerifyFound();
11702 vkQueueWaitIdle(m_device->m_queue);
11703}
11704
Tobin Ehlisb093da82017-01-19 12:05:27 -070011705TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011706 TEST_DESCRIPTION(
11707 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
11708 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070011709
11710 ASSERT_NO_FATAL_FAILURE(InitState());
11711 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11712
11713 std::vector<const char *> device_extension_names;
11714 auto features = m_device->phy().features();
11715 // Make sure gs & ts are disabled
11716 features.geometryShader = false;
11717 features.tessellationShader = false;
11718 // The sacrificial device object
11719 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
11720
11721 VkCommandPoolCreateInfo pool_create_info{};
11722 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
11723 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
11724
11725 VkCommandPool command_pool;
11726 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
11727
11728 VkCommandBufferAllocateInfo cmd = {};
11729 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
11730 cmd.pNext = NULL;
11731 cmd.commandPool = command_pool;
11732 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
11733 cmd.commandBufferCount = 1;
11734
11735 VkCommandBuffer cmd_buffer;
11736 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
11737 ASSERT_VK_SUCCESS(err);
11738
11739 VkEvent event;
11740 VkEventCreateInfo evci = {};
11741 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11742 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
11743 ASSERT_VK_SUCCESS(result);
11744
11745 VkCommandBufferBeginInfo cbbi = {};
11746 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11747 vkBeginCommandBuffer(cmd_buffer, &cbbi);
11748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
11749 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
11750 m_errorMonitor->VerifyFound();
11751
11752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
11753 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
11754 m_errorMonitor->VerifyFound();
11755
11756 vkDestroyEvent(test_device.handle(), event, NULL);
11757 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
11758}
11759
Mark Mueller917f6bc2016-08-30 10:57:19 -060011760TEST_F(VkLayerTest, InUseDestroyedSignaled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011761 TEST_DESCRIPTION(
11762 "Use vkCmdExecuteCommands with invalid state "
11763 "in primary and secondary command buffers. "
11764 "Delete objects that are inuse. Call VkQueueSubmit "
11765 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060011766
11767 ASSERT_NO_FATAL_FAILURE(InitState());
11768 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11769
Tony Barbour552f6c02016-12-21 14:34:07 -070011770 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060011771
11772 VkEvent event;
11773 VkEventCreateInfo event_create_info = {};
11774 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11775 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011776 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011777
Tony Barbour552f6c02016-12-21 14:34:07 -070011778 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060011779 vkDestroyEvent(m_device->device(), event, nullptr);
11780
11781 VkSubmitInfo submit_info = {};
11782 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11783 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011784 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Jeremy Hayes1b082d72017-01-27 11:34:28 -070011785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted event 0x");
11786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "You are submitting command buffer 0x");
Mark Muellerc8d441e2016-08-23 17:36:00 -060011787 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11788 m_errorMonitor->VerifyFound();
11789
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011790 m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
Mark Muellerc8d441e2016-08-23 17:36:00 -060011791 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
11792
11793 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11794
Mark Mueller917f6bc2016-08-30 10:57:19 -060011795 VkSemaphoreCreateInfo semaphore_create_info = {};
11796 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
11797 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011798 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011799 VkFenceCreateInfo fence_create_info = {};
11800 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
11801 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011802 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011803
11804 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060011805 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011806 descriptor_pool_type_count.descriptorCount = 1;
11807
11808 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
11809 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11810 descriptor_pool_create_info.maxSets = 1;
11811 descriptor_pool_create_info.poolSizeCount = 1;
11812 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011813 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011814
11815 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011816 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011817
11818 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060011819 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011820 descriptorset_layout_binding.descriptorCount = 1;
11821 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
11822
11823 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011824 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011825 descriptorset_layout_create_info.bindingCount = 1;
11826 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
11827
11828 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011829 ASSERT_VK_SUCCESS(
11830 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011831
11832 VkDescriptorSet descriptorset;
11833 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011834 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011835 descriptorset_allocate_info.descriptorSetCount = 1;
11836 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
11837 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011838 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011839
Mark Mueller4042b652016-09-05 22:52:21 -060011840 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
11841
11842 VkDescriptorBufferInfo buffer_info = {};
11843 buffer_info.buffer = buffer_test.GetBuffer();
11844 buffer_info.offset = 0;
11845 buffer_info.range = 1024;
11846
11847 VkWriteDescriptorSet write_descriptor_set = {};
11848 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11849 write_descriptor_set.dstSet = descriptorset;
11850 write_descriptor_set.descriptorCount = 1;
11851 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11852 write_descriptor_set.pBufferInfo = &buffer_info;
11853
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011854 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060011855
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011856 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11857 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011858
11859 VkPipelineObj pipe(m_device);
11860 pipe.AddColorAttachment();
11861 pipe.AddShader(&vs);
11862 pipe.AddShader(&fs);
11863
11864 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011865 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011866 pipeline_layout_create_info.setLayoutCount = 1;
11867 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
11868
11869 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011870 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011871
11872 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
11873
Tony Barbour552f6c02016-12-21 14:34:07 -070011874 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011875 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060011876
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011877 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11878 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11879 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011880
Tony Barbour552f6c02016-12-21 14:34:07 -070011881 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060011882
Mark Mueller917f6bc2016-08-30 10:57:19 -060011883 submit_info.signalSemaphoreCount = 1;
11884 submit_info.pSignalSemaphores = &semaphore;
11885 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011886 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060011887
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011889 vkDestroyEvent(m_device->device(), event, nullptr);
11890 m_errorMonitor->VerifyFound();
11891
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011893 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11894 m_errorMonitor->VerifyFound();
11895
Jeremy Hayes08369882017-02-02 10:31:06 -070011896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060011897 vkDestroyFence(m_device->device(), fence, nullptr);
11898 m_errorMonitor->VerifyFound();
11899
Tobin Ehlis122207b2016-09-01 08:50:06 -070011900 vkQueueWaitIdle(m_device->m_queue);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011901 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11902 vkDestroyFence(m_device->device(), fence, nullptr);
11903 vkDestroyEvent(m_device->device(), event, nullptr);
11904 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011905 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011906 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
11907}
11908
Tobin Ehlis2adda372016-09-01 08:51:06 -070011909TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
11910 TEST_DESCRIPTION("Delete in-use query pool.");
11911
11912 ASSERT_NO_FATAL_FAILURE(InitState());
11913 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11914
11915 VkQueryPool query_pool;
11916 VkQueryPoolCreateInfo query_pool_ci{};
11917 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11918 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
11919 query_pool_ci.queryCount = 1;
11920 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070011921 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070011922 // Reset query pool to create binding with cmd buffer
11923 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
11924
Tony Barbour552f6c02016-12-21 14:34:07 -070011925 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070011926
11927 VkSubmitInfo submit_info = {};
11928 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11929 submit_info.commandBufferCount = 1;
11930 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11931 // Submit cmd buffer and then destroy query pool while in-flight
11932 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11933
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070011935 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
11936 m_errorMonitor->VerifyFound();
11937
11938 vkQueueWaitIdle(m_device->m_queue);
11939 // Now that cmd buffer done we can safely destroy query_pool
11940 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
11941}
11942
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011943TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
11944 TEST_DESCRIPTION("Delete in-use pipeline.");
11945
11946 ASSERT_NO_FATAL_FAILURE(InitState());
11947 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11948
11949 // Empty pipeline layout used for binding PSO
11950 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11951 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11952 pipeline_layout_ci.setLayoutCount = 0;
11953 pipeline_layout_ci.pSetLayouts = NULL;
11954
11955 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011956 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011957 ASSERT_VK_SUCCESS(err);
11958
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011960 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011961 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11962 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011963 // Store pipeline handle so we can actually delete it before test finishes
11964 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011965 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011966 VkPipelineObj pipe(m_device);
11967 pipe.AddShader(&vs);
11968 pipe.AddShader(&fs);
11969 pipe.AddColorAttachment();
11970 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11971 delete_this_pipeline = pipe.handle();
11972
Tony Barbour552f6c02016-12-21 14:34:07 -070011973 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011974 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011975 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011976
Tony Barbour552f6c02016-12-21 14:34:07 -070011977 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011978
11979 VkSubmitInfo submit_info = {};
11980 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11981 submit_info.commandBufferCount = 1;
11982 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11983 // Submit cmd buffer and then pipeline destroyed while in-flight
11984 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011985 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011986 m_errorMonitor->VerifyFound();
11987 // Make sure queue finished and then actually delete pipeline
11988 vkQueueWaitIdle(m_device->m_queue);
11989 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
11990 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
11991}
11992
Tobin Ehlis7d965da2016-09-19 16:15:45 -060011993TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
11994 TEST_DESCRIPTION("Delete in-use imageView.");
11995
11996 ASSERT_NO_FATAL_FAILURE(InitState());
11997 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11998
11999 VkDescriptorPoolSize ds_type_count;
12000 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12001 ds_type_count.descriptorCount = 1;
12002
12003 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12004 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12005 ds_pool_ci.maxSets = 1;
12006 ds_pool_ci.poolSizeCount = 1;
12007 ds_pool_ci.pPoolSizes = &ds_type_count;
12008
12009 VkDescriptorPool ds_pool;
12010 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12011 ASSERT_VK_SUCCESS(err);
12012
12013 VkSamplerCreateInfo sampler_ci = {};
12014 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12015 sampler_ci.pNext = NULL;
12016 sampler_ci.magFilter = VK_FILTER_NEAREST;
12017 sampler_ci.minFilter = VK_FILTER_NEAREST;
12018 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12019 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12020 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12021 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12022 sampler_ci.mipLodBias = 1.0;
12023 sampler_ci.anisotropyEnable = VK_FALSE;
12024 sampler_ci.maxAnisotropy = 1;
12025 sampler_ci.compareEnable = VK_FALSE;
12026 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12027 sampler_ci.minLod = 1.0;
12028 sampler_ci.maxLod = 1.0;
12029 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12030 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12031 VkSampler sampler;
12032
12033 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12034 ASSERT_VK_SUCCESS(err);
12035
12036 VkDescriptorSetLayoutBinding layout_binding;
12037 layout_binding.binding = 0;
12038 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12039 layout_binding.descriptorCount = 1;
12040 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12041 layout_binding.pImmutableSamplers = NULL;
12042
12043 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12044 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12045 ds_layout_ci.bindingCount = 1;
12046 ds_layout_ci.pBindings = &layout_binding;
12047 VkDescriptorSetLayout ds_layout;
12048 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12049 ASSERT_VK_SUCCESS(err);
12050
12051 VkDescriptorSetAllocateInfo alloc_info = {};
12052 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12053 alloc_info.descriptorSetCount = 1;
12054 alloc_info.descriptorPool = ds_pool;
12055 alloc_info.pSetLayouts = &ds_layout;
12056 VkDescriptorSet descriptor_set;
12057 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12058 ASSERT_VK_SUCCESS(err);
12059
12060 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12061 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12062 pipeline_layout_ci.pNext = NULL;
12063 pipeline_layout_ci.setLayoutCount = 1;
12064 pipeline_layout_ci.pSetLayouts = &ds_layout;
12065
12066 VkPipelineLayout pipeline_layout;
12067 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12068 ASSERT_VK_SUCCESS(err);
12069
12070 VkImageObj image(m_device);
12071 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12072 ASSERT_TRUE(image.initialized());
12073
12074 VkImageView view;
12075 VkImageViewCreateInfo ivci = {};
12076 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12077 ivci.image = image.handle();
12078 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12079 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12080 ivci.subresourceRange.layerCount = 1;
12081 ivci.subresourceRange.baseMipLevel = 0;
12082 ivci.subresourceRange.levelCount = 1;
12083 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12084
12085 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12086 ASSERT_VK_SUCCESS(err);
12087
12088 VkDescriptorImageInfo image_info{};
12089 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12090 image_info.imageView = view;
12091 image_info.sampler = sampler;
12092
12093 VkWriteDescriptorSet descriptor_write = {};
12094 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12095 descriptor_write.dstSet = descriptor_set;
12096 descriptor_write.dstBinding = 0;
12097 descriptor_write.descriptorCount = 1;
12098 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12099 descriptor_write.pImageInfo = &image_info;
12100
12101 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12102
12103 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012104 char const *vsSource =
12105 "#version 450\n"
12106 "\n"
12107 "out gl_PerVertex { \n"
12108 " vec4 gl_Position;\n"
12109 "};\n"
12110 "void main(){\n"
12111 " gl_Position = vec4(1);\n"
12112 "}\n";
12113 char const *fsSource =
12114 "#version 450\n"
12115 "\n"
12116 "layout(set=0, binding=0) uniform sampler2D s;\n"
12117 "layout(location=0) out vec4 x;\n"
12118 "void main(){\n"
12119 " x = texture(s, vec2(1));\n"
12120 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012121 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12122 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12123 VkPipelineObj pipe(m_device);
12124 pipe.AddShader(&vs);
12125 pipe.AddShader(&fs);
12126 pipe.AddColorAttachment();
12127 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12128
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012129 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012130
Tony Barbour552f6c02016-12-21 14:34:07 -070012131 m_commandBuffer->BeginCommandBuffer();
12132 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012133 // Bind pipeline to cmd buffer
12134 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12135 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12136 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012137
12138 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12139 VkRect2D scissor = {{0, 0}, {16, 16}};
12140 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12141 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12142
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012143 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012144 m_commandBuffer->EndRenderPass();
12145 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012146 // Submit cmd buffer then destroy sampler
12147 VkSubmitInfo submit_info = {};
12148 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12149 submit_info.commandBufferCount = 1;
12150 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12151 // Submit cmd buffer and then destroy imageView while in-flight
12152 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12153
12154 vkDestroyImageView(m_device->device(), view, nullptr);
12155 m_errorMonitor->VerifyFound();
12156 vkQueueWaitIdle(m_device->m_queue);
12157 // Now we can actually destroy imageView
12158 vkDestroyImageView(m_device->device(), view, NULL);
12159 vkDestroySampler(m_device->device(), sampler, nullptr);
12160 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12161 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12162 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12163}
12164
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012165TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12166 TEST_DESCRIPTION("Delete in-use bufferView.");
12167
12168 ASSERT_NO_FATAL_FAILURE(InitState());
12169 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12170
12171 VkDescriptorPoolSize ds_type_count;
12172 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12173 ds_type_count.descriptorCount = 1;
12174
12175 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12176 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12177 ds_pool_ci.maxSets = 1;
12178 ds_pool_ci.poolSizeCount = 1;
12179 ds_pool_ci.pPoolSizes = &ds_type_count;
12180
12181 VkDescriptorPool ds_pool;
12182 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12183 ASSERT_VK_SUCCESS(err);
12184
12185 VkDescriptorSetLayoutBinding layout_binding;
12186 layout_binding.binding = 0;
12187 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12188 layout_binding.descriptorCount = 1;
12189 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12190 layout_binding.pImmutableSamplers = NULL;
12191
12192 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12193 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12194 ds_layout_ci.bindingCount = 1;
12195 ds_layout_ci.pBindings = &layout_binding;
12196 VkDescriptorSetLayout ds_layout;
12197 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12198 ASSERT_VK_SUCCESS(err);
12199
12200 VkDescriptorSetAllocateInfo alloc_info = {};
12201 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12202 alloc_info.descriptorSetCount = 1;
12203 alloc_info.descriptorPool = ds_pool;
12204 alloc_info.pSetLayouts = &ds_layout;
12205 VkDescriptorSet descriptor_set;
12206 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12207 ASSERT_VK_SUCCESS(err);
12208
12209 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12210 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12211 pipeline_layout_ci.pNext = NULL;
12212 pipeline_layout_ci.setLayoutCount = 1;
12213 pipeline_layout_ci.pSetLayouts = &ds_layout;
12214
12215 VkPipelineLayout pipeline_layout;
12216 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12217 ASSERT_VK_SUCCESS(err);
12218
12219 VkBuffer buffer;
12220 uint32_t queue_family_index = 0;
12221 VkBufferCreateInfo buffer_create_info = {};
12222 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12223 buffer_create_info.size = 1024;
12224 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
12225 buffer_create_info.queueFamilyIndexCount = 1;
12226 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
12227
12228 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
12229 ASSERT_VK_SUCCESS(err);
12230
12231 VkMemoryRequirements memory_reqs;
12232 VkDeviceMemory buffer_memory;
12233
12234 VkMemoryAllocateInfo memory_info = {};
12235 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12236 memory_info.allocationSize = 0;
12237 memory_info.memoryTypeIndex = 0;
12238
12239 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
12240 memory_info.allocationSize = memory_reqs.size;
12241 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
12242 ASSERT_TRUE(pass);
12243
12244 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
12245 ASSERT_VK_SUCCESS(err);
12246 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
12247 ASSERT_VK_SUCCESS(err);
12248
12249 VkBufferView view;
12250 VkBufferViewCreateInfo bvci = {};
12251 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
12252 bvci.buffer = buffer;
12253 bvci.format = VK_FORMAT_R8_UNORM;
12254 bvci.range = VK_WHOLE_SIZE;
12255
12256 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
12257 ASSERT_VK_SUCCESS(err);
12258
12259 VkWriteDescriptorSet descriptor_write = {};
12260 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12261 descriptor_write.dstSet = descriptor_set;
12262 descriptor_write.dstBinding = 0;
12263 descriptor_write.descriptorCount = 1;
12264 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12265 descriptor_write.pTexelBufferView = &view;
12266
12267 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12268
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012269 char const *vsSource =
12270 "#version 450\n"
12271 "\n"
12272 "out gl_PerVertex { \n"
12273 " vec4 gl_Position;\n"
12274 "};\n"
12275 "void main(){\n"
12276 " gl_Position = vec4(1);\n"
12277 "}\n";
12278 char const *fsSource =
12279 "#version 450\n"
12280 "\n"
12281 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
12282 "layout(location=0) out vec4 x;\n"
12283 "void main(){\n"
12284 " x = imageLoad(s, 0);\n"
12285 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012286 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12287 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12288 VkPipelineObj pipe(m_device);
12289 pipe.AddShader(&vs);
12290 pipe.AddShader(&fs);
12291 pipe.AddColorAttachment();
12292 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12293
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012294 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012295
Tony Barbour552f6c02016-12-21 14:34:07 -070012296 m_commandBuffer->BeginCommandBuffer();
12297 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012298 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12299 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12300 VkRect2D scissor = {{0, 0}, {16, 16}};
12301 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12302 // Bind pipeline to cmd buffer
12303 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12304 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12305 &descriptor_set, 0, nullptr);
12306 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012307 m_commandBuffer->EndRenderPass();
12308 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012309
12310 VkSubmitInfo submit_info = {};
12311 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12312 submit_info.commandBufferCount = 1;
12313 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12314 // Submit cmd buffer and then destroy bufferView while in-flight
12315 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12316
12317 vkDestroyBufferView(m_device->device(), view, nullptr);
12318 m_errorMonitor->VerifyFound();
12319 vkQueueWaitIdle(m_device->m_queue);
12320 // Now we can actually destroy bufferView
12321 vkDestroyBufferView(m_device->device(), view, NULL);
12322 vkDestroyBuffer(m_device->device(), buffer, NULL);
12323 vkFreeMemory(m_device->device(), buffer_memory, NULL);
12324 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12325 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12326 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12327}
12328
Tobin Ehlis209532e2016-09-07 13:52:18 -060012329TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
12330 TEST_DESCRIPTION("Delete in-use sampler.");
12331
12332 ASSERT_NO_FATAL_FAILURE(InitState());
12333 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12334
12335 VkDescriptorPoolSize ds_type_count;
12336 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12337 ds_type_count.descriptorCount = 1;
12338
12339 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12340 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12341 ds_pool_ci.maxSets = 1;
12342 ds_pool_ci.poolSizeCount = 1;
12343 ds_pool_ci.pPoolSizes = &ds_type_count;
12344
12345 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012346 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012347 ASSERT_VK_SUCCESS(err);
12348
12349 VkSamplerCreateInfo sampler_ci = {};
12350 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12351 sampler_ci.pNext = NULL;
12352 sampler_ci.magFilter = VK_FILTER_NEAREST;
12353 sampler_ci.minFilter = VK_FILTER_NEAREST;
12354 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12355 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12356 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12357 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12358 sampler_ci.mipLodBias = 1.0;
12359 sampler_ci.anisotropyEnable = VK_FALSE;
12360 sampler_ci.maxAnisotropy = 1;
12361 sampler_ci.compareEnable = VK_FALSE;
12362 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12363 sampler_ci.minLod = 1.0;
12364 sampler_ci.maxLod = 1.0;
12365 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12366 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12367 VkSampler sampler;
12368
12369 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12370 ASSERT_VK_SUCCESS(err);
12371
12372 VkDescriptorSetLayoutBinding layout_binding;
12373 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060012374 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060012375 layout_binding.descriptorCount = 1;
12376 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12377 layout_binding.pImmutableSamplers = NULL;
12378
12379 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12380 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12381 ds_layout_ci.bindingCount = 1;
12382 ds_layout_ci.pBindings = &layout_binding;
12383 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012384 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012385 ASSERT_VK_SUCCESS(err);
12386
12387 VkDescriptorSetAllocateInfo alloc_info = {};
12388 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12389 alloc_info.descriptorSetCount = 1;
12390 alloc_info.descriptorPool = ds_pool;
12391 alloc_info.pSetLayouts = &ds_layout;
12392 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012393 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012394 ASSERT_VK_SUCCESS(err);
12395
12396 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12397 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12398 pipeline_layout_ci.pNext = NULL;
12399 pipeline_layout_ci.setLayoutCount = 1;
12400 pipeline_layout_ci.pSetLayouts = &ds_layout;
12401
12402 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012403 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012404 ASSERT_VK_SUCCESS(err);
12405
12406 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012407 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 -060012408 ASSERT_TRUE(image.initialized());
12409
12410 VkImageView view;
12411 VkImageViewCreateInfo ivci = {};
12412 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12413 ivci.image = image.handle();
12414 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12415 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12416 ivci.subresourceRange.layerCount = 1;
12417 ivci.subresourceRange.baseMipLevel = 0;
12418 ivci.subresourceRange.levelCount = 1;
12419 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12420
12421 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12422 ASSERT_VK_SUCCESS(err);
12423
12424 VkDescriptorImageInfo image_info{};
12425 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12426 image_info.imageView = view;
12427 image_info.sampler = sampler;
12428
12429 VkWriteDescriptorSet descriptor_write = {};
12430 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12431 descriptor_write.dstSet = descriptor_set;
12432 descriptor_write.dstBinding = 0;
12433 descriptor_write.descriptorCount = 1;
12434 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12435 descriptor_write.pImageInfo = &image_info;
12436
12437 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12438
12439 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012440 char const *vsSource =
12441 "#version 450\n"
12442 "\n"
12443 "out gl_PerVertex { \n"
12444 " vec4 gl_Position;\n"
12445 "};\n"
12446 "void main(){\n"
12447 " gl_Position = vec4(1);\n"
12448 "}\n";
12449 char const *fsSource =
12450 "#version 450\n"
12451 "\n"
12452 "layout(set=0, binding=0) uniform sampler2D s;\n"
12453 "layout(location=0) out vec4 x;\n"
12454 "void main(){\n"
12455 " x = texture(s, vec2(1));\n"
12456 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060012457 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12458 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12459 VkPipelineObj pipe(m_device);
12460 pipe.AddShader(&vs);
12461 pipe.AddShader(&fs);
12462 pipe.AddColorAttachment();
12463 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12464
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012466
Tony Barbour552f6c02016-12-21 14:34:07 -070012467 m_commandBuffer->BeginCommandBuffer();
12468 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012469 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012470 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12471 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12472 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070012473
12474 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12475 VkRect2D scissor = {{0, 0}, {16, 16}};
12476 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12477 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12478
Tobin Ehlis209532e2016-09-07 13:52:18 -060012479 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012480 m_commandBuffer->EndRenderPass();
12481 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060012482 // Submit cmd buffer then destroy sampler
12483 VkSubmitInfo submit_info = {};
12484 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12485 submit_info.commandBufferCount = 1;
12486 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12487 // Submit cmd buffer and then destroy sampler while in-flight
12488 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12489
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012490 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060012491 m_errorMonitor->VerifyFound();
12492 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070012493
Tobin Ehlis209532e2016-09-07 13:52:18 -060012494 // Now we can actually destroy sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012495 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060012496 vkDestroyImageView(m_device->device(), view, NULL);
12497 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12498 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12499 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12500}
12501
Mark Mueller1cd9f412016-08-25 13:23:52 -060012502TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012503 TEST_DESCRIPTION(
12504 "Call VkQueueSubmit with a semaphore that is already "
12505 "signaled but not waited on by the queue. Wait on a "
12506 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060012507
12508 ASSERT_NO_FATAL_FAILURE(InitState());
12509 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12510
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012511 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 -070012512 const char *invalid_fence_wait_message =
12513 " which has not been submitted on a Queue or during "
12514 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060012515
Tony Barbour552f6c02016-12-21 14:34:07 -070012516 m_commandBuffer->BeginCommandBuffer();
12517 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060012518
12519 VkSemaphoreCreateInfo semaphore_create_info = {};
12520 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12521 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012522 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060012523 VkSubmitInfo submit_info = {};
12524 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12525 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012526 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060012527 submit_info.signalSemaphoreCount = 1;
12528 submit_info.pSignalSemaphores = &semaphore;
12529 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012530 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060012531 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070012532 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070012533 m_commandBuffer->BeginCommandBuffer();
12534 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012535 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060012536 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12537 m_errorMonitor->VerifyFound();
12538
Mark Mueller1cd9f412016-08-25 13:23:52 -060012539 VkFenceCreateInfo fence_create_info = {};
12540 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12541 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012542 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060012543
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060012545 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
12546 m_errorMonitor->VerifyFound();
12547
Mark Mueller4042b652016-09-05 22:52:21 -060012548 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060012549 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060012550 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12551}
12552
Tobin Ehlis4af23302016-07-19 10:50:30 -060012553TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012554 TEST_DESCRIPTION(
12555 "Bind a secondary command buffer with with a framebuffer "
12556 "that does not match the framebuffer for the active "
12557 "renderpass.");
Tobin Ehlis4af23302016-07-19 10:50:30 -060012558 ASSERT_NO_FATAL_FAILURE(InitState());
12559 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12560
12561 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012562 VkAttachmentDescription attachment = {0,
12563 VK_FORMAT_B8G8R8A8_UNORM,
12564 VK_SAMPLE_COUNT_1_BIT,
12565 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12566 VK_ATTACHMENT_STORE_OP_STORE,
12567 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12568 VK_ATTACHMENT_STORE_OP_DONT_CARE,
12569 VK_IMAGE_LAYOUT_UNDEFINED,
12570 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012571
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012572 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012573
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012574 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012575
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012576 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012577
12578 VkRenderPass rp;
12579 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
12580 ASSERT_VK_SUCCESS(err);
12581
12582 // A compatible framebuffer.
12583 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012584 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 -060012585 ASSERT_TRUE(image.initialized());
12586
12587 VkImageViewCreateInfo ivci = {
12588 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
12589 nullptr,
12590 0,
12591 image.handle(),
12592 VK_IMAGE_VIEW_TYPE_2D,
12593 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012594 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
12595 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060012596 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
12597 };
12598 VkImageView view;
12599 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
12600 ASSERT_VK_SUCCESS(err);
12601
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012602 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012603 VkFramebuffer fb;
12604 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
12605 ASSERT_VK_SUCCESS(err);
12606
12607 VkCommandBufferAllocateInfo cbai = {};
12608 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12609 cbai.commandPool = m_commandPool;
12610 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12611 cbai.commandBufferCount = 1;
12612
12613 VkCommandBuffer sec_cb;
12614 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
12615 ASSERT_VK_SUCCESS(err);
12616 VkCommandBufferBeginInfo cbbi = {};
12617 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130012618 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060012619 cbii.renderPass = renderPass();
12620 cbii.framebuffer = fb;
12621 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12622 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012623 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 -060012624 cbbi.pInheritanceInfo = &cbii;
12625 vkBeginCommandBuffer(sec_cb, &cbbi);
12626 vkEndCommandBuffer(sec_cb);
12627
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012628 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120012629 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
12630 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060012631
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060012633 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060012634 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
12635 m_errorMonitor->VerifyFound();
12636 // Cleanup
12637 vkDestroyImageView(m_device->device(), view, NULL);
12638 vkDestroyRenderPass(m_device->device(), rp, NULL);
12639 vkDestroyFramebuffer(m_device->device(), fb, NULL);
12640}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012641
12642TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012643 TEST_DESCRIPTION(
12644 "If logicOp is available on the device, set it to an "
12645 "invalid value. If logicOp is not available, attempt to "
12646 "use it and verify that we see the correct error.");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012647 ASSERT_NO_FATAL_FAILURE(InitState());
12648 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12649
12650 auto features = m_device->phy().features();
12651 // Set the expected error depending on whether or not logicOp available
12652 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12654 "If logic operations feature not "
12655 "enabled, logicOpEnable must be "
12656 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012657 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130012658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012659 }
12660 // Create a pipeline using logicOp
12661 VkResult err;
12662
12663 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12664 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12665
12666 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012667 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012668 ASSERT_VK_SUCCESS(err);
12669
12670 VkPipelineViewportStateCreateInfo vp_state_ci = {};
12671 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
12672 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012673 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012674 vp_state_ci.pViewports = &vp;
12675 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012676 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012677 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012678
12679 VkPipelineShaderStageCreateInfo shaderStages[2];
12680 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
12681
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012682 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12683 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012684 shaderStages[0] = vs.GetStageCreateInfo();
12685 shaderStages[1] = fs.GetStageCreateInfo();
12686
12687 VkPipelineVertexInputStateCreateInfo vi_ci = {};
12688 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
12689
12690 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
12691 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
12692 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
12693
12694 VkPipelineRasterizationStateCreateInfo rs_ci = {};
12695 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130012696 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012697
12698 VkPipelineColorBlendAttachmentState att = {};
12699 att.blendEnable = VK_FALSE;
12700 att.colorWriteMask = 0xf;
12701
12702 VkPipelineColorBlendStateCreateInfo cb_ci = {};
12703 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
12704 // Enable logicOp & set logicOp to value 1 beyond allowed entries
12705 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012706 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012707 cb_ci.attachmentCount = 1;
12708 cb_ci.pAttachments = &att;
12709
Chris Forbes8aeacbf2016-10-03 14:25:08 +130012710 VkPipelineMultisampleStateCreateInfo ms_ci = {};
12711 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12712 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12713
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012714 VkGraphicsPipelineCreateInfo gp_ci = {};
12715 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
12716 gp_ci.stageCount = 2;
12717 gp_ci.pStages = shaderStages;
12718 gp_ci.pVertexInputState = &vi_ci;
12719 gp_ci.pInputAssemblyState = &ia_ci;
12720 gp_ci.pViewportState = &vp_state_ci;
12721 gp_ci.pRasterizationState = &rs_ci;
12722 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130012723 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012724 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
12725 gp_ci.layout = pipeline_layout;
12726 gp_ci.renderPass = renderPass();
12727
12728 VkPipelineCacheCreateInfo pc_ci = {};
12729 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
12730
12731 VkPipeline pipeline;
12732 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012733 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012734 ASSERT_VK_SUCCESS(err);
12735
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012736 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012737 m_errorMonitor->VerifyFound();
12738 if (VK_SUCCESS == err) {
12739 vkDestroyPipeline(m_device->device(), pipeline, NULL);
12740 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012741 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
12742 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12743}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012744
Mike Stroyanaccf7692015-05-12 16:00:45 -060012745#if GTEST_IS_THREADSAFE
12746struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012747 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012748 VkEvent event;
12749 bool bailout;
12750};
12751
Karl Schultz6addd812016-02-02 17:17:23 -070012752extern "C" void *AddToCommandBuffer(void *arg) {
12753 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012754
Mike Stroyana6d14942016-07-13 15:10:05 -060012755 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012756 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012757 if (data->bailout) {
12758 break;
12759 }
12760 }
12761 return NULL;
12762}
12763
Karl Schultz6addd812016-02-02 17:17:23 -070012764TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012765 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012766
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012768
Mike Stroyanaccf7692015-05-12 16:00:45 -060012769 ASSERT_NO_FATAL_FAILURE(InitState());
12770 ASSERT_NO_FATAL_FAILURE(InitViewport());
12771 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12772
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012773 // Calls AllocateCommandBuffers
12774 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012775
12776 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012777 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012778
12779 VkEventCreateInfo event_info;
12780 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012781 VkResult err;
12782
12783 memset(&event_info, 0, sizeof(event_info));
12784 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12785
Chia-I Wuf7458c52015-10-26 21:10:41 +080012786 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012787 ASSERT_VK_SUCCESS(err);
12788
Mike Stroyanaccf7692015-05-12 16:00:45 -060012789 err = vkResetEvent(device(), event);
12790 ASSERT_VK_SUCCESS(err);
12791
12792 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012793 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012794 data.event = event;
12795 data.bailout = false;
12796 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060012797
12798 // First do some correct operations using multiple threads.
12799 // Add many entries to command buffer from another thread.
12800 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
12801 // Make non-conflicting calls from this thread at the same time.
12802 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060012803 uint32_t count;
12804 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060012805 }
12806 test_platform_thread_join(thread, NULL);
12807
12808 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060012809 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012810 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012811 // Add many entries to command buffer from this thread at the same time.
12812 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012813
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012814 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012815 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012816
Mike Stroyan10b8cb72016-01-22 15:22:03 -070012817 m_errorMonitor->SetBailout(NULL);
12818
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012819 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012820
Chia-I Wuf7458c52015-10-26 21:10:41 +080012821 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012822}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012823#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012824
Karl Schultz6addd812016-02-02 17:17:23 -070012825TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012826 TEST_DESCRIPTION(
12827 "Test that an error is produced for a spirv module "
12828 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120012829
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012831
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012832 ASSERT_NO_FATAL_FAILURE(InitState());
12833 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12834
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012835 VkShaderModule module;
12836 VkShaderModuleCreateInfo moduleCreateInfo;
12837 struct icd_spv_header spv;
12838
12839 spv.magic = ICD_SPV_MAGIC;
12840 spv.version = ICD_SPV_VERSION;
12841 spv.gen_magic = 0;
12842
12843 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12844 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012845 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012846 moduleCreateInfo.codeSize = 4;
12847 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012848 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012849
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012850 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012851}
12852
Karl Schultz6addd812016-02-02 17:17:23 -070012853TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012854 TEST_DESCRIPTION(
12855 "Test that an error is produced for a spirv module "
12856 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120012857
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012858 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012859
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012860 ASSERT_NO_FATAL_FAILURE(InitState());
12861 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12862
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012863 VkShaderModule module;
12864 VkShaderModuleCreateInfo moduleCreateInfo;
12865 struct icd_spv_header spv;
12866
12867 spv.magic = ~ICD_SPV_MAGIC;
12868 spv.version = ICD_SPV_VERSION;
12869 spv.gen_magic = 0;
12870
12871 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12872 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012873 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012874 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12875 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012876 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012877
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012878 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012879}
12880
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012881#if 0
12882// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070012883TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012885 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012886
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012887 ASSERT_NO_FATAL_FAILURE(InitState());
12888 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12889
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012890 VkShaderModule module;
12891 VkShaderModuleCreateInfo moduleCreateInfo;
12892 struct icd_spv_header spv;
12893
12894 spv.magic = ICD_SPV_MAGIC;
12895 spv.version = ~ICD_SPV_VERSION;
12896 spv.gen_magic = 0;
12897
12898 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12899 moduleCreateInfo.pNext = NULL;
12900
Karl Schultz6addd812016-02-02 17:17:23 -070012901 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012902 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12903 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012904 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012905
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012906 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012907}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012908#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012909
Karl Schultz6addd812016-02-02 17:17:23 -070012910TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012911 TEST_DESCRIPTION(
12912 "Test that a warning is produced for a vertex output that "
12913 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012914 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012915
Chris Forbes9f7ff632015-05-25 11:13:08 +120012916 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012917 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012918
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012919 char const *vsSource =
12920 "#version 450\n"
12921 "\n"
12922 "layout(location=0) out float x;\n"
12923 "out gl_PerVertex {\n"
12924 " vec4 gl_Position;\n"
12925 "};\n"
12926 "void main(){\n"
12927 " gl_Position = vec4(1);\n"
12928 " x = 0;\n"
12929 "}\n";
12930 char const *fsSource =
12931 "#version 450\n"
12932 "\n"
12933 "layout(location=0) out vec4 color;\n"
12934 "void main(){\n"
12935 " color = vec4(1);\n"
12936 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120012937
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012938 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12939 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012940
12941 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012942 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012943 pipe.AddShader(&vs);
12944 pipe.AddShader(&fs);
12945
Chris Forbes9f7ff632015-05-25 11:13:08 +120012946 VkDescriptorSetObj descriptorSet(m_device);
12947 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012948 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012949
Tony Barbour5781e8f2015-08-04 16:23:11 -060012950 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012951
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012952 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012953}
Chris Forbes9f7ff632015-05-25 11:13:08 +120012954
Mark Mueller098c9cb2016-09-08 09:01:57 -060012955TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
12956 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
12957
12958 ASSERT_NO_FATAL_FAILURE(InitState());
12959 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12960
12961 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012962 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060012963
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012964 char const *vsSource =
12965 "#version 450\n"
12966 "\n"
12967 "out gl_PerVertex {\n"
12968 " vec4 gl_Position;\n"
12969 "};\n"
12970 "void main(){\n"
12971 " gl_Position = vec4(1);\n"
12972 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060012973
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012974 char const *fsSource =
12975 "#version 450\n"
12976 "\n"
12977 "layout (constant_id = 0) const float r = 0.0f;\n"
12978 "layout(location = 0) out vec4 uFragColor;\n"
12979 "void main(){\n"
12980 " uFragColor = vec4(r,1,0,1);\n"
12981 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060012982
12983 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12984 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12985
12986 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12987 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12988
12989 VkPipelineLayout pipeline_layout;
12990 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12991
12992 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
12993 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
12994 vp_state_create_info.viewportCount = 1;
12995 VkViewport viewport = {};
12996 vp_state_create_info.pViewports = &viewport;
12997 vp_state_create_info.scissorCount = 1;
12998 VkRect2D scissors = {};
12999 vp_state_create_info.pScissors = &scissors;
13000
13001 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13002
13003 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13004 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13005 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13006 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13007
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013008 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013009
13010 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13011 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13012
13013 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13014 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13015 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13016
13017 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13018 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13019 rasterization_state_create_info.pNext = nullptr;
13020 rasterization_state_create_info.lineWidth = 1.0f;
13021 rasterization_state_create_info.rasterizerDiscardEnable = true;
13022
13023 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13024 color_blend_attachment_state.blendEnable = VK_FALSE;
13025 color_blend_attachment_state.colorWriteMask = 0xf;
13026
13027 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13028 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13029 color_blend_state_create_info.attachmentCount = 1;
13030 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13031
13032 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13033 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13034 graphicspipe_create_info.stageCount = 2;
13035 graphicspipe_create_info.pStages = shader_stage_create_info;
13036 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13037 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13038 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13039 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13040 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13041 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13042 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13043 graphicspipe_create_info.layout = pipeline_layout;
13044 graphicspipe_create_info.renderPass = renderPass();
13045
13046 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13047 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13048
13049 VkPipelineCache pipelineCache;
13050 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13051
13052 // This structure maps constant ids to data locations.
13053 const VkSpecializationMapEntry entry =
13054 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013055 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013056
13057 uint32_t data = 1;
13058
13059 // Set up the info describing spec map and data
13060 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013061 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013062 };
13063 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13064
13065 VkPipeline pipeline;
13066 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13067 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13068 m_errorMonitor->VerifyFound();
13069
13070 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13071 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13072}
13073
13074TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13075 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13076
13077 ASSERT_NO_FATAL_FAILURE(InitState());
13078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13079
13080 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13081
13082 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13083 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13084 descriptor_pool_type_count[0].descriptorCount = 1;
13085 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13086 descriptor_pool_type_count[1].descriptorCount = 1;
13087
13088 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13089 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13090 descriptor_pool_create_info.maxSets = 1;
13091 descriptor_pool_create_info.poolSizeCount = 2;
13092 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13093 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13094
13095 VkDescriptorPool descriptorset_pool;
13096 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13097
13098 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13099 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13100 descriptorset_layout_binding.descriptorCount = 1;
13101 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
13102
13103 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13104 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13105 descriptorset_layout_create_info.bindingCount = 1;
13106 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13107
13108 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013109 ASSERT_VK_SUCCESS(
13110 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013111
13112 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13113 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13114 descriptorset_allocate_info.descriptorSetCount = 1;
13115 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13116 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13117 VkDescriptorSet descriptorset;
13118 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13119
13120 // Challenge core_validation with a non uniform buffer type.
13121 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13122
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013123 char const *vsSource =
13124 "#version 450\n"
13125 "\n"
13126 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13127 " mat4 mvp;\n"
13128 "} ubuf;\n"
13129 "out gl_PerVertex {\n"
13130 " vec4 gl_Position;\n"
13131 "};\n"
13132 "void main(){\n"
13133 " gl_Position = ubuf.mvp * vec4(1);\n"
13134 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013135
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013136 char const *fsSource =
13137 "#version 450\n"
13138 "\n"
13139 "layout(location = 0) out vec4 uFragColor;\n"
13140 "void main(){\n"
13141 " uFragColor = vec4(0,1,0,1);\n"
13142 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013143
13144 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13145 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13146
13147 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13148 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13149 pipeline_layout_create_info.setLayoutCount = 1;
13150 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13151
13152 VkPipelineLayout pipeline_layout;
13153 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13154
13155 VkPipelineObj pipe(m_device);
13156 pipe.AddColorAttachment();
13157 pipe.AddShader(&vs);
13158 pipe.AddShader(&fs);
13159
13160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13161 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13162 m_errorMonitor->VerifyFound();
13163
13164 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13165 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13166 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13167}
13168
13169TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13170 TEST_DESCRIPTION(
13171 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13172
13173 ASSERT_NO_FATAL_FAILURE(InitState());
13174 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13175
13176 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13177
13178 VkDescriptorPoolSize descriptor_pool_type_count = {};
13179 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13180 descriptor_pool_type_count.descriptorCount = 1;
13181
13182 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13183 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13184 descriptor_pool_create_info.maxSets = 1;
13185 descriptor_pool_create_info.poolSizeCount = 1;
13186 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13187 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13188
13189 VkDescriptorPool descriptorset_pool;
13190 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13191
13192 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13193 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13194 descriptorset_layout_binding.descriptorCount = 1;
13195 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13196 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13197
13198 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13199 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13200 descriptorset_layout_create_info.bindingCount = 1;
13201 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13202
13203 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013204 ASSERT_VK_SUCCESS(
13205 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013206
13207 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13208 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13209 descriptorset_allocate_info.descriptorSetCount = 1;
13210 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13211 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13212 VkDescriptorSet descriptorset;
13213 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13214
13215 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13216
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013217 char const *vsSource =
13218 "#version 450\n"
13219 "\n"
13220 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13221 " mat4 mvp;\n"
13222 "} ubuf;\n"
13223 "out gl_PerVertex {\n"
13224 " vec4 gl_Position;\n"
13225 "};\n"
13226 "void main(){\n"
13227 " gl_Position = ubuf.mvp * vec4(1);\n"
13228 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013229
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013230 char const *fsSource =
13231 "#version 450\n"
13232 "\n"
13233 "layout(location = 0) out vec4 uFragColor;\n"
13234 "void main(){\n"
13235 " uFragColor = vec4(0,1,0,1);\n"
13236 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013237
13238 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13239 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13240
13241 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13242 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13243 pipeline_layout_create_info.setLayoutCount = 1;
13244 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13245
13246 VkPipelineLayout pipeline_layout;
13247 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13248
13249 VkPipelineObj pipe(m_device);
13250 pipe.AddColorAttachment();
13251 pipe.AddShader(&vs);
13252 pipe.AddShader(&fs);
13253
13254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
13255 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13256 m_errorMonitor->VerifyFound();
13257
13258 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13259 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13260 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13261}
13262
13263TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013264 TEST_DESCRIPTION(
13265 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
13266 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013267
13268 ASSERT_NO_FATAL_FAILURE(InitState());
13269 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13270
13271 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013272 "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 -060013273
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013274 char const *vsSource =
13275 "#version 450\n"
13276 "\n"
13277 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13278 "out gl_PerVertex {\n"
13279 " vec4 gl_Position;\n"
13280 "};\n"
13281 "void main(){\n"
13282 " gl_Position = vec4(consts.x);\n"
13283 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013284
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013285 char const *fsSource =
13286 "#version 450\n"
13287 "\n"
13288 "layout(location = 0) out vec4 uFragColor;\n"
13289 "void main(){\n"
13290 " uFragColor = vec4(0,1,0,1);\n"
13291 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013292
13293 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13294 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13295
13296 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13297 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13298
13299 // Set up a push constant range
13300 VkPushConstantRange push_constant_ranges = {};
13301 // Set to the wrong stage to challenge core_validation
13302 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13303 push_constant_ranges.size = 4;
13304
13305 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
13306 pipeline_layout_create_info.pushConstantRangeCount = 1;
13307
13308 VkPipelineLayout pipeline_layout;
13309 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13310
13311 VkPipelineObj pipe(m_device);
13312 pipe.AddColorAttachment();
13313 pipe.AddShader(&vs);
13314 pipe.AddShader(&fs);
13315
13316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
13317 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13318 m_errorMonitor->VerifyFound();
13319
13320 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13321}
13322
13323TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
13324 TEST_DESCRIPTION(
13325 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
13326
13327 ASSERT_NO_FATAL_FAILURE(InitState());
13328 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13329
13330 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013331 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013332
13333 // Some awkward steps are required to test with custom device features.
13334 std::vector<const char *> device_extension_names;
13335 auto features = m_device->phy().features();
13336 // Disable support for 64 bit floats
13337 features.shaderFloat64 = false;
13338 // The sacrificial device object
13339 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13340
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013341 char const *vsSource =
13342 "#version 450\n"
13343 "\n"
13344 "out gl_PerVertex {\n"
13345 " vec4 gl_Position;\n"
13346 "};\n"
13347 "void main(){\n"
13348 " gl_Position = vec4(1);\n"
13349 "}\n";
13350 char const *fsSource =
13351 "#version 450\n"
13352 "\n"
13353 "layout(location=0) out vec4 color;\n"
13354 "void main(){\n"
13355 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13356 " color = vec4(green);\n"
13357 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013358
13359 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13360 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13361
13362 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013363
13364 VkPipelineObj pipe(&test_device);
13365 pipe.AddColorAttachment();
13366 pipe.AddShader(&vs);
13367 pipe.AddShader(&fs);
13368
13369 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13370 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13371 VkPipelineLayout pipeline_layout;
13372 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13373
13374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
13375 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
13376 m_errorMonitor->VerifyFound();
13377
13378 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
13379}
13380
13381TEST_F(VkLayerTest, CreatePipelineCheckShaderBadCapability) {
13382 TEST_DESCRIPTION("Create a graphics pipeline in which a capability declared by the shader is not supported by Vulkan shaders.");
13383
13384 ASSERT_NO_FATAL_FAILURE(InitState());
13385 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13386
13387 const char *bad_capability_message = "Shader declares capability 53, not supported in Vulkan.";
13388
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013389 char const *vsSource =
13390 "#version 450\n"
13391 "\n"
13392 "out gl_PerVertex {\n"
13393 " vec4 gl_Position;\n"
13394 "};\n"
13395 "layout(xfb_buffer = 1) out;"
13396 "void main(){\n"
13397 " gl_Position = vec4(1);\n"
13398 "}\n";
13399 char const *fsSource =
13400 "#version 450\n"
13401 "\n"
13402 "layout(location=0) out vec4 color;\n"
13403 "void main(){\n"
13404 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13405 " color = vec4(green);\n"
13406 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013407
13408 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13409 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13410
13411 VkPipelineObj pipe(m_device);
13412 pipe.AddColorAttachment();
13413 pipe.AddShader(&vs);
13414 pipe.AddShader(&fs);
13415
13416 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13417 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13418 VkPipelineLayout pipeline_layout;
13419 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13420
13421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_capability_message);
13422 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13423 m_errorMonitor->VerifyFound();
13424
13425 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13426}
13427
Karl Schultz6addd812016-02-02 17:17:23 -070013428TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013429 TEST_DESCRIPTION(
13430 "Test that an error is produced for a fragment shader input "
13431 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120013432
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013434
Chris Forbes59cb88d2015-05-25 11:13:13 +120013435 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013436 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013437
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013438 char const *vsSource =
13439 "#version 450\n"
13440 "\n"
13441 "out gl_PerVertex {\n"
13442 " vec4 gl_Position;\n"
13443 "};\n"
13444 "void main(){\n"
13445 " gl_Position = vec4(1);\n"
13446 "}\n";
13447 char const *fsSource =
13448 "#version 450\n"
13449 "\n"
13450 "layout(location=0) in float x;\n"
13451 "layout(location=0) out vec4 color;\n"
13452 "void main(){\n"
13453 " color = vec4(x);\n"
13454 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120013455
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013456 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13457 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120013458
13459 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013460 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120013461 pipe.AddShader(&vs);
13462 pipe.AddShader(&fs);
13463
Chris Forbes59cb88d2015-05-25 11:13:13 +120013464 VkDescriptorSetObj descriptorSet(m_device);
13465 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013466 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120013467
Tony Barbour5781e8f2015-08-04 16:23:11 -060013468 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013469
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013470 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120013471}
13472
Karl Schultz6addd812016-02-02 17:17:23 -070013473TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013474 TEST_DESCRIPTION(
13475 "Test that an error is produced for a fragment shader input "
13476 "within an interace block, which is not present in the outputs "
13477 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013479
13480 ASSERT_NO_FATAL_FAILURE(InitState());
13481 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13482
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013483 char const *vsSource =
13484 "#version 450\n"
13485 "\n"
13486 "out gl_PerVertex {\n"
13487 " vec4 gl_Position;\n"
13488 "};\n"
13489 "void main(){\n"
13490 " gl_Position = vec4(1);\n"
13491 "}\n";
13492 char const *fsSource =
13493 "#version 450\n"
13494 "\n"
13495 "in block { layout(location=0) float x; } ins;\n"
13496 "layout(location=0) out vec4 color;\n"
13497 "void main(){\n"
13498 " color = vec4(ins.x);\n"
13499 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130013500
13501 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13502 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13503
13504 VkPipelineObj pipe(m_device);
13505 pipe.AddColorAttachment();
13506 pipe.AddShader(&vs);
13507 pipe.AddShader(&fs);
13508
13509 VkDescriptorSetObj descriptorSet(m_device);
13510 descriptorSet.AppendDummy();
13511 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13512
13513 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13514
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013515 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013516}
13517
Karl Schultz6addd812016-02-02 17:17:23 -070013518TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013519 TEST_DESCRIPTION(
13520 "Test that an error is produced for mismatched array sizes "
13521 "across the vertex->fragment shader interface");
13522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13523 "Type mismatch on location 0.0: 'ptr to "
13524 "output arr[2] of float32' vs 'ptr to "
13525 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130013526
13527 ASSERT_NO_FATAL_FAILURE(InitState());
13528 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13529
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013530 char const *vsSource =
13531 "#version 450\n"
13532 "\n"
13533 "layout(location=0) out float x[2];\n"
13534 "out gl_PerVertex {\n"
13535 " vec4 gl_Position;\n"
13536 "};\n"
13537 "void main(){\n"
13538 " x[0] = 0; x[1] = 0;\n"
13539 " gl_Position = vec4(1);\n"
13540 "}\n";
13541 char const *fsSource =
13542 "#version 450\n"
13543 "\n"
13544 "layout(location=0) in float x[1];\n"
13545 "layout(location=0) out vec4 color;\n"
13546 "void main(){\n"
13547 " color = vec4(x[0]);\n"
13548 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130013549
13550 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13551 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13552
13553 VkPipelineObj pipe(m_device);
13554 pipe.AddColorAttachment();
13555 pipe.AddShader(&vs);
13556 pipe.AddShader(&fs);
13557
13558 VkDescriptorSetObj descriptorSet(m_device);
13559 descriptorSet.AppendDummy();
13560 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13561
13562 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13563
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013564 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130013565}
13566
Karl Schultz6addd812016-02-02 17:17:23 -070013567TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013568 TEST_DESCRIPTION(
13569 "Test that an error is produced for mismatched types across "
13570 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013572
Chris Forbesb56af562015-05-25 11:13:17 +120013573 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013574 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120013575
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013576 char const *vsSource =
13577 "#version 450\n"
13578 "\n"
13579 "layout(location=0) out int x;\n"
13580 "out gl_PerVertex {\n"
13581 " vec4 gl_Position;\n"
13582 "};\n"
13583 "void main(){\n"
13584 " x = 0;\n"
13585 " gl_Position = vec4(1);\n"
13586 "}\n";
13587 char const *fsSource =
13588 "#version 450\n"
13589 "\n"
13590 "layout(location=0) in float x;\n" /* VS writes int */
13591 "layout(location=0) out vec4 color;\n"
13592 "void main(){\n"
13593 " color = vec4(x);\n"
13594 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120013595
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013596 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13597 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120013598
13599 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013600 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120013601 pipe.AddShader(&vs);
13602 pipe.AddShader(&fs);
13603
Chris Forbesb56af562015-05-25 11:13:17 +120013604 VkDescriptorSetObj descriptorSet(m_device);
13605 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013606 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120013607
Tony Barbour5781e8f2015-08-04 16:23:11 -060013608 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120013609
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013610 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120013611}
13612
Karl Schultz6addd812016-02-02 17:17:23 -070013613TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013614 TEST_DESCRIPTION(
13615 "Test that an error is produced for mismatched types across "
13616 "the vertex->fragment shader interface, when the variable is contained within "
13617 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013618 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013619
13620 ASSERT_NO_FATAL_FAILURE(InitState());
13621 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13622
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013623 char const *vsSource =
13624 "#version 450\n"
13625 "\n"
13626 "out block { layout(location=0) int x; } outs;\n"
13627 "out gl_PerVertex {\n"
13628 " vec4 gl_Position;\n"
13629 "};\n"
13630 "void main(){\n"
13631 " outs.x = 0;\n"
13632 " gl_Position = vec4(1);\n"
13633 "}\n";
13634 char const *fsSource =
13635 "#version 450\n"
13636 "\n"
13637 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
13638 "layout(location=0) out vec4 color;\n"
13639 "void main(){\n"
13640 " color = vec4(ins.x);\n"
13641 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130013642
13643 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13644 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13645
13646 VkPipelineObj pipe(m_device);
13647 pipe.AddColorAttachment();
13648 pipe.AddShader(&vs);
13649 pipe.AddShader(&fs);
13650
13651 VkDescriptorSetObj descriptorSet(m_device);
13652 descriptorSet.AppendDummy();
13653 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13654
13655 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13656
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013657 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013658}
13659
13660TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013661 TEST_DESCRIPTION(
13662 "Test that an error is produced for location mismatches across "
13663 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
13664 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013665 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 +130013666
13667 ASSERT_NO_FATAL_FAILURE(InitState());
13668 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13669
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013670 char const *vsSource =
13671 "#version 450\n"
13672 "\n"
13673 "out block { layout(location=1) float x; } outs;\n"
13674 "out gl_PerVertex {\n"
13675 " vec4 gl_Position;\n"
13676 "};\n"
13677 "void main(){\n"
13678 " outs.x = 0;\n"
13679 " gl_Position = vec4(1);\n"
13680 "}\n";
13681 char const *fsSource =
13682 "#version 450\n"
13683 "\n"
13684 "in block { layout(location=0) float x; } ins;\n"
13685 "layout(location=0) out vec4 color;\n"
13686 "void main(){\n"
13687 " color = vec4(ins.x);\n"
13688 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130013689
13690 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13691 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13692
13693 VkPipelineObj pipe(m_device);
13694 pipe.AddColorAttachment();
13695 pipe.AddShader(&vs);
13696 pipe.AddShader(&fs);
13697
13698 VkDescriptorSetObj descriptorSet(m_device);
13699 descriptorSet.AppendDummy();
13700 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13701
13702 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13703
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013704 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013705}
13706
13707TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013708 TEST_DESCRIPTION(
13709 "Test that an error is produced for component mismatches across the "
13710 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
13711 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013712 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 +130013713
13714 ASSERT_NO_FATAL_FAILURE(InitState());
13715 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13716
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013717 char const *vsSource =
13718 "#version 450\n"
13719 "\n"
13720 "out block { layout(location=0, component=0) float x; } outs;\n"
13721 "out gl_PerVertex {\n"
13722 " vec4 gl_Position;\n"
13723 "};\n"
13724 "void main(){\n"
13725 " outs.x = 0;\n"
13726 " gl_Position = vec4(1);\n"
13727 "}\n";
13728 char const *fsSource =
13729 "#version 450\n"
13730 "\n"
13731 "in block { layout(location=0, component=1) float x; } ins;\n"
13732 "layout(location=0) out vec4 color;\n"
13733 "void main(){\n"
13734 " color = vec4(ins.x);\n"
13735 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130013736
13737 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13738 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13739
13740 VkPipelineObj pipe(m_device);
13741 pipe.AddColorAttachment();
13742 pipe.AddShader(&vs);
13743 pipe.AddShader(&fs);
13744
13745 VkDescriptorSetObj descriptorSet(m_device);
13746 descriptorSet.AppendDummy();
13747 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13748
13749 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13750
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013751 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013752}
13753
Chris Forbes1f3b0152016-11-30 12:48:40 +130013754TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
13755 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
13756
13757 ASSERT_NO_FATAL_FAILURE(InitState());
13758 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13759
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013760 char const *vsSource =
13761 "#version 450\n"
13762 "layout(location=0) out mediump float x;\n"
13763 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
13764 char const *fsSource =
13765 "#version 450\n"
13766 "layout(location=0) in highp float x;\n"
13767 "layout(location=0) out vec4 color;\n"
13768 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130013769
13770 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13771 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13772
13773 VkPipelineObj pipe(m_device);
13774 pipe.AddColorAttachment();
13775 pipe.AddShader(&vs);
13776 pipe.AddShader(&fs);
13777
13778 VkDescriptorSetObj descriptorSet(m_device);
13779 descriptorSet.AppendDummy();
13780 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13781
13782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
13783
13784 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13785
13786 m_errorMonitor->VerifyFound();
13787}
13788
Chris Forbes870a39e2016-11-30 12:55:56 +130013789TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
13790 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
13791
13792 ASSERT_NO_FATAL_FAILURE(InitState());
13793 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13794
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013795 char const *vsSource =
13796 "#version 450\n"
13797 "out block { layout(location=0) mediump float x; };\n"
13798 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
13799 char const *fsSource =
13800 "#version 450\n"
13801 "in block { layout(location=0) highp float x; };\n"
13802 "layout(location=0) out vec4 color;\n"
13803 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130013804
13805 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13806 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13807
13808 VkPipelineObj pipe(m_device);
13809 pipe.AddColorAttachment();
13810 pipe.AddShader(&vs);
13811 pipe.AddShader(&fs);
13812
13813 VkDescriptorSetObj descriptorSet(m_device);
13814 descriptorSet.AppendDummy();
13815 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13816
13817 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
13818
13819 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13820
13821 m_errorMonitor->VerifyFound();
13822}
13823
Karl Schultz6addd812016-02-02 17:17:23 -070013824TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013825 TEST_DESCRIPTION(
13826 "Test that a warning is produced for a vertex attribute which is "
13827 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013829
Chris Forbesde136e02015-05-25 11:13:28 +120013830 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013831 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120013832
13833 VkVertexInputBindingDescription input_binding;
13834 memset(&input_binding, 0, sizeof(input_binding));
13835
13836 VkVertexInputAttributeDescription input_attrib;
13837 memset(&input_attrib, 0, sizeof(input_attrib));
13838 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13839
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013840 char const *vsSource =
13841 "#version 450\n"
13842 "\n"
13843 "out gl_PerVertex {\n"
13844 " vec4 gl_Position;\n"
13845 "};\n"
13846 "void main(){\n"
13847 " gl_Position = vec4(1);\n"
13848 "}\n";
13849 char const *fsSource =
13850 "#version 450\n"
13851 "\n"
13852 "layout(location=0) out vec4 color;\n"
13853 "void main(){\n"
13854 " color = vec4(1);\n"
13855 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120013856
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013857 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13858 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120013859
13860 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013861 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120013862 pipe.AddShader(&vs);
13863 pipe.AddShader(&fs);
13864
13865 pipe.AddVertexInputBindings(&input_binding, 1);
13866 pipe.AddVertexInputAttribs(&input_attrib, 1);
13867
Chris Forbesde136e02015-05-25 11:13:28 +120013868 VkDescriptorSetObj descriptorSet(m_device);
13869 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013870 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120013871
Tony Barbour5781e8f2015-08-04 16:23:11 -060013872 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120013873
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013874 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120013875}
13876
Karl Schultz6addd812016-02-02 17:17:23 -070013877TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013878 TEST_DESCRIPTION(
13879 "Test that a warning is produced for a location mismatch on "
13880 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013881 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130013882
13883 ASSERT_NO_FATAL_FAILURE(InitState());
13884 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13885
13886 VkVertexInputBindingDescription input_binding;
13887 memset(&input_binding, 0, sizeof(input_binding));
13888
13889 VkVertexInputAttributeDescription input_attrib;
13890 memset(&input_attrib, 0, sizeof(input_attrib));
13891 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13892
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013893 char const *vsSource =
13894 "#version 450\n"
13895 "\n"
13896 "layout(location=1) in float x;\n"
13897 "out gl_PerVertex {\n"
13898 " vec4 gl_Position;\n"
13899 "};\n"
13900 "void main(){\n"
13901 " gl_Position = vec4(x);\n"
13902 "}\n";
13903 char const *fsSource =
13904 "#version 450\n"
13905 "\n"
13906 "layout(location=0) out vec4 color;\n"
13907 "void main(){\n"
13908 " color = vec4(1);\n"
13909 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130013910
13911 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13912 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13913
13914 VkPipelineObj pipe(m_device);
13915 pipe.AddColorAttachment();
13916 pipe.AddShader(&vs);
13917 pipe.AddShader(&fs);
13918
13919 pipe.AddVertexInputBindings(&input_binding, 1);
13920 pipe.AddVertexInputAttribs(&input_attrib, 1);
13921
13922 VkDescriptorSetObj descriptorSet(m_device);
13923 descriptorSet.AppendDummy();
13924 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13925
13926 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13927
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013928 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130013929}
13930
Karl Schultz6addd812016-02-02 17:17:23 -070013931TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013932 TEST_DESCRIPTION(
13933 "Test that an error is produced for a vertex shader input which is not "
13934 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13936 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013937
Chris Forbes62e8e502015-05-25 11:13:29 +120013938 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013939 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120013940
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013941 char const *vsSource =
13942 "#version 450\n"
13943 "\n"
13944 "layout(location=0) in vec4 x;\n" /* not provided */
13945 "out gl_PerVertex {\n"
13946 " vec4 gl_Position;\n"
13947 "};\n"
13948 "void main(){\n"
13949 " gl_Position = x;\n"
13950 "}\n";
13951 char const *fsSource =
13952 "#version 450\n"
13953 "\n"
13954 "layout(location=0) out vec4 color;\n"
13955 "void main(){\n"
13956 " color = vec4(1);\n"
13957 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120013958
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013959 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13960 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120013961
13962 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013963 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120013964 pipe.AddShader(&vs);
13965 pipe.AddShader(&fs);
13966
Chris Forbes62e8e502015-05-25 11:13:29 +120013967 VkDescriptorSetObj descriptorSet(m_device);
13968 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013969 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120013970
Tony Barbour5781e8f2015-08-04 16:23:11 -060013971 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120013972
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013973 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120013974}
13975
Karl Schultz6addd812016-02-02 17:17:23 -070013976TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013977 TEST_DESCRIPTION(
13978 "Test that an error is produced for a mismatch between the "
13979 "fundamental type (float/int/uint) of an attribute and the "
13980 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060013981 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 -060013982
Chris Forbesc97d98e2015-05-25 11:13:31 +120013983 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013984 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013985
13986 VkVertexInputBindingDescription input_binding;
13987 memset(&input_binding, 0, sizeof(input_binding));
13988
13989 VkVertexInputAttributeDescription input_attrib;
13990 memset(&input_attrib, 0, sizeof(input_attrib));
13991 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13992
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013993 char const *vsSource =
13994 "#version 450\n"
13995 "\n"
13996 "layout(location=0) in int x;\n" /* attrib provided float */
13997 "out gl_PerVertex {\n"
13998 " vec4 gl_Position;\n"
13999 "};\n"
14000 "void main(){\n"
14001 " gl_Position = vec4(x);\n"
14002 "}\n";
14003 char const *fsSource =
14004 "#version 450\n"
14005 "\n"
14006 "layout(location=0) out vec4 color;\n"
14007 "void main(){\n"
14008 " color = vec4(1);\n"
14009 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014010
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014011 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14012 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014013
14014 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014015 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014016 pipe.AddShader(&vs);
14017 pipe.AddShader(&fs);
14018
14019 pipe.AddVertexInputBindings(&input_binding, 1);
14020 pipe.AddVertexInputAttribs(&input_attrib, 1);
14021
Chris Forbesc97d98e2015-05-25 11:13:31 +120014022 VkDescriptorSetObj descriptorSet(m_device);
14023 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014024 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014025
Tony Barbour5781e8f2015-08-04 16:23:11 -060014026 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014027
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014028 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014029}
14030
Chris Forbesc68b43c2016-04-06 11:18:47 +120014031TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014032 TEST_DESCRIPTION(
14033 "Test that an error is produced for a pipeline containing multiple "
14034 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014035 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14036 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014037
14038 ASSERT_NO_FATAL_FAILURE(InitState());
14039 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14040
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014041 char const *vsSource =
14042 "#version 450\n"
14043 "\n"
14044 "out gl_PerVertex {\n"
14045 " vec4 gl_Position;\n"
14046 "};\n"
14047 "void main(){\n"
14048 " gl_Position = vec4(1);\n"
14049 "}\n";
14050 char const *fsSource =
14051 "#version 450\n"
14052 "\n"
14053 "layout(location=0) out vec4 color;\n"
14054 "void main(){\n"
14055 " color = vec4(1);\n"
14056 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014057
14058 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14059 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14060
14061 VkPipelineObj pipe(m_device);
14062 pipe.AddColorAttachment();
14063 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014064 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014065 pipe.AddShader(&fs);
14066
14067 VkDescriptorSetObj descriptorSet(m_device);
14068 descriptorSet.AppendDummy();
14069 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14070
14071 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14072
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014073 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014074}
14075
Chris Forbes82ff92a2016-09-09 10:50:24 +120014076TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014078
14079 ASSERT_NO_FATAL_FAILURE(InitState());
14080 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14081
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014082 char const *vsSource =
14083 "#version 450\n"
14084 "out gl_PerVertex {\n"
14085 " vec4 gl_Position;\n"
14086 "};\n"
14087 "void main(){\n"
14088 " gl_Position = vec4(0);\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 Forbes82ff92a2016-09-09 10:50:24 +120014097
14098 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14099 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14100
14101 VkPipelineObj pipe(m_device);
14102 pipe.AddColorAttachment();
14103 pipe.AddShader(&vs);
14104 pipe.AddShader(&fs);
14105
14106 VkDescriptorSetObj descriptorSet(m_device);
14107 descriptorSet.AppendDummy();
14108 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14109
14110 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14111
14112 m_errorMonitor->VerifyFound();
14113}
14114
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014115TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014116 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14117 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14118 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014119
14120 ASSERT_NO_FATAL_FAILURE(InitState());
14121 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14122
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014123 char const *vsSource =
14124 "#version 450\n"
14125 "void main(){ gl_Position = vec4(0); }\n";
14126 char const *fsSource =
14127 "#version 450\n"
14128 "\n"
14129 "layout(location=0) out vec4 color;\n"
14130 "void main(){\n"
14131 " color = vec4(1);\n"
14132 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014133
14134 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14135 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14136
14137 VkPipelineObj pipe(m_device);
14138 pipe.AddColorAttachment();
14139 pipe.AddShader(&vs);
14140 pipe.AddShader(&fs);
14141
14142 VkDescriptorSetObj descriptorSet(m_device);
14143 descriptorSet.AppendDummy();
14144 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14145
14146 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014147 {
14148 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14149 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14150 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014151 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014152 {
14153 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14154 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14155 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014156 },
14157 };
14158 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014159 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014160 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014161 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14162 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014163 VkRenderPass rp;
14164 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14165 ASSERT_VK_SUCCESS(err);
14166
14167 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14168
14169 m_errorMonitor->VerifyFound();
14170
14171 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14172}
14173
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014174TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014175 TEST_DESCRIPTION(
14176 "Test that an error is produced for a variable output from "
14177 "the TCS without the patch decoration, but consumed in the TES "
14178 "with the decoration.");
14179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14180 "is per-vertex in tessellation control shader stage "
14181 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014182
14183 ASSERT_NO_FATAL_FAILURE(InitState());
14184 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14185
Chris Forbesc1e852d2016-04-04 19:26:42 +120014186 if (!m_device->phy().features().tessellationShader) {
14187 printf("Device does not support tessellation shaders; skipped.\n");
14188 return;
14189 }
14190
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014191 char const *vsSource =
14192 "#version 450\n"
14193 "void main(){}\n";
14194 char const *tcsSource =
14195 "#version 450\n"
14196 "layout(location=0) out int x[];\n"
14197 "layout(vertices=3) out;\n"
14198 "void main(){\n"
14199 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14200 " gl_TessLevelInner[0] = 1;\n"
14201 " x[gl_InvocationID] = gl_InvocationID;\n"
14202 "}\n";
14203 char const *tesSource =
14204 "#version 450\n"
14205 "layout(triangles, equal_spacing, cw) in;\n"
14206 "layout(location=0) patch in int x;\n"
14207 "out gl_PerVertex { vec4 gl_Position; };\n"
14208 "void main(){\n"
14209 " gl_Position.xyz = gl_TessCoord;\n"
14210 " gl_Position.w = x;\n"
14211 "}\n";
14212 char const *fsSource =
14213 "#version 450\n"
14214 "layout(location=0) out vec4 color;\n"
14215 "void main(){\n"
14216 " color = vec4(1);\n"
14217 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014218
14219 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14220 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14221 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14222 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14223
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014224 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14225 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014226
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014227 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014228
14229 VkPipelineObj pipe(m_device);
14230 pipe.SetInputAssembly(&iasci);
14231 pipe.SetTessellation(&tsci);
14232 pipe.AddColorAttachment();
14233 pipe.AddShader(&vs);
14234 pipe.AddShader(&tcs);
14235 pipe.AddShader(&tes);
14236 pipe.AddShader(&fs);
14237
14238 VkDescriptorSetObj descriptorSet(m_device);
14239 descriptorSet.AppendDummy();
14240 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14241
14242 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14243
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014244 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014245}
14246
Karl Schultz6addd812016-02-02 17:17:23 -070014247TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014248 TEST_DESCRIPTION(
14249 "Test that an error is produced for a vertex attribute setup where multiple "
14250 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14252 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014253
Chris Forbes280ba2c2015-06-12 11:16:41 +120014254 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014255 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014256
14257 /* Two binding descriptions for binding 0 */
14258 VkVertexInputBindingDescription input_bindings[2];
14259 memset(input_bindings, 0, sizeof(input_bindings));
14260
14261 VkVertexInputAttributeDescription input_attrib;
14262 memset(&input_attrib, 0, sizeof(input_attrib));
14263 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14264
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014265 char const *vsSource =
14266 "#version 450\n"
14267 "\n"
14268 "layout(location=0) in float x;\n" /* attrib provided float */
14269 "out gl_PerVertex {\n"
14270 " vec4 gl_Position;\n"
14271 "};\n"
14272 "void main(){\n"
14273 " gl_Position = vec4(x);\n"
14274 "}\n";
14275 char const *fsSource =
14276 "#version 450\n"
14277 "\n"
14278 "layout(location=0) out vec4 color;\n"
14279 "void main(){\n"
14280 " color = vec4(1);\n"
14281 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120014282
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014283 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14284 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014285
14286 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014287 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014288 pipe.AddShader(&vs);
14289 pipe.AddShader(&fs);
14290
14291 pipe.AddVertexInputBindings(input_bindings, 2);
14292 pipe.AddVertexInputAttribs(&input_attrib, 1);
14293
Chris Forbes280ba2c2015-06-12 11:16:41 +120014294 VkDescriptorSetObj descriptorSet(m_device);
14295 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014296 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014297
Tony Barbour5781e8f2015-08-04 16:23:11 -060014298 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014299
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014300 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014301}
Chris Forbes8f68b562015-05-25 11:13:32 +120014302
Karl Schultz6addd812016-02-02 17:17:23 -070014303TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014304 TEST_DESCRIPTION(
14305 "Test that an error is produced for a fragment shader which does not "
14306 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014308
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014309 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014311 char const *vsSource =
14312 "#version 450\n"
14313 "\n"
14314 "out gl_PerVertex {\n"
14315 " vec4 gl_Position;\n"
14316 "};\n"
14317 "void main(){\n"
14318 " gl_Position = vec4(1);\n"
14319 "}\n";
14320 char const *fsSource =
14321 "#version 450\n"
14322 "\n"
14323 "void main(){\n"
14324 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014325
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014326 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14327 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014328
14329 VkPipelineObj pipe(m_device);
14330 pipe.AddShader(&vs);
14331 pipe.AddShader(&fs);
14332
Chia-I Wu08accc62015-07-07 11:50:03 +080014333 /* set up CB 0, not written */
14334 pipe.AddColorAttachment();
14335 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014336
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014337 VkDescriptorSetObj descriptorSet(m_device);
14338 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014339 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014340
Tony Barbour5781e8f2015-08-04 16:23:11 -060014341 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014342
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014343 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014344}
14345
Karl Schultz6addd812016-02-02 17:17:23 -070014346TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014347 TEST_DESCRIPTION(
14348 "Test that a warning is produced for a fragment shader which provides a spurious "
14349 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014350 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014351 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014352
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014353 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014354
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014355 char const *vsSource =
14356 "#version 450\n"
14357 "\n"
14358 "out gl_PerVertex {\n"
14359 " vec4 gl_Position;\n"
14360 "};\n"
14361 "void main(){\n"
14362 " gl_Position = vec4(1);\n"
14363 "}\n";
14364 char const *fsSource =
14365 "#version 450\n"
14366 "\n"
14367 "layout(location=0) out vec4 x;\n"
14368 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
14369 "void main(){\n"
14370 " x = vec4(1);\n"
14371 " y = vec4(1);\n"
14372 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014373
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014374 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14375 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014376
14377 VkPipelineObj pipe(m_device);
14378 pipe.AddShader(&vs);
14379 pipe.AddShader(&fs);
14380
Chia-I Wu08accc62015-07-07 11:50:03 +080014381 /* set up CB 0, not written */
14382 pipe.AddColorAttachment();
14383 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014384 /* FS writes CB 1, but we don't configure it */
14385
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014386 VkDescriptorSetObj descriptorSet(m_device);
14387 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014388 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014389
Tony Barbour5781e8f2015-08-04 16:23:11 -060014390 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014391
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014392 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014393}
14394
Karl Schultz6addd812016-02-02 17:17:23 -070014395TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014396 TEST_DESCRIPTION(
14397 "Test that an error is produced for a mismatch between the fundamental "
14398 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014400
Chris Forbesa36d69e2015-05-25 11:13:44 +120014401 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014402
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014403 char const *vsSource =
14404 "#version 450\n"
14405 "\n"
14406 "out gl_PerVertex {\n"
14407 " vec4 gl_Position;\n"
14408 "};\n"
14409 "void main(){\n"
14410 " gl_Position = vec4(1);\n"
14411 "}\n";
14412 char const *fsSource =
14413 "#version 450\n"
14414 "\n"
14415 "layout(location=0) out ivec4 x;\n" /* not UNORM */
14416 "void main(){\n"
14417 " x = ivec4(1);\n"
14418 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120014419
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014420 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14421 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014422
14423 VkPipelineObj pipe(m_device);
14424 pipe.AddShader(&vs);
14425 pipe.AddShader(&fs);
14426
Chia-I Wu08accc62015-07-07 11:50:03 +080014427 /* set up CB 0; type is UNORM by default */
14428 pipe.AddColorAttachment();
14429 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014430
Chris Forbesa36d69e2015-05-25 11:13:44 +120014431 VkDescriptorSetObj descriptorSet(m_device);
14432 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014433 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014434
Tony Barbour5781e8f2015-08-04 16:23:11 -060014435 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014436
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014437 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014438}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014439
Karl Schultz6addd812016-02-02 17:17:23 -070014440TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014441 TEST_DESCRIPTION(
14442 "Test that an error is produced for a shader consuming a uniform "
14443 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014445
Chris Forbes556c76c2015-08-14 12:04:59 +120014446 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120014447
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014448 char const *vsSource =
14449 "#version 450\n"
14450 "\n"
14451 "out gl_PerVertex {\n"
14452 " vec4 gl_Position;\n"
14453 "};\n"
14454 "void main(){\n"
14455 " gl_Position = vec4(1);\n"
14456 "}\n";
14457 char const *fsSource =
14458 "#version 450\n"
14459 "\n"
14460 "layout(location=0) out vec4 x;\n"
14461 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
14462 "void main(){\n"
14463 " x = vec4(bar.y);\n"
14464 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120014465
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014466 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14467 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120014468
Chris Forbes556c76c2015-08-14 12:04:59 +120014469 VkPipelineObj pipe(m_device);
14470 pipe.AddShader(&vs);
14471 pipe.AddShader(&fs);
14472
14473 /* set up CB 0; type is UNORM by default */
14474 pipe.AddColorAttachment();
14475 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14476
14477 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014478 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120014479
14480 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14481
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014482 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120014483}
14484
Chris Forbes5c59e902016-02-26 16:56:09 +130014485TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014486 TEST_DESCRIPTION(
14487 "Test that an error is produced for a shader consuming push constants "
14488 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130014490
14491 ASSERT_NO_FATAL_FAILURE(InitState());
14492
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014493 char const *vsSource =
14494 "#version 450\n"
14495 "\n"
14496 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14497 "out gl_PerVertex {\n"
14498 " vec4 gl_Position;\n"
14499 "};\n"
14500 "void main(){\n"
14501 " gl_Position = vec4(consts.x);\n"
14502 "}\n";
14503 char const *fsSource =
14504 "#version 450\n"
14505 "\n"
14506 "layout(location=0) out vec4 x;\n"
14507 "void main(){\n"
14508 " x = vec4(1);\n"
14509 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130014510
14511 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14512 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14513
14514 VkPipelineObj pipe(m_device);
14515 pipe.AddShader(&vs);
14516 pipe.AddShader(&fs);
14517
14518 /* set up CB 0; type is UNORM by default */
14519 pipe.AddColorAttachment();
14520 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14521
14522 VkDescriptorSetObj descriptorSet(m_device);
14523 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14524
14525 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14526
14527 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014528 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130014529}
14530
Chris Forbes3fb17902016-08-22 14:57:55 +120014531TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014532 TEST_DESCRIPTION(
14533 "Test that an error is produced for a shader consuming an input attachment "
14534 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120014535 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14536 "consumes input attachment index 0 but not provided in subpass");
14537
14538 ASSERT_NO_FATAL_FAILURE(InitState());
14539
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014540 char const *vsSource =
14541 "#version 450\n"
14542 "\n"
14543 "out gl_PerVertex {\n"
14544 " vec4 gl_Position;\n"
14545 "};\n"
14546 "void main(){\n"
14547 " gl_Position = vec4(1);\n"
14548 "}\n";
14549 char const *fsSource =
14550 "#version 450\n"
14551 "\n"
14552 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
14553 "layout(location=0) out vec4 color;\n"
14554 "void main() {\n"
14555 " color = subpassLoad(x);\n"
14556 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120014557
14558 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14559 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14560
14561 VkPipelineObj pipe(m_device);
14562 pipe.AddShader(&vs);
14563 pipe.AddShader(&fs);
14564 pipe.AddColorAttachment();
14565 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14566
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014567 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
14568 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120014569 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014570 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120014571 ASSERT_VK_SUCCESS(err);
14572
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014573 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120014574 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014575 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120014576 ASSERT_VK_SUCCESS(err);
14577
14578 // error here.
14579 pipe.CreateVKPipeline(pl, renderPass());
14580
14581 m_errorMonitor->VerifyFound();
14582
14583 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14584 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14585}
14586
Chris Forbes5a9a0472016-08-22 16:02:09 +120014587TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014588 TEST_DESCRIPTION(
14589 "Test that an error is produced for a shader consuming an input attachment "
14590 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120014591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14592 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
14593
14594 ASSERT_NO_FATAL_FAILURE(InitState());
14595
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014596 char const *vsSource =
14597 "#version 450\n"
14598 "\n"
14599 "out gl_PerVertex {\n"
14600 " vec4 gl_Position;\n"
14601 "};\n"
14602 "void main(){\n"
14603 " gl_Position = vec4(1);\n"
14604 "}\n";
14605 char const *fsSource =
14606 "#version 450\n"
14607 "\n"
14608 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
14609 "layout(location=0) out vec4 color;\n"
14610 "void main() {\n"
14611 " color = subpassLoad(x);\n"
14612 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120014613
14614 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14615 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14616
14617 VkPipelineObj pipe(m_device);
14618 pipe.AddShader(&vs);
14619 pipe.AddShader(&fs);
14620 pipe.AddColorAttachment();
14621 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14622
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014623 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
14624 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120014625 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014626 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120014627 ASSERT_VK_SUCCESS(err);
14628
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014629 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120014630 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014631 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120014632 ASSERT_VK_SUCCESS(err);
14633
14634 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014635 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
14636 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
14637 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
14638 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
14639 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 +120014640 };
14641 VkAttachmentReference color = {
14642 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
14643 };
14644 VkAttachmentReference input = {
14645 1, VK_IMAGE_LAYOUT_GENERAL,
14646 };
14647
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014648 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120014649
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014650 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120014651 VkRenderPass rp;
14652 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14653 ASSERT_VK_SUCCESS(err);
14654
14655 // error here.
14656 pipe.CreateVKPipeline(pl, rp);
14657
14658 m_errorMonitor->VerifyFound();
14659
14660 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14661 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14662 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14663}
14664
Chris Forbes541f7b02016-08-22 15:30:27 +120014665TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014666 TEST_DESCRIPTION(
14667 "Test that an error is produced for a shader consuming an input attachment "
14668 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120014669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070014670 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120014671
14672 ASSERT_NO_FATAL_FAILURE(InitState());
14673
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014674 char const *vsSource =
14675 "#version 450\n"
14676 "\n"
14677 "out gl_PerVertex {\n"
14678 " vec4 gl_Position;\n"
14679 "};\n"
14680 "void main(){\n"
14681 " gl_Position = vec4(1);\n"
14682 "}\n";
14683 char const *fsSource =
14684 "#version 450\n"
14685 "\n"
14686 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
14687 "layout(location=0) out vec4 color;\n"
14688 "void main() {\n"
14689 " color = subpassLoad(xs[0]);\n"
14690 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120014691
14692 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14693 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14694
14695 VkPipelineObj pipe(m_device);
14696 pipe.AddShader(&vs);
14697 pipe.AddShader(&fs);
14698 pipe.AddColorAttachment();
14699 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14700
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014701 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
14702 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120014703 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014704 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120014705 ASSERT_VK_SUCCESS(err);
14706
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014707 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120014708 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014709 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120014710 ASSERT_VK_SUCCESS(err);
14711
14712 // error here.
14713 pipe.CreateVKPipeline(pl, renderPass());
14714
14715 m_errorMonitor->VerifyFound();
14716
14717 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14718 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14719}
14720
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014721TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014722 TEST_DESCRIPTION(
14723 "Test that an error is produced for a compute pipeline consuming a "
14724 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014726
14727 ASSERT_NO_FATAL_FAILURE(InitState());
14728
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014729 char const *csSource =
14730 "#version 450\n"
14731 "\n"
14732 "layout(local_size_x=1) in;\n"
14733 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14734 "void main(){\n"
14735 " x = vec4(1);\n"
14736 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014737
14738 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14739
14740 VkDescriptorSetObj descriptorSet(m_device);
14741 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14742
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014743 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14744 nullptr,
14745 0,
14746 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
14747 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
14748 descriptorSet.GetPipelineLayout(),
14749 VK_NULL_HANDLE,
14750 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014751
14752 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014753 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014754
14755 m_errorMonitor->VerifyFound();
14756
14757 if (err == VK_SUCCESS) {
14758 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14759 }
14760}
14761
Chris Forbes22a9b092016-07-19 14:34:05 +120014762TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014763 TEST_DESCRIPTION(
14764 "Test that an error is produced for a pipeline consuming a "
14765 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14767 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120014768
14769 ASSERT_NO_FATAL_FAILURE(InitState());
14770
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014771 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
14772 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120014773 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014774 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120014775 ASSERT_VK_SUCCESS(err);
14776
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014777 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120014778 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014779 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120014780 ASSERT_VK_SUCCESS(err);
14781
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014782 char const *csSource =
14783 "#version 450\n"
14784 "\n"
14785 "layout(local_size_x=1) in;\n"
14786 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14787 "void main() {\n"
14788 " x.x = 1.0f;\n"
14789 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120014790 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14791
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014792 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14793 nullptr,
14794 0,
14795 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
14796 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
14797 pl,
14798 VK_NULL_HANDLE,
14799 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120014800
14801 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014802 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120014803
14804 m_errorMonitor->VerifyFound();
14805
14806 if (err == VK_SUCCESS) {
14807 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14808 }
14809
14810 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14811 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14812}
14813
Chris Forbes50020592016-07-27 13:52:41 +120014814TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014815 TEST_DESCRIPTION(
14816 "Test that an error is produced when an image view type "
14817 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120014818
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014819 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 +120014820
14821 ASSERT_NO_FATAL_FAILURE(InitState());
14822 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14823
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014824 char const *vsSource =
14825 "#version 450\n"
14826 "\n"
14827 "out gl_PerVertex { vec4 gl_Position; };\n"
14828 "void main() { gl_Position = vec4(0); }\n";
14829 char const *fsSource =
14830 "#version 450\n"
14831 "\n"
14832 "layout(set=0, binding=0) uniform sampler3D s;\n"
14833 "layout(location=0) out vec4 color;\n"
14834 "void main() {\n"
14835 " color = texture(s, vec3(0));\n"
14836 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120014837 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14838 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14839
14840 VkPipelineObj pipe(m_device);
14841 pipe.AddShader(&vs);
14842 pipe.AddShader(&fs);
14843 pipe.AddColorAttachment();
14844
14845 VkTextureObj texture(m_device, nullptr);
14846 VkSamplerObj sampler(m_device);
14847
14848 VkDescriptorSetObj descriptorSet(m_device);
14849 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14850 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14851
14852 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14853 ASSERT_VK_SUCCESS(err);
14854
Tony Barbour552f6c02016-12-21 14:34:07 -070014855 m_commandBuffer->BeginCommandBuffer();
14856 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120014857
14858 m_commandBuffer->BindPipeline(pipe);
14859 m_commandBuffer->BindDescriptorSet(descriptorSet);
14860
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014861 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120014862 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014863 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120014864 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14865
14866 // error produced here.
14867 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
14868
14869 m_errorMonitor->VerifyFound();
14870
Tony Barbour552f6c02016-12-21 14:34:07 -070014871 m_commandBuffer->EndRenderPass();
14872 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120014873}
14874
Chris Forbes5533bfc2016-07-27 14:12:34 +120014875TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014876 TEST_DESCRIPTION(
14877 "Test that an error is produced when a multisampled images "
14878 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120014879
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120014881
14882 ASSERT_NO_FATAL_FAILURE(InitState());
14883 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14884
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014885 char const *vsSource =
14886 "#version 450\n"
14887 "\n"
14888 "out gl_PerVertex { vec4 gl_Position; };\n"
14889 "void main() { gl_Position = vec4(0); }\n";
14890 char const *fsSource =
14891 "#version 450\n"
14892 "\n"
14893 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
14894 "layout(location=0) out vec4 color;\n"
14895 "void main() {\n"
14896 " color = texelFetch(s, ivec2(0), 0);\n"
14897 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120014898 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14899 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14900
14901 VkPipelineObj pipe(m_device);
14902 pipe.AddShader(&vs);
14903 pipe.AddShader(&fs);
14904 pipe.AddColorAttachment();
14905
14906 VkTextureObj texture(m_device, nullptr);
14907 VkSamplerObj sampler(m_device);
14908
14909 VkDescriptorSetObj descriptorSet(m_device);
14910 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14911 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14912
14913 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14914 ASSERT_VK_SUCCESS(err);
14915
Tony Barbour552f6c02016-12-21 14:34:07 -070014916 m_commandBuffer->BeginCommandBuffer();
14917 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120014918
14919 m_commandBuffer->BindPipeline(pipe);
14920 m_commandBuffer->BindDescriptorSet(descriptorSet);
14921
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014922 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120014923 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014924 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120014925 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14926
14927 // error produced here.
14928 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
14929
14930 m_errorMonitor->VerifyFound();
14931
Tony Barbour552f6c02016-12-21 14:34:07 -070014932 m_commandBuffer->EndRenderPass();
14933 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120014934}
14935
Mark Youngc48c4c12016-04-11 14:26:49 -060014936TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014938
14939 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014940
14941 // Create an image
14942 VkImage image;
14943
Karl Schultz6addd812016-02-02 17:17:23 -070014944 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14945 const int32_t tex_width = 32;
14946 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014947
14948 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014949 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14950 image_create_info.pNext = NULL;
14951 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14952 image_create_info.format = tex_format;
14953 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014954 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070014955 image_create_info.extent.depth = 1;
14956 image_create_info.mipLevels = 1;
14957 image_create_info.arrayLayers = 1;
14958 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14959 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14960 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14961 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014962
14963 // Introduce error by sending down a bogus width extent
14964 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014965 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014966
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014967 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014968}
14969
Mark Youngc48c4c12016-04-11 14:26:49 -060014970TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Mark Lobodzinski688ed322017-01-27 11:13:21 -070014971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00716);
Mark Youngc48c4c12016-04-11 14:26:49 -060014972
14973 ASSERT_NO_FATAL_FAILURE(InitState());
14974
14975 // Create an image
14976 VkImage image;
14977
14978 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14979 const int32_t tex_width = 32;
14980 const int32_t tex_height = 32;
14981
14982 VkImageCreateInfo image_create_info = {};
14983 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14984 image_create_info.pNext = NULL;
14985 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14986 image_create_info.format = tex_format;
14987 image_create_info.extent.width = tex_width;
14988 image_create_info.extent.height = tex_height;
14989 image_create_info.extent.depth = 1;
14990 image_create_info.mipLevels = 1;
14991 image_create_info.arrayLayers = 1;
14992 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14993 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14994 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14995 image_create_info.flags = 0;
14996
14997 // Introduce error by sending down a bogus width extent
14998 image_create_info.extent.width = 0;
14999 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15000
15001 m_errorMonitor->VerifyFound();
15002}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015003
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015004TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015005 TEST_DESCRIPTION(
15006 "Create a render pass with an attachment description "
15007 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015008
15009 ASSERT_NO_FATAL_FAILURE(InitState());
15010 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15011
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015013
15014 VkAttachmentReference color_attach = {};
15015 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15016 color_attach.attachment = 0;
15017 VkSubpassDescription subpass = {};
15018 subpass.colorAttachmentCount = 1;
15019 subpass.pColorAttachments = &color_attach;
15020
15021 VkRenderPassCreateInfo rpci = {};
15022 rpci.subpassCount = 1;
15023 rpci.pSubpasses = &subpass;
15024 rpci.attachmentCount = 1;
15025 VkAttachmentDescription attach_desc = {};
15026 attach_desc.format = VK_FORMAT_UNDEFINED;
15027 rpci.pAttachments = &attach_desc;
15028 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15029 VkRenderPass rp;
15030 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15031
15032 m_errorMonitor->VerifyFound();
15033
15034 if (result == VK_SUCCESS) {
15035 vkDestroyRenderPass(m_device->device(), rp, NULL);
15036 }
15037}
15038
Karl Schultz6addd812016-02-02 17:17:23 -070015039TEST_F(VkLayerTest, InvalidImageView) {
15040 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060015041
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015042 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015043
Tobin Ehliscde08892015-09-22 10:11:37 -060015044 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060015045
Mike Stroyana3082432015-09-25 13:39:21 -060015046 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015047 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060015048
Karl Schultz6addd812016-02-02 17:17:23 -070015049 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15050 const int32_t tex_width = 32;
15051 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015052
15053 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015054 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15055 image_create_info.pNext = NULL;
15056 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15057 image_create_info.format = tex_format;
15058 image_create_info.extent.width = tex_width;
15059 image_create_info.extent.height = tex_height;
15060 image_create_info.extent.depth = 1;
15061 image_create_info.mipLevels = 1;
15062 image_create_info.arrayLayers = 1;
15063 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15064 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15065 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15066 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015067
Chia-I Wuf7458c52015-10-26 21:10:41 +080015068 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015069 ASSERT_VK_SUCCESS(err);
15070
15071 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015072 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015073 image_view_create_info.image = image;
15074 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15075 image_view_create_info.format = tex_format;
15076 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015077 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015078 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015079 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015080
15081 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015082 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060015083
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015084 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060015085 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015086}
Mike Stroyana3082432015-09-25 13:39:21 -060015087
Mark Youngd339ba32016-05-30 13:28:35 -060015088TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15089 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015091 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015092
15093 ASSERT_NO_FATAL_FAILURE(InitState());
15094
15095 // Create an image and try to create a view with no memory backing the image
15096 VkImage image;
15097
15098 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15099 const int32_t tex_width = 32;
15100 const int32_t tex_height = 32;
15101
15102 VkImageCreateInfo image_create_info = {};
15103 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15104 image_create_info.pNext = NULL;
15105 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15106 image_create_info.format = tex_format;
15107 image_create_info.extent.width = tex_width;
15108 image_create_info.extent.height = tex_height;
15109 image_create_info.extent.depth = 1;
15110 image_create_info.mipLevels = 1;
15111 image_create_info.arrayLayers = 1;
15112 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15113 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15114 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15115 image_create_info.flags = 0;
15116
15117 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15118 ASSERT_VK_SUCCESS(err);
15119
15120 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015121 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015122 image_view_create_info.image = image;
15123 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15124 image_view_create_info.format = tex_format;
15125 image_view_create_info.subresourceRange.layerCount = 1;
15126 image_view_create_info.subresourceRange.baseMipLevel = 0;
15127 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015128 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015129
15130 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015131 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015132
15133 m_errorMonitor->VerifyFound();
15134 vkDestroyImage(m_device->device(), image, NULL);
15135 // If last error is success, it still created the view, so delete it.
15136 if (err == VK_SUCCESS) {
15137 vkDestroyImageView(m_device->device(), view, NULL);
15138 }
Mark Youngd339ba32016-05-30 13:28:35 -060015139}
15140
Karl Schultz6addd812016-02-02 17:17:23 -070015141TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015142 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015144
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015145 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015146
Karl Schultz6addd812016-02-02 17:17:23 -070015147 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015148 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015149 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015150 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015151
15152 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015153 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015154 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015155 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15156 image_view_create_info.format = tex_format;
15157 image_view_create_info.subresourceRange.baseMipLevel = 0;
15158 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015159 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015160 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015161 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015162
15163 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015164 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015165
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015166 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015167}
15168
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015169TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015170 VkResult err;
15171 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015172
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015173 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015174
Mike Stroyana3082432015-09-25 13:39:21 -060015175 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015176
15177 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015178 VkImage srcImage;
15179 VkImage dstImage;
15180 VkDeviceMemory srcMem;
15181 VkDeviceMemory destMem;
15182 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015183
15184 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015185 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15186 image_create_info.pNext = NULL;
15187 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15188 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15189 image_create_info.extent.width = 32;
15190 image_create_info.extent.height = 32;
15191 image_create_info.extent.depth = 1;
15192 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015193 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015194 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15195 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15196 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15197 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015198
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015199 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015200 ASSERT_VK_SUCCESS(err);
15201
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015202 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015203 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015204 ASSERT_VK_SUCCESS(err);
15205
15206 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015207 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015208 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15209 memAlloc.pNext = NULL;
15210 memAlloc.allocationSize = 0;
15211 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015212
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015213 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015214 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015215 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015216 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015217 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015218 ASSERT_VK_SUCCESS(err);
15219
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015220 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015221 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015222 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015223 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015224 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015225 ASSERT_VK_SUCCESS(err);
15226
15227 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15228 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015229 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015230 ASSERT_VK_SUCCESS(err);
15231
Tony Barbour552f6c02016-12-21 14:34:07 -070015232 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015233 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015234 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015235 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015236 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015237 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015238 copyRegion.srcOffset.x = 0;
15239 copyRegion.srcOffset.y = 0;
15240 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015241 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015242 copyRegion.dstSubresource.mipLevel = 0;
15243 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015244 // Introduce failure by forcing the dst layerCount to differ from src
15245 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015246 copyRegion.dstOffset.x = 0;
15247 copyRegion.dstOffset.y = 0;
15248 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015249 copyRegion.extent.width = 1;
15250 copyRegion.extent.height = 1;
15251 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015252 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015253 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015254
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015255 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015256
Chia-I Wuf7458c52015-10-26 21:10:41 +080015257 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015258 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015259 vkFreeMemory(m_device->device(), srcMem, NULL);
15260 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015261}
15262
Tony Barbourd6673642016-05-05 14:46:39 -060015263TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060015264 TEST_DESCRIPTION("Creating images with unsuported formats ");
15265
15266 ASSERT_NO_FATAL_FAILURE(InitState());
15267 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15268 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015269 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 -060015270 VK_IMAGE_TILING_OPTIMAL, 0);
15271 ASSERT_TRUE(image.initialized());
15272
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015273 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130015274 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015275 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015276 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15277 image_create_info.format = VK_FORMAT_UNDEFINED;
15278 image_create_info.extent.width = 32;
15279 image_create_info.extent.height = 32;
15280 image_create_info.extent.depth = 1;
15281 image_create_info.mipLevels = 1;
15282 image_create_info.arrayLayers = 1;
15283 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15284 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15285 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015286
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15288 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015289
15290 VkImage localImage;
15291 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
15292 m_errorMonitor->VerifyFound();
15293
Tony Barbourd6673642016-05-05 14:46:39 -060015294 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015295 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060015296 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15297 VkFormat format = static_cast<VkFormat>(f);
15298 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015299 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060015300 unsupported = format;
15301 break;
15302 }
15303 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015304
Tony Barbourd6673642016-05-05 14:46:39 -060015305 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015306 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015308
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015309 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060015310 m_errorMonitor->VerifyFound();
15311 }
15312}
15313
15314TEST_F(VkLayerTest, ImageLayerViewTests) {
15315 VkResult ret;
15316 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15317
15318 ASSERT_NO_FATAL_FAILURE(InitState());
15319
15320 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015321 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 -060015322 VK_IMAGE_TILING_OPTIMAL, 0);
15323 ASSERT_TRUE(image.initialized());
15324
15325 VkImageView imgView;
15326 VkImageViewCreateInfo imgViewInfo = {};
15327 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15328 imgViewInfo.image = image.handle();
15329 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15330 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15331 imgViewInfo.subresourceRange.layerCount = 1;
15332 imgViewInfo.subresourceRange.baseMipLevel = 0;
15333 imgViewInfo.subresourceRange.levelCount = 1;
15334 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15335
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015337 // View can't have baseMipLevel >= image's mipLevels - Expect
15338 // VIEW_CREATE_ERROR
15339 imgViewInfo.subresourceRange.baseMipLevel = 1;
15340 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15341 m_errorMonitor->VerifyFound();
15342 imgViewInfo.subresourceRange.baseMipLevel = 0;
15343
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060015345 // View can't have baseArrayLayer >= image's arraySize - Expect
15346 // VIEW_CREATE_ERROR
15347 imgViewInfo.subresourceRange.baseArrayLayer = 1;
15348 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15349 m_errorMonitor->VerifyFound();
15350 imgViewInfo.subresourceRange.baseArrayLayer = 0;
15351
Mike Weiblenc16b2aa2017-01-25 13:02:44 -070015352 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015353 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
15354 imgViewInfo.subresourceRange.levelCount = 0;
15355 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15356 m_errorMonitor->VerifyFound();
15357 imgViewInfo.subresourceRange.levelCount = 1;
15358
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015359 m_errorMonitor->SetDesiredFailureMsg(
15360 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15361 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060015362 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
15363 imgViewInfo.subresourceRange.layerCount = 0;
15364 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15365 m_errorMonitor->VerifyFound();
15366 imgViewInfo.subresourceRange.layerCount = 1;
15367
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015368 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15369 "Formats MUST be IDENTICAL unless "
15370 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
15371 "was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060015372 // Can't use depth format for view into color image - Expect INVALID_FORMAT
15373 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
15374 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15375 m_errorMonitor->VerifyFound();
15376 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15377
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015378 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060015379 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
15380 // VIEW_CREATE_ERROR
15381 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
15382 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15383 m_errorMonitor->VerifyFound();
15384 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15385
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015387 // TODO: Update framework to easily passing mutable flag into ImageObj init
15388 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070015389 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
15390 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15391 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060015392 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
15393 // VIEW_CREATE_ERROR
15394 VkImageCreateInfo mutImgInfo = image.create_info();
15395 VkImage mutImage;
15396 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015397 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060015398 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
15399 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15400 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
15401 ASSERT_VK_SUCCESS(ret);
15402 imgViewInfo.image = mutImage;
15403 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15404 m_errorMonitor->VerifyFound();
15405 imgViewInfo.image = image.handle();
15406 vkDestroyImage(m_device->handle(), mutImage, NULL);
15407}
15408
15409TEST_F(VkLayerTest, MiscImageLayerTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060015410 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
15411
15412 ASSERT_NO_FATAL_FAILURE(InitState());
15413
Rene Lindsay135204f2016-12-22 17:11:09 -070015414 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060015415 VkImageObj image(m_device);
Rene Lindsay135204f2016-12-22 17:11:09 -070015416 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 -070015417 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060015418 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060015419 vk_testing::Buffer buffer;
15420 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070015421 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060015422 VkBufferImageCopy region = {};
15423 region.bufferRowLength = 128;
15424 region.bufferImageHeight = 128;
15425 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15426 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070015427 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060015428 region.imageExtent.height = 4;
15429 region.imageExtent.width = 4;
15430 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070015431
15432 VkImageObj image2(m_device);
15433 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 -070015434 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070015435 ASSERT_TRUE(image2.initialized());
15436 vk_testing::Buffer buffer2;
15437 VkMemoryPropertyFlags reqs2 = 0;
15438 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
15439 VkBufferImageCopy region2 = {};
15440 region2.bufferRowLength = 128;
15441 region2.bufferImageHeight = 128;
15442 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15443 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
15444 region2.imageSubresource.layerCount = 1;
15445 region2.imageExtent.height = 4;
15446 region2.imageExtent.width = 4;
15447 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060015448 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060015449
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070015450 // Image must have offset.z of 0 and extent.depth of 1
15451 // Introduce failure by setting imageExtent.depth to 0
15452 region.imageExtent.depth = 0;
15453 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01269);
15454 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015455 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070015456 m_errorMonitor->VerifyFound();
15457
15458 region.imageExtent.depth = 1;
15459
15460 // Image must have offset.z of 0 and extent.depth of 1
15461 // Introduce failure by setting imageOffset.z to 4
15462 region.imageOffset.z = 4;
15463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01269);
15464 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015465 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070015466 m_errorMonitor->VerifyFound();
15467
15468 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015469 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
15470 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070015471 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070015472 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015473 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
15474 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015475 m_errorMonitor->VerifyFound();
15476
15477 // BufferOffset must be a multiple of 4
15478 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070015479 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070015480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070015481 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
15482 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015483 m_errorMonitor->VerifyFound();
15484
15485 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
15486 region.bufferOffset = 0;
15487 region.imageExtent.height = 128;
15488 region.imageExtent.width = 128;
15489 // Introduce failure by setting bufferRowLength > 0 but less than width
15490 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070015491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015492 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
15493 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015494 m_errorMonitor->VerifyFound();
15495
15496 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
15497 region.bufferRowLength = 128;
15498 // Introduce failure by setting bufferRowHeight > 0 but less than height
15499 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070015500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015501 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
15502 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015503 m_errorMonitor->VerifyFound();
15504
15505 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060015506 VkImageObj intImage1(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070015507 intImage1.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
15508 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060015509 VkImageObj intImage2(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070015510 intImage2.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15511 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060015512 VkImageBlit blitRegion = {};
15513 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15514 blitRegion.srcSubresource.baseArrayLayer = 0;
15515 blitRegion.srcSubresource.layerCount = 1;
15516 blitRegion.srcSubresource.mipLevel = 0;
15517 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15518 blitRegion.dstSubresource.baseArrayLayer = 0;
15519 blitRegion.dstSubresource.layerCount = 1;
15520 blitRegion.dstSubresource.mipLevel = 0;
15521
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060015522 // Look for NULL-blit warning
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "Offsets specify a zero-volume area.");
15524 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
15525 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060015526 m_errorMonitor->VerifyFound();
15527
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070015528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060015529 VkImageMemoryBarrier img_barrier;
15530 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
15531 img_barrier.pNext = NULL;
15532 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
15533 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
15534 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15535 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15536 img_barrier.image = image.handle();
15537 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15538 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15539 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15540 img_barrier.subresourceRange.baseArrayLayer = 0;
15541 img_barrier.subresourceRange.baseMipLevel = 0;
15542 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
15543 img_barrier.subresourceRange.layerCount = 0;
15544 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015545 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
15546 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060015547 m_errorMonitor->VerifyFound();
15548 img_barrier.subresourceRange.layerCount = 1;
15549}
15550
15551TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060015552 TEST_DESCRIPTION("Exceed the limits of image format ");
15553
Cody Northropc31a84f2016-08-22 10:41:47 -060015554 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015555 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060015556 VkImageCreateInfo image_create_info = {};
15557 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15558 image_create_info.pNext = NULL;
15559 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15560 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15561 image_create_info.extent.width = 32;
15562 image_create_info.extent.height = 32;
15563 image_create_info.extent.depth = 1;
15564 image_create_info.mipLevels = 1;
15565 image_create_info.arrayLayers = 1;
15566 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15567 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15568 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15569 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15570 image_create_info.flags = 0;
15571
15572 VkImage nullImg;
15573 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015574 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
15575 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070015576 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060015577 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15578 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15579 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070015580 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060015581
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015582 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060015583 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
15584 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15585 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15586 m_errorMonitor->VerifyFound();
15587 image_create_info.mipLevels = 1;
15588
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015589 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060015590 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
15591 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15592 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15593 m_errorMonitor->VerifyFound();
15594 image_create_info.arrayLayers = 1;
15595
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060015597 int samples = imgFmtProps.sampleCounts >> 1;
15598 image_create_info.samples = (VkSampleCountFlagBits)samples;
15599 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15600 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15601 m_errorMonitor->VerifyFound();
15602 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15603
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015604 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15605 "pCreateInfo->initialLayout, must be "
15606 "VK_IMAGE_LAYOUT_UNDEFINED or "
15607 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060015608 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15609 // Expect INVALID_LAYOUT
15610 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15611 m_errorMonitor->VerifyFound();
15612 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15613}
15614
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015615TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015616 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060015617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015618
15619 ASSERT_NO_FATAL_FAILURE(InitState());
15620
15621 VkImageObj src_image(m_device);
15622 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
15623 VkImageObj dst_image(m_device);
15624 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
15625
Tony Barbour552f6c02016-12-21 14:34:07 -070015626 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015627 VkImageCopy copy_region;
15628 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15629 copy_region.srcSubresource.mipLevel = 0;
15630 copy_region.srcSubresource.baseArrayLayer = 0;
15631 copy_region.srcSubresource.layerCount = 0;
15632 copy_region.srcOffset.x = 0;
15633 copy_region.srcOffset.y = 0;
15634 copy_region.srcOffset.z = 0;
15635 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15636 copy_region.dstSubresource.mipLevel = 0;
15637 copy_region.dstSubresource.baseArrayLayer = 0;
15638 copy_region.dstSubresource.layerCount = 0;
15639 copy_region.dstOffset.x = 0;
15640 copy_region.dstOffset.y = 0;
15641 copy_region.dstOffset.z = 0;
15642 copy_region.extent.width = 64;
15643 copy_region.extent.height = 64;
15644 copy_region.extent.depth = 1;
15645 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
15646 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070015647 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015648
15649 m_errorMonitor->VerifyFound();
15650}
15651
15652TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015653 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060015654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015655
15656 ASSERT_NO_FATAL_FAILURE(InitState());
15657
15658 VkImageObj src_image(m_device);
15659 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
15660 VkImageObj dst_image(m_device);
15661 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
15662
Tony Barbour552f6c02016-12-21 14:34:07 -070015663 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015664 VkImageCopy copy_region;
15665 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15666 copy_region.srcSubresource.mipLevel = 0;
15667 copy_region.srcSubresource.baseArrayLayer = 0;
15668 copy_region.srcSubresource.layerCount = 0;
15669 copy_region.srcOffset.x = 0;
15670 copy_region.srcOffset.y = 0;
15671 copy_region.srcOffset.z = 0;
15672 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15673 copy_region.dstSubresource.mipLevel = 0;
15674 copy_region.dstSubresource.baseArrayLayer = 0;
15675 copy_region.dstSubresource.layerCount = 0;
15676 copy_region.dstOffset.x = 0;
15677 copy_region.dstOffset.y = 0;
15678 copy_region.dstOffset.z = 0;
15679 copy_region.extent.width = 64;
15680 copy_region.extent.height = 64;
15681 copy_region.extent.depth = 1;
15682 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
15683 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070015684 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015685
15686 m_errorMonitor->VerifyFound();
15687}
15688
Karl Schultz6addd812016-02-02 17:17:23 -070015689TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060015690 VkResult err;
15691 bool pass;
15692
15693 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060015695
15696 ASSERT_NO_FATAL_FAILURE(InitState());
15697
15698 // Create two images of different types and try to copy between them
15699 VkImage srcImage;
15700 VkImage dstImage;
15701 VkDeviceMemory srcMem;
15702 VkDeviceMemory destMem;
15703 VkMemoryRequirements memReqs;
15704
15705 VkImageCreateInfo image_create_info = {};
15706 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15707 image_create_info.pNext = NULL;
15708 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15709 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15710 image_create_info.extent.width = 32;
15711 image_create_info.extent.height = 32;
15712 image_create_info.extent.depth = 1;
15713 image_create_info.mipLevels = 1;
15714 image_create_info.arrayLayers = 1;
15715 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15716 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15717 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15718 image_create_info.flags = 0;
15719
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015720 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060015721 ASSERT_VK_SUCCESS(err);
15722
15723 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15724 // Introduce failure by creating second image with a different-sized format.
15725 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
15726
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015727 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060015728 ASSERT_VK_SUCCESS(err);
15729
15730 // Allocate memory
15731 VkMemoryAllocateInfo memAlloc = {};
15732 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15733 memAlloc.pNext = NULL;
15734 memAlloc.allocationSize = 0;
15735 memAlloc.memoryTypeIndex = 0;
15736
15737 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
15738 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015739 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060015740 ASSERT_TRUE(pass);
15741 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
15742 ASSERT_VK_SUCCESS(err);
15743
15744 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
15745 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015746 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060015747 ASSERT_TRUE(pass);
15748 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
15749 ASSERT_VK_SUCCESS(err);
15750
15751 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15752 ASSERT_VK_SUCCESS(err);
15753 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
15754 ASSERT_VK_SUCCESS(err);
15755
Tony Barbour552f6c02016-12-21 14:34:07 -070015756 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060015757 VkImageCopy copyRegion;
15758 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15759 copyRegion.srcSubresource.mipLevel = 0;
15760 copyRegion.srcSubresource.baseArrayLayer = 0;
15761 copyRegion.srcSubresource.layerCount = 0;
15762 copyRegion.srcOffset.x = 0;
15763 copyRegion.srcOffset.y = 0;
15764 copyRegion.srcOffset.z = 0;
15765 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15766 copyRegion.dstSubresource.mipLevel = 0;
15767 copyRegion.dstSubresource.baseArrayLayer = 0;
15768 copyRegion.dstSubresource.layerCount = 0;
15769 copyRegion.dstOffset.x = 0;
15770 copyRegion.dstOffset.y = 0;
15771 copyRegion.dstOffset.z = 0;
15772 copyRegion.extent.width = 1;
15773 copyRegion.extent.height = 1;
15774 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015775 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015776 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060015777
15778 m_errorMonitor->VerifyFound();
15779
15780 vkDestroyImage(m_device->device(), srcImage, NULL);
15781 vkDestroyImage(m_device->device(), dstImage, NULL);
15782 vkFreeMemory(m_device->device(), srcMem, NULL);
15783 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015784}
15785
Karl Schultz6addd812016-02-02 17:17:23 -070015786TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
15787 VkResult err;
15788 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015789
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015790 // Create a color image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015791 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15792 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015793
Mike Stroyana3082432015-09-25 13:39:21 -060015794 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015795
15796 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015797 VkImage srcImage;
15798 VkImage dstImage;
15799 VkDeviceMemory srcMem;
15800 VkDeviceMemory destMem;
15801 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015802
15803 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015804 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15805 image_create_info.pNext = NULL;
15806 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15807 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15808 image_create_info.extent.width = 32;
15809 image_create_info.extent.height = 32;
15810 image_create_info.extent.depth = 1;
15811 image_create_info.mipLevels = 1;
15812 image_create_info.arrayLayers = 1;
15813 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15814 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15815 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15816 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015817
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015818 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015819 ASSERT_VK_SUCCESS(err);
15820
Karl Schultzbdb75952016-04-19 11:36:49 -060015821 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15822
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015823 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070015824 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015825 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015826 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015827
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015828 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015829 ASSERT_VK_SUCCESS(err);
15830
15831 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015832 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015833 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15834 memAlloc.pNext = NULL;
15835 memAlloc.allocationSize = 0;
15836 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015837
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015838 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015839 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015840 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015841 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015842 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015843 ASSERT_VK_SUCCESS(err);
15844
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015845 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015846 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015847 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015848 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015849 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015850 ASSERT_VK_SUCCESS(err);
15851
15852 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15853 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015854 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015855 ASSERT_VK_SUCCESS(err);
15856
Tony Barbour552f6c02016-12-21 14:34:07 -070015857 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015858 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015859 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015860 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015861 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015862 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015863 copyRegion.srcOffset.x = 0;
15864 copyRegion.srcOffset.y = 0;
15865 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015866 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015867 copyRegion.dstSubresource.mipLevel = 0;
15868 copyRegion.dstSubresource.baseArrayLayer = 0;
15869 copyRegion.dstSubresource.layerCount = 0;
15870 copyRegion.dstOffset.x = 0;
15871 copyRegion.dstOffset.y = 0;
15872 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015873 copyRegion.extent.width = 1;
15874 copyRegion.extent.height = 1;
15875 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015876 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015877 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015878
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015879 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015880
Chia-I Wuf7458c52015-10-26 21:10:41 +080015881 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015882 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015883 vkFreeMemory(m_device->device(), srcMem, NULL);
15884 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015885}
15886
Karl Schultz6addd812016-02-02 17:17:23 -070015887TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
15888 VkResult err;
15889 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015890
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15892 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015893
Mike Stroyana3082432015-09-25 13:39:21 -060015894 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015895
15896 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015897 VkImage srcImage;
15898 VkImage dstImage;
15899 VkDeviceMemory srcMem;
15900 VkDeviceMemory destMem;
15901 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015902
15903 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015904 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15905 image_create_info.pNext = NULL;
15906 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15907 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15908 image_create_info.extent.width = 32;
15909 image_create_info.extent.height = 1;
15910 image_create_info.extent.depth = 1;
15911 image_create_info.mipLevels = 1;
15912 image_create_info.arrayLayers = 1;
15913 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15914 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15915 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15916 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015917
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015918 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015919 ASSERT_VK_SUCCESS(err);
15920
Karl Schultz6addd812016-02-02 17:17:23 -070015921 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015922
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015923 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015924 ASSERT_VK_SUCCESS(err);
15925
15926 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015927 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015928 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15929 memAlloc.pNext = NULL;
15930 memAlloc.allocationSize = 0;
15931 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015932
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015933 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015934 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015935 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015936 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015937 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015938 ASSERT_VK_SUCCESS(err);
15939
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015940 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015941 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015942 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015943 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015944 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015945 ASSERT_VK_SUCCESS(err);
15946
15947 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15948 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015949 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015950 ASSERT_VK_SUCCESS(err);
15951
Tony Barbour552f6c02016-12-21 14:34:07 -070015952 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015953 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015954 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15955 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015956 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015957 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015958 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015959 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015960 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015961 resolveRegion.srcOffset.x = 0;
15962 resolveRegion.srcOffset.y = 0;
15963 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015964 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015965 resolveRegion.dstSubresource.mipLevel = 0;
15966 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015967 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015968 resolveRegion.dstOffset.x = 0;
15969 resolveRegion.dstOffset.y = 0;
15970 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015971 resolveRegion.extent.width = 1;
15972 resolveRegion.extent.height = 1;
15973 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015974 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015975 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015976
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015977 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015978
Chia-I Wuf7458c52015-10-26 21:10:41 +080015979 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015980 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015981 vkFreeMemory(m_device->device(), srcMem, NULL);
15982 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015983}
15984
Karl Schultz6addd812016-02-02 17:17:23 -070015985TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
15986 VkResult err;
15987 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015988
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15990 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015991
Mike Stroyana3082432015-09-25 13:39:21 -060015992 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015993
Chris Forbesa7530692016-05-08 12:35:39 +120015994 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015995 VkImage srcImage;
15996 VkImage dstImage;
15997 VkDeviceMemory srcMem;
15998 VkDeviceMemory destMem;
15999 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016000
16001 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016002 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16003 image_create_info.pNext = NULL;
16004 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16005 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16006 image_create_info.extent.width = 32;
16007 image_create_info.extent.height = 1;
16008 image_create_info.extent.depth = 1;
16009 image_create_info.mipLevels = 1;
16010 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120016011 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016012 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16013 // Note: Some implementations expect color attachment usage for any
16014 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016015 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016016 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016017
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016018 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016019 ASSERT_VK_SUCCESS(err);
16020
Karl Schultz6addd812016-02-02 17:17:23 -070016021 // Note: Some implementations expect color attachment usage for any
16022 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016023 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016024
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016025 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016026 ASSERT_VK_SUCCESS(err);
16027
16028 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016029 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016030 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16031 memAlloc.pNext = NULL;
16032 memAlloc.allocationSize = 0;
16033 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016034
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016035 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016036 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016037 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016038 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016039 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016040 ASSERT_VK_SUCCESS(err);
16041
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016042 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016043 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016044 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016045 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016046 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016047 ASSERT_VK_SUCCESS(err);
16048
16049 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16050 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016051 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016052 ASSERT_VK_SUCCESS(err);
16053
Tony Barbour552f6c02016-12-21 14:34:07 -070016054 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016055 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016056 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16057 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016058 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016059 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016060 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016061 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016062 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016063 resolveRegion.srcOffset.x = 0;
16064 resolveRegion.srcOffset.y = 0;
16065 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016066 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016067 resolveRegion.dstSubresource.mipLevel = 0;
16068 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016069 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016070 resolveRegion.dstOffset.x = 0;
16071 resolveRegion.dstOffset.y = 0;
16072 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016073 resolveRegion.extent.width = 1;
16074 resolveRegion.extent.height = 1;
16075 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016076 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016077 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016078
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016079 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016080
Chia-I Wuf7458c52015-10-26 21:10:41 +080016081 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016082 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016083 vkFreeMemory(m_device->device(), srcMem, NULL);
16084 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016085}
16086
Karl Schultz6addd812016-02-02 17:17:23 -070016087TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
16088 VkResult err;
16089 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016090
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070016091 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016092 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016093
Mike Stroyana3082432015-09-25 13:39:21 -060016094 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016095
16096 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016097 VkImage srcImage;
16098 VkImage dstImage;
16099 VkDeviceMemory srcMem;
16100 VkDeviceMemory destMem;
16101 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016102
16103 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016104 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16105 image_create_info.pNext = NULL;
16106 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16107 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16108 image_create_info.extent.width = 32;
16109 image_create_info.extent.height = 1;
16110 image_create_info.extent.depth = 1;
16111 image_create_info.mipLevels = 1;
16112 image_create_info.arrayLayers = 1;
16113 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
16114 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16115 // Note: Some implementations expect color attachment usage for any
16116 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016117 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016118 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016119
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016120 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016121 ASSERT_VK_SUCCESS(err);
16122
Karl Schultz6addd812016-02-02 17:17:23 -070016123 // Set format to something other than source image
16124 image_create_info.format = VK_FORMAT_R32_SFLOAT;
16125 // Note: Some implementations expect color attachment usage for any
16126 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016127 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016128 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016129
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016130 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016131 ASSERT_VK_SUCCESS(err);
16132
16133 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016134 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016135 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16136 memAlloc.pNext = NULL;
16137 memAlloc.allocationSize = 0;
16138 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016139
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016140 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016141 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016142 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016143 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016144 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016145 ASSERT_VK_SUCCESS(err);
16146
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016147 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016148 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016149 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016150 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016151 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016152 ASSERT_VK_SUCCESS(err);
16153
16154 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16155 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016156 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016157 ASSERT_VK_SUCCESS(err);
16158
Tony Barbour552f6c02016-12-21 14:34:07 -070016159 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016160 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016161 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16162 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016163 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016164 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016165 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016166 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016167 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016168 resolveRegion.srcOffset.x = 0;
16169 resolveRegion.srcOffset.y = 0;
16170 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016171 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016172 resolveRegion.dstSubresource.mipLevel = 0;
16173 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016174 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016175 resolveRegion.dstOffset.x = 0;
16176 resolveRegion.dstOffset.y = 0;
16177 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016178 resolveRegion.extent.width = 1;
16179 resolveRegion.extent.height = 1;
16180 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016181 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016182 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016183
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016184 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016185
Chia-I Wuf7458c52015-10-26 21:10:41 +080016186 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016187 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016188 vkFreeMemory(m_device->device(), srcMem, NULL);
16189 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016190}
16191
Karl Schultz6addd812016-02-02 17:17:23 -070016192TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
16193 VkResult err;
16194 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016195
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070016196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016197 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016198
Mike Stroyana3082432015-09-25 13:39:21 -060016199 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016200
16201 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016202 VkImage srcImage;
16203 VkImage dstImage;
16204 VkDeviceMemory srcMem;
16205 VkDeviceMemory destMem;
16206 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016207
16208 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016209 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16210 image_create_info.pNext = NULL;
16211 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16212 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16213 image_create_info.extent.width = 32;
16214 image_create_info.extent.height = 1;
16215 image_create_info.extent.depth = 1;
16216 image_create_info.mipLevels = 1;
16217 image_create_info.arrayLayers = 1;
16218 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
16219 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16220 // Note: Some implementations expect color attachment usage for any
16221 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016222 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016223 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016224
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016225 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016226 ASSERT_VK_SUCCESS(err);
16227
Karl Schultz6addd812016-02-02 17:17:23 -070016228 image_create_info.imageType = VK_IMAGE_TYPE_1D;
16229 // Note: Some implementations expect color attachment usage for any
16230 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016231 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016232 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016233
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016234 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016235 ASSERT_VK_SUCCESS(err);
16236
16237 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016238 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016239 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16240 memAlloc.pNext = NULL;
16241 memAlloc.allocationSize = 0;
16242 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016243
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016244 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016245 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016246 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016247 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016248 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016249 ASSERT_VK_SUCCESS(err);
16250
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016251 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016252 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016253 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016254 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016255 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016256 ASSERT_VK_SUCCESS(err);
16257
16258 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16259 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016260 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016261 ASSERT_VK_SUCCESS(err);
16262
Tony Barbour552f6c02016-12-21 14:34:07 -070016263 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016264 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016265 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16266 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016267 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016268 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016269 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016270 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016271 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016272 resolveRegion.srcOffset.x = 0;
16273 resolveRegion.srcOffset.y = 0;
16274 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016275 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016276 resolveRegion.dstSubresource.mipLevel = 0;
16277 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016278 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016279 resolveRegion.dstOffset.x = 0;
16280 resolveRegion.dstOffset.y = 0;
16281 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016282 resolveRegion.extent.width = 1;
16283 resolveRegion.extent.height = 1;
16284 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016285 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016286 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016287
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016288 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016289
Chia-I Wuf7458c52015-10-26 21:10:41 +080016290 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016291 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016292 vkFreeMemory(m_device->device(), srcMem, NULL);
16293 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016294}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016295
Karl Schultz6addd812016-02-02 17:17:23 -070016296TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016297 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070016298 // to using a DS format, then cause it to hit error due to COLOR_BIT not
16299 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016300 // The image format check comes 2nd in validation so we trigger it first,
16301 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070016302 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016303
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16305 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016306
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016307 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016308
Chia-I Wu1b99bb22015-10-27 19:25:11 +080016309 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016310 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16311 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016312
16313 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016314 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16315 ds_pool_ci.pNext = NULL;
16316 ds_pool_ci.maxSets = 1;
16317 ds_pool_ci.poolSizeCount = 1;
16318 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016319
16320 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016321 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016322 ASSERT_VK_SUCCESS(err);
16323
16324 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016325 dsl_binding.binding = 0;
16326 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16327 dsl_binding.descriptorCount = 1;
16328 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16329 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016330
16331 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016332 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16333 ds_layout_ci.pNext = NULL;
16334 ds_layout_ci.bindingCount = 1;
16335 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016336 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016337 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016338 ASSERT_VK_SUCCESS(err);
16339
16340 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016341 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080016342 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070016343 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016344 alloc_info.descriptorPool = ds_pool;
16345 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016346 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016347 ASSERT_VK_SUCCESS(err);
16348
Karl Schultz6addd812016-02-02 17:17:23 -070016349 VkImage image_bad;
16350 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016351 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060016352 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016353 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070016354 const int32_t tex_width = 32;
16355 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016356
16357 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016358 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16359 image_create_info.pNext = NULL;
16360 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16361 image_create_info.format = tex_format_bad;
16362 image_create_info.extent.width = tex_width;
16363 image_create_info.extent.height = tex_height;
16364 image_create_info.extent.depth = 1;
16365 image_create_info.mipLevels = 1;
16366 image_create_info.arrayLayers = 1;
16367 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16368 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016369 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016370 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016371
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016372 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016373 ASSERT_VK_SUCCESS(err);
16374 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016375 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16376 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016377 ASSERT_VK_SUCCESS(err);
16378
Rene Lindsayf1e89c82016-12-28 13:18:31 -070016379 // ---Bind image memory---
16380 VkMemoryRequirements img_mem_reqs;
16381 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
16382 VkMemoryAllocateInfo image_alloc_info = {};
16383 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16384 image_alloc_info.pNext = NULL;
16385 image_alloc_info.memoryTypeIndex = 0;
16386 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016387 bool pass =
16388 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 -070016389 ASSERT_TRUE(pass);
16390 VkDeviceMemory mem;
16391 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
16392 ASSERT_VK_SUCCESS(err);
16393 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
16394 ASSERT_VK_SUCCESS(err);
16395 // -----------------------
16396
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016397 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130016398 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070016399 image_view_create_info.image = image_bad;
16400 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16401 image_view_create_info.format = tex_format_bad;
16402 image_view_create_info.subresourceRange.baseArrayLayer = 0;
16403 image_view_create_info.subresourceRange.baseMipLevel = 0;
16404 image_view_create_info.subresourceRange.layerCount = 1;
16405 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070016406 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016407
16408 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016409 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016410
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016411 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016412
Chia-I Wuf7458c52015-10-26 21:10:41 +080016413 vkDestroyImage(m_device->device(), image_bad, NULL);
16414 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016415 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16416 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070016417
16418 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016419}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016420
16421TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016422 TEST_DESCRIPTION(
16423 "Call ClearColorImage w/ a depth|stencil image and "
16424 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016425
16426 ASSERT_NO_FATAL_FAILURE(InitState());
16427 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16428
Tony Barbour552f6c02016-12-21 14:34:07 -070016429 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016430
16431 // Color image
16432 VkClearColorValue clear_color;
16433 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
16434 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
16435 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
16436 const int32_t img_width = 32;
16437 const int32_t img_height = 32;
16438 VkImageCreateInfo image_create_info = {};
16439 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16440 image_create_info.pNext = NULL;
16441 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16442 image_create_info.format = color_format;
16443 image_create_info.extent.width = img_width;
16444 image_create_info.extent.height = img_height;
16445 image_create_info.extent.depth = 1;
16446 image_create_info.mipLevels = 1;
16447 image_create_info.arrayLayers = 1;
16448 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16449 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16450 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16451
16452 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016453 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016454
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016455 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016456
16457 // Depth/Stencil image
16458 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016459 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016460 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
16461 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
16462 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
16463 ds_image_create_info.extent.width = 64;
16464 ds_image_create_info.extent.height = 64;
16465 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070016466 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 -060016467
16468 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016469 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016470
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016471 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 -060016472
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016474
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016475 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016476 &color_range);
16477
16478 m_errorMonitor->VerifyFound();
16479
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16481 "vkCmdClearColorImage called with "
16482 "image created without "
16483 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060016484
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070016485 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060016486 &color_range);
16487
16488 m_errorMonitor->VerifyFound();
16489
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016490 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16492 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016493
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016494 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
16495 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016496
16497 m_errorMonitor->VerifyFound();
16498}
Tobin Ehliscde08892015-09-22 10:11:37 -060016499
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016500// WSI Enabled Tests
16501//
Chris Forbes09368e42016-10-13 11:59:22 +130016502#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016503TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
16504
16505#if defined(VK_USE_PLATFORM_XCB_KHR)
16506 VkSurfaceKHR surface = VK_NULL_HANDLE;
16507
16508 VkResult err;
16509 bool pass;
16510 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
16511 VkSwapchainCreateInfoKHR swapchain_create_info = {};
16512 // uint32_t swapchain_image_count = 0;
16513 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
16514 // uint32_t image_index = 0;
16515 // VkPresentInfoKHR present_info = {};
16516
16517 ASSERT_NO_FATAL_FAILURE(InitState());
16518
16519 // Use the create function from one of the VK_KHR_*_surface extension in
16520 // order to create a surface, testing all known errors in the process,
16521 // before successfully creating a surface:
16522 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
16523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
16524 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
16525 pass = (err != VK_SUCCESS);
16526 ASSERT_TRUE(pass);
16527 m_errorMonitor->VerifyFound();
16528
16529 // Next, try to create a surface with the wrong
16530 // VkXcbSurfaceCreateInfoKHR::sType:
16531 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
16532 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
16533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
16534 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
16535 pass = (err != VK_SUCCESS);
16536 ASSERT_TRUE(pass);
16537 m_errorMonitor->VerifyFound();
16538
16539 // Create a native window, and then correctly create a surface:
16540 xcb_connection_t *connection;
16541 xcb_screen_t *screen;
16542 xcb_window_t xcb_window;
16543 xcb_intern_atom_reply_t *atom_wm_delete_window;
16544
16545 const xcb_setup_t *setup;
16546 xcb_screen_iterator_t iter;
16547 int scr;
16548 uint32_t value_mask, value_list[32];
16549 int width = 1;
16550 int height = 1;
16551
16552 connection = xcb_connect(NULL, &scr);
16553 ASSERT_TRUE(connection != NULL);
16554 setup = xcb_get_setup(connection);
16555 iter = xcb_setup_roots_iterator(setup);
16556 while (scr-- > 0)
16557 xcb_screen_next(&iter);
16558 screen = iter.data;
16559
16560 xcb_window = xcb_generate_id(connection);
16561
16562 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
16563 value_list[0] = screen->black_pixel;
16564 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
16565
16566 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
16567 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
16568
16569 /* Magic code that will send notification when window is destroyed */
16570 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
16571 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
16572
16573 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
16574 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
16575 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
16576 free(reply);
16577
16578 xcb_map_window(connection, xcb_window);
16579
16580 // Force the x/y coordinates to 100,100 results are identical in consecutive
16581 // runs
16582 const uint32_t coords[] = { 100, 100 };
16583 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
16584
16585 // Finally, try to correctly create a surface:
16586 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
16587 xcb_create_info.pNext = NULL;
16588 xcb_create_info.flags = 0;
16589 xcb_create_info.connection = connection;
16590 xcb_create_info.window = xcb_window;
16591 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
16592 pass = (err == VK_SUCCESS);
16593 ASSERT_TRUE(pass);
16594
16595 // Check if surface supports presentation:
16596
16597 // 1st, do so without having queried the queue families:
16598 VkBool32 supported = false;
16599 // TODO: Get the following error to come out:
16600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16601 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
16602 "function");
16603 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
16604 pass = (err != VK_SUCCESS);
16605 // ASSERT_TRUE(pass);
16606 // m_errorMonitor->VerifyFound();
16607
16608 // Next, query a queue family index that's too large:
16609 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
16610 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
16611 pass = (err != VK_SUCCESS);
16612 ASSERT_TRUE(pass);
16613 m_errorMonitor->VerifyFound();
16614
16615 // Finally, do so correctly:
16616 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
16617 // SUPPORTED
16618 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
16619 pass = (err == VK_SUCCESS);
16620 ASSERT_TRUE(pass);
16621
16622 // Before proceeding, try to create a swapchain without having called
16623 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
16624 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
16625 swapchain_create_info.pNext = NULL;
16626 swapchain_create_info.flags = 0;
16627 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16628 swapchain_create_info.surface = surface;
16629 swapchain_create_info.imageArrayLayers = 1;
16630 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
16631 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
16632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16633 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
16634 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16635 pass = (err != VK_SUCCESS);
16636 ASSERT_TRUE(pass);
16637 m_errorMonitor->VerifyFound();
16638
16639 // Get the surface capabilities:
16640 VkSurfaceCapabilitiesKHR surface_capabilities;
16641
16642 // Do so correctly (only error logged by this entrypoint is if the
16643 // extension isn't enabled):
16644 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
16645 pass = (err == VK_SUCCESS);
16646 ASSERT_TRUE(pass);
16647
16648 // Get the surface formats:
16649 uint32_t surface_format_count;
16650
16651 // First, try without a pointer to surface_format_count:
16652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
16653 "specified as NULL");
16654 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
16655 pass = (err == VK_SUCCESS);
16656 ASSERT_TRUE(pass);
16657 m_errorMonitor->VerifyFound();
16658
16659 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
16660 // correctly done a 1st try (to get the count):
16661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
16662 surface_format_count = 0;
16663 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
16664 pass = (err == VK_SUCCESS);
16665 ASSERT_TRUE(pass);
16666 m_errorMonitor->VerifyFound();
16667
16668 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
16669 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
16670 pass = (err == VK_SUCCESS);
16671 ASSERT_TRUE(pass);
16672
16673 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
16674 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
16675
16676 // Next, do a 2nd try with surface_format_count being set too high:
16677 surface_format_count += 5;
16678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
16679 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
16680 pass = (err == VK_SUCCESS);
16681 ASSERT_TRUE(pass);
16682 m_errorMonitor->VerifyFound();
16683
16684 // Finally, do a correct 1st and 2nd try:
16685 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
16686 pass = (err == VK_SUCCESS);
16687 ASSERT_TRUE(pass);
16688 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
16689 pass = (err == VK_SUCCESS);
16690 ASSERT_TRUE(pass);
16691
16692 // Get the surface present modes:
16693 uint32_t surface_present_mode_count;
16694
16695 // First, try without a pointer to surface_format_count:
16696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
16697 "specified as NULL");
16698
16699 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
16700 pass = (err == VK_SUCCESS);
16701 ASSERT_TRUE(pass);
16702 m_errorMonitor->VerifyFound();
16703
16704 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
16705 // correctly done a 1st try (to get the count):
16706 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
16707 surface_present_mode_count = 0;
16708 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
16709 (VkPresentModeKHR *)&surface_present_mode_count);
16710 pass = (err == VK_SUCCESS);
16711 ASSERT_TRUE(pass);
16712 m_errorMonitor->VerifyFound();
16713
16714 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
16715 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
16716 pass = (err == VK_SUCCESS);
16717 ASSERT_TRUE(pass);
16718
16719 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
16720 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
16721
16722 // Next, do a 2nd try with surface_format_count being set too high:
16723 surface_present_mode_count += 5;
16724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
16725 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
16726 pass = (err == VK_SUCCESS);
16727 ASSERT_TRUE(pass);
16728 m_errorMonitor->VerifyFound();
16729
16730 // Finally, do a correct 1st and 2nd try:
16731 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
16732 pass = (err == VK_SUCCESS);
16733 ASSERT_TRUE(pass);
16734 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
16735 pass = (err == VK_SUCCESS);
16736 ASSERT_TRUE(pass);
16737
16738 // Create a swapchain:
16739
16740 // First, try without a pointer to swapchain_create_info:
16741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
16742 "specified as NULL");
16743
16744 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
16745 pass = (err != VK_SUCCESS);
16746 ASSERT_TRUE(pass);
16747 m_errorMonitor->VerifyFound();
16748
16749 // Next, call with a non-NULL swapchain_create_info, that has the wrong
16750 // sType:
16751 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
16752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
16753
16754 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16755 pass = (err != VK_SUCCESS);
16756 ASSERT_TRUE(pass);
16757 m_errorMonitor->VerifyFound();
16758
16759 // Next, call with a NULL swapchain pointer:
16760 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
16761 swapchain_create_info.pNext = NULL;
16762 swapchain_create_info.flags = 0;
16763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
16764 "specified as NULL");
16765
16766 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
16767 pass = (err != VK_SUCCESS);
16768 ASSERT_TRUE(pass);
16769 m_errorMonitor->VerifyFound();
16770
16771 // TODO: Enhance swapchain layer so that
16772 // swapchain_create_info.queueFamilyIndexCount is checked against something?
16773
16774 // Next, call with a queue family index that's too large:
16775 uint32_t queueFamilyIndex[2] = { 100000, 0 };
16776 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
16777 swapchain_create_info.queueFamilyIndexCount = 2;
16778 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
16779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
16780 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16781 pass = (err != VK_SUCCESS);
16782 ASSERT_TRUE(pass);
16783 m_errorMonitor->VerifyFound();
16784
16785 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
16786 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
16787 swapchain_create_info.queueFamilyIndexCount = 1;
16788 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16789 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
16790 "pCreateInfo->pQueueFamilyIndices).");
16791 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16792 pass = (err != VK_SUCCESS);
16793 ASSERT_TRUE(pass);
16794 m_errorMonitor->VerifyFound();
16795
16796 // Next, call with an invalid imageSharingMode:
16797 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
16798 swapchain_create_info.queueFamilyIndexCount = 1;
16799 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16800 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
16801 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16802 pass = (err != VK_SUCCESS);
16803 ASSERT_TRUE(pass);
16804 m_errorMonitor->VerifyFound();
16805 // Fix for the future:
16806 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
16807 // SUPPORTED
16808 swapchain_create_info.queueFamilyIndexCount = 0;
16809 queueFamilyIndex[0] = 0;
16810 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
16811
16812 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
16813 // Get the images from a swapchain:
16814 // Acquire an image from a swapchain:
16815 // Present an image to a swapchain:
16816 // Destroy the swapchain:
16817
16818 // TODOs:
16819 //
16820 // - Try destroying the device without first destroying the swapchain
16821 //
16822 // - Try destroying the device without first destroying the surface
16823 //
16824 // - Try destroying the surface without first destroying the swapchain
16825
16826 // Destroy the surface:
16827 vkDestroySurfaceKHR(instance(), surface, NULL);
16828
16829 // Tear down the window:
16830 xcb_destroy_window(connection, xcb_window);
16831 xcb_disconnect(connection);
16832
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016833#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016834 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016835#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016836}
Chris Forbes09368e42016-10-13 11:59:22 +130016837#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016838
16839//
16840// POSITIVE VALIDATION TESTS
16841//
16842// These tests do not expect to encounter ANY validation errors pass only if this is true
16843
Tobin Ehlise0006882016-11-03 10:14:28 -060016844TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016845 TEST_DESCRIPTION(
16846 "Perform an image layout transition in a secondary command buffer followed "
16847 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060016848 VkResult err;
16849 m_errorMonitor->ExpectSuccess();
16850 ASSERT_NO_FATAL_FAILURE(InitState());
16851 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16852 // Allocate a secondary and primary cmd buffer
16853 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
16854 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
16855 command_buffer_allocate_info.commandPool = m_commandPool;
16856 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
16857 command_buffer_allocate_info.commandBufferCount = 1;
16858
16859 VkCommandBuffer secondary_command_buffer;
16860 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
16861 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
16862 VkCommandBuffer primary_command_buffer;
16863 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
16864 VkCommandBufferBeginInfo command_buffer_begin_info = {};
16865 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
16866 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
16867 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
16868 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
16869 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
16870
16871 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
16872 ASSERT_VK_SUCCESS(err);
16873 VkImageObj image(m_device);
16874 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
16875 ASSERT_TRUE(image.initialized());
16876 VkImageMemoryBarrier img_barrier = {};
16877 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16878 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16879 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16880 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16881 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16882 img_barrier.image = image.handle();
16883 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16884 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16885 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16886 img_barrier.subresourceRange.baseArrayLayer = 0;
16887 img_barrier.subresourceRange.baseMipLevel = 0;
16888 img_barrier.subresourceRange.layerCount = 1;
16889 img_barrier.subresourceRange.levelCount = 1;
16890 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
16891 0, nullptr, 1, &img_barrier);
16892 err = vkEndCommandBuffer(secondary_command_buffer);
16893 ASSERT_VK_SUCCESS(err);
16894
16895 // Now update primary cmd buffer to execute secondary and transitions image
16896 command_buffer_begin_info.pInheritanceInfo = nullptr;
16897 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
16898 ASSERT_VK_SUCCESS(err);
16899 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
16900 VkImageMemoryBarrier img_barrier2 = {};
16901 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16902 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16903 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16904 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16905 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16906 img_barrier2.image = image.handle();
16907 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16908 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16909 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16910 img_barrier2.subresourceRange.baseArrayLayer = 0;
16911 img_barrier2.subresourceRange.baseMipLevel = 0;
16912 img_barrier2.subresourceRange.layerCount = 1;
16913 img_barrier2.subresourceRange.levelCount = 1;
16914 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
16915 nullptr, 1, &img_barrier2);
16916 err = vkEndCommandBuffer(primary_command_buffer);
16917 ASSERT_VK_SUCCESS(err);
16918 VkSubmitInfo submit_info = {};
16919 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
16920 submit_info.commandBufferCount = 1;
16921 submit_info.pCommandBuffers = &primary_command_buffer;
16922 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
16923 ASSERT_VK_SUCCESS(err);
16924 m_errorMonitor->VerifyNotFound();
16925 err = vkDeviceWaitIdle(m_device->device());
16926 ASSERT_VK_SUCCESS(err);
16927 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &secondary_command_buffer);
16928 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &primary_command_buffer);
16929}
16930
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016931// This is a positive test. No failures are expected.
16932TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016933 TEST_DESCRIPTION(
16934 "Ensure that the vkUpdateDescriptorSets validation code "
16935 "is ignoring VkWriteDescriptorSet members that are not "
16936 "related to the descriptor type specified by "
16937 "VkWriteDescriptorSet::descriptorType. Correct "
16938 "validation behavior will result in the test running to "
16939 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016940
16941 const uintptr_t invalid_ptr = 0xcdcdcdcd;
16942
16943 ASSERT_NO_FATAL_FAILURE(InitState());
16944
16945 // Image Case
16946 {
16947 m_errorMonitor->ExpectSuccess();
16948
16949 VkImage image;
16950 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16951 const int32_t tex_width = 32;
16952 const int32_t tex_height = 32;
16953 VkImageCreateInfo image_create_info = {};
16954 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16955 image_create_info.pNext = NULL;
16956 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16957 image_create_info.format = tex_format;
16958 image_create_info.extent.width = tex_width;
16959 image_create_info.extent.height = tex_height;
16960 image_create_info.extent.depth = 1;
16961 image_create_info.mipLevels = 1;
16962 image_create_info.arrayLayers = 1;
16963 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16964 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16965 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16966 image_create_info.flags = 0;
16967 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16968 ASSERT_VK_SUCCESS(err);
16969
16970 VkMemoryRequirements memory_reqs;
16971 VkDeviceMemory image_memory;
16972 bool pass;
16973 VkMemoryAllocateInfo memory_info = {};
16974 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16975 memory_info.pNext = NULL;
16976 memory_info.allocationSize = 0;
16977 memory_info.memoryTypeIndex = 0;
16978 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
16979 memory_info.allocationSize = memory_reqs.size;
16980 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
16981 ASSERT_TRUE(pass);
16982 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
16983 ASSERT_VK_SUCCESS(err);
16984 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
16985 ASSERT_VK_SUCCESS(err);
16986
16987 VkImageViewCreateInfo image_view_create_info = {};
16988 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16989 image_view_create_info.image = image;
16990 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16991 image_view_create_info.format = tex_format;
16992 image_view_create_info.subresourceRange.layerCount = 1;
16993 image_view_create_info.subresourceRange.baseMipLevel = 0;
16994 image_view_create_info.subresourceRange.levelCount = 1;
16995 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16996
16997 VkImageView view;
16998 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
16999 ASSERT_VK_SUCCESS(err);
17000
17001 VkDescriptorPoolSize ds_type_count = {};
17002 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17003 ds_type_count.descriptorCount = 1;
17004
17005 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17006 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17007 ds_pool_ci.pNext = NULL;
17008 ds_pool_ci.maxSets = 1;
17009 ds_pool_ci.poolSizeCount = 1;
17010 ds_pool_ci.pPoolSizes = &ds_type_count;
17011
17012 VkDescriptorPool ds_pool;
17013 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17014 ASSERT_VK_SUCCESS(err);
17015
17016 VkDescriptorSetLayoutBinding dsl_binding = {};
17017 dsl_binding.binding = 0;
17018 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17019 dsl_binding.descriptorCount = 1;
17020 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17021 dsl_binding.pImmutableSamplers = NULL;
17022
17023 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17024 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17025 ds_layout_ci.pNext = NULL;
17026 ds_layout_ci.bindingCount = 1;
17027 ds_layout_ci.pBindings = &dsl_binding;
17028 VkDescriptorSetLayout ds_layout;
17029 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17030 ASSERT_VK_SUCCESS(err);
17031
17032 VkDescriptorSet descriptor_set;
17033 VkDescriptorSetAllocateInfo alloc_info = {};
17034 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17035 alloc_info.descriptorSetCount = 1;
17036 alloc_info.descriptorPool = ds_pool;
17037 alloc_info.pSetLayouts = &ds_layout;
17038 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17039 ASSERT_VK_SUCCESS(err);
17040
17041 VkDescriptorImageInfo image_info = {};
17042 image_info.imageView = view;
17043 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
17044
17045 VkWriteDescriptorSet descriptor_write;
17046 memset(&descriptor_write, 0, sizeof(descriptor_write));
17047 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17048 descriptor_write.dstSet = descriptor_set;
17049 descriptor_write.dstBinding = 0;
17050 descriptor_write.descriptorCount = 1;
17051 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17052 descriptor_write.pImageInfo = &image_info;
17053
17054 // Set pBufferInfo and pTexelBufferView to invalid values, which should
17055 // be
17056 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
17057 // This will most likely produce a crash if the parameter_validation
17058 // layer
17059 // does not correctly ignore pBufferInfo.
17060 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
17061 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
17062
17063 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17064
17065 m_errorMonitor->VerifyNotFound();
17066
17067 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17068 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17069 vkDestroyImageView(m_device->device(), view, NULL);
17070 vkDestroyImage(m_device->device(), image, NULL);
17071 vkFreeMemory(m_device->device(), image_memory, NULL);
17072 }
17073
17074 // Buffer Case
17075 {
17076 m_errorMonitor->ExpectSuccess();
17077
17078 VkBuffer buffer;
17079 uint32_t queue_family_index = 0;
17080 VkBufferCreateInfo buffer_create_info = {};
17081 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17082 buffer_create_info.size = 1024;
17083 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
17084 buffer_create_info.queueFamilyIndexCount = 1;
17085 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
17086
17087 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
17088 ASSERT_VK_SUCCESS(err);
17089
17090 VkMemoryRequirements memory_reqs;
17091 VkDeviceMemory buffer_memory;
17092 bool pass;
17093 VkMemoryAllocateInfo memory_info = {};
17094 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17095 memory_info.pNext = NULL;
17096 memory_info.allocationSize = 0;
17097 memory_info.memoryTypeIndex = 0;
17098
17099 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
17100 memory_info.allocationSize = memory_reqs.size;
17101 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
17102 ASSERT_TRUE(pass);
17103
17104 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
17105 ASSERT_VK_SUCCESS(err);
17106 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
17107 ASSERT_VK_SUCCESS(err);
17108
17109 VkDescriptorPoolSize ds_type_count = {};
17110 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17111 ds_type_count.descriptorCount = 1;
17112
17113 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17114 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17115 ds_pool_ci.pNext = NULL;
17116 ds_pool_ci.maxSets = 1;
17117 ds_pool_ci.poolSizeCount = 1;
17118 ds_pool_ci.pPoolSizes = &ds_type_count;
17119
17120 VkDescriptorPool ds_pool;
17121 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17122 ASSERT_VK_SUCCESS(err);
17123
17124 VkDescriptorSetLayoutBinding dsl_binding = {};
17125 dsl_binding.binding = 0;
17126 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17127 dsl_binding.descriptorCount = 1;
17128 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17129 dsl_binding.pImmutableSamplers = NULL;
17130
17131 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17132 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17133 ds_layout_ci.pNext = NULL;
17134 ds_layout_ci.bindingCount = 1;
17135 ds_layout_ci.pBindings = &dsl_binding;
17136 VkDescriptorSetLayout ds_layout;
17137 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17138 ASSERT_VK_SUCCESS(err);
17139
17140 VkDescriptorSet descriptor_set;
17141 VkDescriptorSetAllocateInfo alloc_info = {};
17142 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17143 alloc_info.descriptorSetCount = 1;
17144 alloc_info.descriptorPool = ds_pool;
17145 alloc_info.pSetLayouts = &ds_layout;
17146 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17147 ASSERT_VK_SUCCESS(err);
17148
17149 VkDescriptorBufferInfo buffer_info = {};
17150 buffer_info.buffer = buffer;
17151 buffer_info.offset = 0;
17152 buffer_info.range = 1024;
17153
17154 VkWriteDescriptorSet descriptor_write;
17155 memset(&descriptor_write, 0, sizeof(descriptor_write));
17156 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17157 descriptor_write.dstSet = descriptor_set;
17158 descriptor_write.dstBinding = 0;
17159 descriptor_write.descriptorCount = 1;
17160 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17161 descriptor_write.pBufferInfo = &buffer_info;
17162
17163 // Set pImageInfo and pTexelBufferView to invalid values, which should
17164 // be
17165 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
17166 // This will most likely produce a crash if the parameter_validation
17167 // layer
17168 // does not correctly ignore pImageInfo.
17169 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
17170 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
17171
17172 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17173
17174 m_errorMonitor->VerifyNotFound();
17175
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017176 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17177 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17178 vkDestroyBuffer(m_device->device(), buffer, NULL);
17179 vkFreeMemory(m_device->device(), buffer_memory, NULL);
17180 }
17181
17182 // Texel Buffer Case
17183 {
17184 m_errorMonitor->ExpectSuccess();
17185
17186 VkBuffer buffer;
17187 uint32_t queue_family_index = 0;
17188 VkBufferCreateInfo buffer_create_info = {};
17189 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17190 buffer_create_info.size = 1024;
17191 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
17192 buffer_create_info.queueFamilyIndexCount = 1;
17193 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
17194
17195 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
17196 ASSERT_VK_SUCCESS(err);
17197
17198 VkMemoryRequirements memory_reqs;
17199 VkDeviceMemory buffer_memory;
17200 bool pass;
17201 VkMemoryAllocateInfo memory_info = {};
17202 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17203 memory_info.pNext = NULL;
17204 memory_info.allocationSize = 0;
17205 memory_info.memoryTypeIndex = 0;
17206
17207 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
17208 memory_info.allocationSize = memory_reqs.size;
17209 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
17210 ASSERT_TRUE(pass);
17211
17212 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
17213 ASSERT_VK_SUCCESS(err);
17214 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
17215 ASSERT_VK_SUCCESS(err);
17216
17217 VkBufferViewCreateInfo buff_view_ci = {};
17218 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
17219 buff_view_ci.buffer = buffer;
17220 buff_view_ci.format = VK_FORMAT_R8_UNORM;
17221 buff_view_ci.range = VK_WHOLE_SIZE;
17222 VkBufferView buffer_view;
17223 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
17224
17225 VkDescriptorPoolSize ds_type_count = {};
17226 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
17227 ds_type_count.descriptorCount = 1;
17228
17229 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17230 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17231 ds_pool_ci.pNext = NULL;
17232 ds_pool_ci.maxSets = 1;
17233 ds_pool_ci.poolSizeCount = 1;
17234 ds_pool_ci.pPoolSizes = &ds_type_count;
17235
17236 VkDescriptorPool ds_pool;
17237 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17238 ASSERT_VK_SUCCESS(err);
17239
17240 VkDescriptorSetLayoutBinding dsl_binding = {};
17241 dsl_binding.binding = 0;
17242 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
17243 dsl_binding.descriptorCount = 1;
17244 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17245 dsl_binding.pImmutableSamplers = NULL;
17246
17247 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17248 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17249 ds_layout_ci.pNext = NULL;
17250 ds_layout_ci.bindingCount = 1;
17251 ds_layout_ci.pBindings = &dsl_binding;
17252 VkDescriptorSetLayout ds_layout;
17253 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17254 ASSERT_VK_SUCCESS(err);
17255
17256 VkDescriptorSet descriptor_set;
17257 VkDescriptorSetAllocateInfo alloc_info = {};
17258 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17259 alloc_info.descriptorSetCount = 1;
17260 alloc_info.descriptorPool = ds_pool;
17261 alloc_info.pSetLayouts = &ds_layout;
17262 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17263 ASSERT_VK_SUCCESS(err);
17264
17265 VkWriteDescriptorSet descriptor_write;
17266 memset(&descriptor_write, 0, sizeof(descriptor_write));
17267 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17268 descriptor_write.dstSet = descriptor_set;
17269 descriptor_write.dstBinding = 0;
17270 descriptor_write.descriptorCount = 1;
17271 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
17272 descriptor_write.pTexelBufferView = &buffer_view;
17273
17274 // Set pImageInfo and pBufferInfo to invalid values, which should be
17275 // ignored for descriptorType ==
17276 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
17277 // This will most likely produce a crash if the parameter_validation
17278 // layer
17279 // does not correctly ignore pImageInfo and pBufferInfo.
17280 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
17281 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
17282
17283 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17284
17285 m_errorMonitor->VerifyNotFound();
17286
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017287 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17288 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17289 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
17290 vkDestroyBuffer(m_device->device(), buffer, NULL);
17291 vkFreeMemory(m_device->device(), buffer_memory, NULL);
17292 }
17293}
17294
Tobin Ehlisf7428442016-10-25 07:58:24 -060017295TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
17296 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
17297
17298 ASSERT_NO_FATAL_FAILURE(InitState());
17299 // Create layout where two binding #s are "1"
17300 static const uint32_t NUM_BINDINGS = 3;
17301 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
17302 dsl_binding[0].binding = 1;
17303 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17304 dsl_binding[0].descriptorCount = 1;
17305 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17306 dsl_binding[0].pImmutableSamplers = NULL;
17307 dsl_binding[1].binding = 0;
17308 dsl_binding[1].descriptorCount = 1;
17309 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17310 dsl_binding[1].descriptorCount = 1;
17311 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17312 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017313 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060017314 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17315 dsl_binding[2].descriptorCount = 1;
17316 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17317 dsl_binding[2].pImmutableSamplers = NULL;
17318
17319 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17320 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17321 ds_layout_ci.pNext = NULL;
17322 ds_layout_ci.bindingCount = NUM_BINDINGS;
17323 ds_layout_ci.pBindings = dsl_binding;
17324 VkDescriptorSetLayout ds_layout;
17325 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
17326 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17327 m_errorMonitor->VerifyFound();
17328}
17329
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060017330TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017331 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
17332
17333 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017334
Tony Barbour552f6c02016-12-21 14:34:07 -070017335 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017336
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060017337 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
17338
17339 {
17340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
17341 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
17342 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17343 m_errorMonitor->VerifyFound();
17344 }
17345
17346 {
17347 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
17348 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
17349 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17350 m_errorMonitor->VerifyFound();
17351 }
17352
17353 {
17354 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
17355 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
17356 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17357 m_errorMonitor->VerifyFound();
17358 }
17359
17360 {
17361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
17362 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
17363 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17364 m_errorMonitor->VerifyFound();
17365 }
17366
17367 {
17368 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
17369 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
17370 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17371 m_errorMonitor->VerifyFound();
17372 }
17373
17374 {
17375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
17376 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
17377 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17378 m_errorMonitor->VerifyFound();
17379 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017380
17381 {
17382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
17383 VkRect2D scissor = {{-1, 0}, {16, 16}};
17384 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
17385 m_errorMonitor->VerifyFound();
17386 }
17387
17388 {
17389 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
17390 VkRect2D scissor = {{0, -2}, {16, 16}};
17391 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
17392 m_errorMonitor->VerifyFound();
17393 }
17394
17395 {
17396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
17397 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
17398 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
17399 m_errorMonitor->VerifyFound();
17400 }
17401
17402 {
17403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
17404 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
17405 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
17406 m_errorMonitor->VerifyFound();
17407 }
17408
Tony Barbour552f6c02016-12-21 14:34:07 -070017409 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017410}
17411
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017412// This is a positive test. No failures are expected.
17413TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
17414 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
17415 VkResult err;
17416
17417 ASSERT_NO_FATAL_FAILURE(InitState());
17418 m_errorMonitor->ExpectSuccess();
17419 VkDescriptorPoolSize ds_type_count = {};
17420 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17421 ds_type_count.descriptorCount = 2;
17422
17423 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17424 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17425 ds_pool_ci.pNext = NULL;
17426 ds_pool_ci.maxSets = 1;
17427 ds_pool_ci.poolSizeCount = 1;
17428 ds_pool_ci.pPoolSizes = &ds_type_count;
17429
17430 VkDescriptorPool ds_pool;
17431 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17432 ASSERT_VK_SUCCESS(err);
17433
17434 // Create layout with two uniform buffer descriptors w/ empty binding between them
17435 static const uint32_t NUM_BINDINGS = 3;
17436 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
17437 dsl_binding[0].binding = 0;
17438 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17439 dsl_binding[0].descriptorCount = 1;
17440 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
17441 dsl_binding[0].pImmutableSamplers = NULL;
17442 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017443 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017444 dsl_binding[2].binding = 2;
17445 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17446 dsl_binding[2].descriptorCount = 1;
17447 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
17448 dsl_binding[2].pImmutableSamplers = NULL;
17449
17450 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17451 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17452 ds_layout_ci.pNext = NULL;
17453 ds_layout_ci.bindingCount = NUM_BINDINGS;
17454 ds_layout_ci.pBindings = dsl_binding;
17455 VkDescriptorSetLayout ds_layout;
17456 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17457 ASSERT_VK_SUCCESS(err);
17458
17459 VkDescriptorSet descriptor_set = {};
17460 VkDescriptorSetAllocateInfo alloc_info = {};
17461 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17462 alloc_info.descriptorSetCount = 1;
17463 alloc_info.descriptorPool = ds_pool;
17464 alloc_info.pSetLayouts = &ds_layout;
17465 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17466 ASSERT_VK_SUCCESS(err);
17467
17468 // Create a buffer to be used for update
17469 VkBufferCreateInfo buff_ci = {};
17470 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17471 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
17472 buff_ci.size = 256;
17473 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17474 VkBuffer buffer;
17475 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
17476 ASSERT_VK_SUCCESS(err);
17477 // Have to bind memory to buffer before descriptor update
17478 VkMemoryAllocateInfo mem_alloc = {};
17479 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17480 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017481 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017482 mem_alloc.memoryTypeIndex = 0;
17483
17484 VkMemoryRequirements mem_reqs;
17485 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
17486 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
17487 if (!pass) {
17488 vkDestroyBuffer(m_device->device(), buffer, NULL);
17489 return;
17490 }
17491
17492 VkDeviceMemory mem;
17493 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
17494 ASSERT_VK_SUCCESS(err);
17495 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
17496 ASSERT_VK_SUCCESS(err);
17497
17498 // Only update the descriptor at binding 2
17499 VkDescriptorBufferInfo buff_info = {};
17500 buff_info.buffer = buffer;
17501 buff_info.offset = 0;
17502 buff_info.range = VK_WHOLE_SIZE;
17503 VkWriteDescriptorSet descriptor_write = {};
17504 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17505 descriptor_write.dstBinding = 2;
17506 descriptor_write.descriptorCount = 1;
17507 descriptor_write.pTexelBufferView = nullptr;
17508 descriptor_write.pBufferInfo = &buff_info;
17509 descriptor_write.pImageInfo = nullptr;
17510 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17511 descriptor_write.dstSet = descriptor_set;
17512
17513 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17514
17515 m_errorMonitor->VerifyNotFound();
17516 // Cleanup
17517 vkFreeMemory(m_device->device(), mem, NULL);
17518 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17519 vkDestroyBuffer(m_device->device(), buffer, NULL);
17520 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17521}
17522
17523// This is a positive test. No failures are expected.
17524TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
17525 VkResult err;
17526 bool pass;
17527
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017528 TEST_DESCRIPTION(
17529 "Create a buffer, allocate memory, bind memory, destroy "
17530 "the buffer, create an image, and bind the same memory to "
17531 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017532
17533 m_errorMonitor->ExpectSuccess();
17534
17535 ASSERT_NO_FATAL_FAILURE(InitState());
17536
17537 VkBuffer buffer;
17538 VkImage image;
17539 VkDeviceMemory mem;
17540 VkMemoryRequirements mem_reqs;
17541
17542 VkBufferCreateInfo buf_info = {};
17543 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17544 buf_info.pNext = NULL;
17545 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
17546 buf_info.size = 256;
17547 buf_info.queueFamilyIndexCount = 0;
17548 buf_info.pQueueFamilyIndices = NULL;
17549 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17550 buf_info.flags = 0;
17551 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
17552 ASSERT_VK_SUCCESS(err);
17553
17554 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
17555
17556 VkMemoryAllocateInfo alloc_info = {};
17557 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17558 alloc_info.pNext = NULL;
17559 alloc_info.memoryTypeIndex = 0;
17560
17561 // Ensure memory is big enough for both bindings
17562 alloc_info.allocationSize = 0x10000;
17563
17564 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
17565 if (!pass) {
17566 vkDestroyBuffer(m_device->device(), buffer, NULL);
17567 return;
17568 }
17569
17570 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
17571 ASSERT_VK_SUCCESS(err);
17572
17573 uint8_t *pData;
17574 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
17575 ASSERT_VK_SUCCESS(err);
17576
17577 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
17578
17579 vkUnmapMemory(m_device->device(), mem);
17580
17581 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
17582 ASSERT_VK_SUCCESS(err);
17583
17584 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
17585 // memory. In fact, it was never used by the GPU.
17586 // Just be be sure, wait for idle.
17587 vkDestroyBuffer(m_device->device(), buffer, NULL);
17588 vkDeviceWaitIdle(m_device->device());
17589
Tobin Ehlis6a005702016-12-28 15:25:56 -070017590 // Use optimal as some platforms report linear support but then fail image creation
17591 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
17592 VkImageFormatProperties image_format_properties;
17593 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
17594 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
17595 if (image_format_properties.maxExtent.width == 0) {
17596 printf("Image format not supported; skipped.\n");
17597 vkFreeMemory(m_device->device(), mem, NULL);
17598 return;
17599 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017600 VkImageCreateInfo image_create_info = {};
17601 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17602 image_create_info.pNext = NULL;
17603 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17604 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
17605 image_create_info.extent.width = 64;
17606 image_create_info.extent.height = 64;
17607 image_create_info.extent.depth = 1;
17608 image_create_info.mipLevels = 1;
17609 image_create_info.arrayLayers = 1;
17610 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070017611 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017612 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
17613 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17614 image_create_info.queueFamilyIndexCount = 0;
17615 image_create_info.pQueueFamilyIndices = NULL;
17616 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17617 image_create_info.flags = 0;
17618
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017619 /* Create a mappable image. It will be the texture if linear images are ok
17620 * to be textures or it will be the staging image if they are not.
17621 */
17622 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
17623 ASSERT_VK_SUCCESS(err);
17624
17625 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
17626
Tobin Ehlis6a005702016-12-28 15:25:56 -070017627 VkMemoryAllocateInfo mem_alloc = {};
17628 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17629 mem_alloc.pNext = NULL;
17630 mem_alloc.allocationSize = 0;
17631 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017632 mem_alloc.allocationSize = mem_reqs.size;
17633
17634 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
17635 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070017636 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017637 vkDestroyImage(m_device->device(), image, NULL);
17638 return;
17639 }
17640
17641 // VALIDATION FAILURE:
17642 err = vkBindImageMemory(m_device->device(), image, mem, 0);
17643 ASSERT_VK_SUCCESS(err);
17644
17645 m_errorMonitor->VerifyNotFound();
17646
17647 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017648 vkDestroyImage(m_device->device(), image, NULL);
17649}
17650
Tony Barbourab713912017-02-02 14:17:35 -070017651// This is a positive test. No failures are expected.
17652TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
17653 VkResult err;
17654
17655 TEST_DESCRIPTION(
17656 "Call all applicable destroy and free routines with NULL"
17657 "handles, expecting no validation errors");
17658
17659 m_errorMonitor->ExpectSuccess();
17660
17661 ASSERT_NO_FATAL_FAILURE(InitState());
17662 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
17663 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
17664 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
17665 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
17666 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
17667 vkDestroyDevice(VK_NULL_HANDLE, NULL);
17668 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
17669 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
17670 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
17671 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
17672 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
17673 vkDestroyInstance(VK_NULL_HANDLE, NULL);
17674 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
17675 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
17676 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
17677 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
17678 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
17679 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
17680 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
17681 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
17682
17683 VkCommandPool command_pool;
17684 VkCommandPoolCreateInfo pool_create_info{};
17685 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
17686 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
17687 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
17688 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
17689 VkCommandBuffer command_buffers[3] = {};
17690 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
17691 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17692 command_buffer_allocate_info.commandPool = command_pool;
17693 command_buffer_allocate_info.commandBufferCount = 1;
17694 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17695 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
17696 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
17697 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
17698
17699 VkDescriptorPoolSize ds_type_count = {};
17700 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17701 ds_type_count.descriptorCount = 1;
17702
17703 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17704 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17705 ds_pool_ci.pNext = NULL;
17706 ds_pool_ci.maxSets = 1;
17707 ds_pool_ci.poolSizeCount = 1;
17708 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
17709 ds_pool_ci.pPoolSizes = &ds_type_count;
17710
17711 VkDescriptorPool ds_pool;
17712 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17713 ASSERT_VK_SUCCESS(err);
17714
17715 VkDescriptorSetLayoutBinding dsl_binding = {};
17716 dsl_binding.binding = 2;
17717 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17718 dsl_binding.descriptorCount = 1;
17719 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17720 dsl_binding.pImmutableSamplers = NULL;
17721 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17722 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17723 ds_layout_ci.pNext = NULL;
17724 ds_layout_ci.bindingCount = 1;
17725 ds_layout_ci.pBindings = &dsl_binding;
17726 VkDescriptorSetLayout ds_layout;
17727 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17728 ASSERT_VK_SUCCESS(err);
17729
17730 VkDescriptorSet descriptor_sets[3] = {};
17731 VkDescriptorSetAllocateInfo alloc_info = {};
17732 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17733 alloc_info.descriptorSetCount = 1;
17734 alloc_info.descriptorPool = ds_pool;
17735 alloc_info.pSetLayouts = &ds_layout;
17736 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
17737 ASSERT_VK_SUCCESS(err);
17738 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
17739 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17740 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17741
17742 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
17743
17744 m_errorMonitor->VerifyNotFound();
17745}
17746
Tony Barbour626994c2017-02-08 15:29:37 -070017747TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070017748 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070017749
17750 m_errorMonitor->ExpectSuccess();
17751
17752 ASSERT_NO_FATAL_FAILURE(InitState());
17753 VkCommandBuffer cmd_bufs[4];
17754 VkCommandBufferAllocateInfo alloc_info;
17755 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17756 alloc_info.pNext = NULL;
17757 alloc_info.commandBufferCount = 4;
17758 alloc_info.commandPool = m_commandPool;
17759 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17760 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
17761 VkImageObj image(m_device);
17762 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17763 ASSERT_TRUE(image.initialized());
17764 VkCommandBufferBeginInfo cb_binfo;
17765 cb_binfo.pNext = NULL;
17766 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
17767 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
17768 cb_binfo.flags = 0;
17769 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
17770 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
17771 VkImageMemoryBarrier img_barrier = {};
17772 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17773 img_barrier.pNext = NULL;
17774 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17775 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17776 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17777 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
17778 img_barrier.image = image.handle();
17779 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17780 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17781 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17782 img_barrier.subresourceRange.baseArrayLayer = 0;
17783 img_barrier.subresourceRange.baseMipLevel = 0;
17784 img_barrier.subresourceRange.layerCount = 1;
17785 img_barrier.subresourceRange.levelCount = 1;
17786 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
17787 &img_barrier);
17788 vkEndCommandBuffer(cmd_bufs[0]);
17789 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
17790 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
17791 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17792 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
17793 &img_barrier);
17794 vkEndCommandBuffer(cmd_bufs[1]);
17795 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
17796 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17797 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
17798 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
17799 &img_barrier);
17800 vkEndCommandBuffer(cmd_bufs[2]);
17801 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
17802 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
17803 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
17804 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
17805 &img_barrier);
17806 vkEndCommandBuffer(cmd_bufs[3]);
17807
17808 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
17809 VkSemaphore semaphore1, semaphore2;
17810 VkSemaphoreCreateInfo semaphore_create_info{};
17811 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
17812 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
17813 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
17814 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
17815 VkSubmitInfo submit_info[3];
17816 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17817 submit_info[0].pNext = nullptr;
17818 submit_info[0].commandBufferCount = 1;
17819 submit_info[0].pCommandBuffers = &cmd_bufs[0];
17820 submit_info[0].signalSemaphoreCount = 1;
17821 submit_info[0].pSignalSemaphores = &semaphore1;
17822 submit_info[0].waitSemaphoreCount = 0;
17823 submit_info[0].pWaitDstStageMask = nullptr;
17824 submit_info[0].pWaitDstStageMask = flags;
17825 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17826 submit_info[1].pNext = nullptr;
17827 submit_info[1].commandBufferCount = 1;
17828 submit_info[1].pCommandBuffers = &cmd_bufs[1];
17829 submit_info[1].waitSemaphoreCount = 1;
17830 submit_info[1].pWaitSemaphores = &semaphore1;
17831 submit_info[1].signalSemaphoreCount = 1;
17832 submit_info[1].pSignalSemaphores = &semaphore2;
17833 submit_info[1].pWaitDstStageMask = flags;
17834 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17835 submit_info[2].pNext = nullptr;
17836 submit_info[2].commandBufferCount = 2;
17837 submit_info[2].pCommandBuffers = &cmd_bufs[2];
17838 submit_info[2].waitSemaphoreCount = 1;
17839 submit_info[2].pWaitSemaphores = &semaphore2;
17840 submit_info[2].signalSemaphoreCount = 0;
17841 submit_info[2].pSignalSemaphores = nullptr;
17842 submit_info[2].pWaitDstStageMask = flags;
17843 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
17844 vkQueueWaitIdle(m_device->m_queue);
17845
17846 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
17847 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
17848 m_errorMonitor->VerifyNotFound();
17849}
17850
Tobin Ehlis953e8392016-11-17 10:54:13 -070017851TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
17852 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
17853 // We previously had a bug where dynamic offset of inactive bindings was still being used
17854 VkResult err;
17855 m_errorMonitor->ExpectSuccess();
17856
17857 ASSERT_NO_FATAL_FAILURE(InitState());
17858 ASSERT_NO_FATAL_FAILURE(InitViewport());
17859 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17860
17861 VkDescriptorPoolSize ds_type_count = {};
17862 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17863 ds_type_count.descriptorCount = 3;
17864
17865 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17866 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17867 ds_pool_ci.pNext = NULL;
17868 ds_pool_ci.maxSets = 1;
17869 ds_pool_ci.poolSizeCount = 1;
17870 ds_pool_ci.pPoolSizes = &ds_type_count;
17871
17872 VkDescriptorPool ds_pool;
17873 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17874 ASSERT_VK_SUCCESS(err);
17875
17876 const uint32_t BINDING_COUNT = 3;
17877 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070017878 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070017879 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17880 dsl_binding[0].descriptorCount = 1;
17881 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17882 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070017883 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070017884 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17885 dsl_binding[1].descriptorCount = 1;
17886 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17887 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070017888 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070017889 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17890 dsl_binding[2].descriptorCount = 1;
17891 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17892 dsl_binding[2].pImmutableSamplers = NULL;
17893
17894 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17895 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17896 ds_layout_ci.pNext = NULL;
17897 ds_layout_ci.bindingCount = BINDING_COUNT;
17898 ds_layout_ci.pBindings = dsl_binding;
17899 VkDescriptorSetLayout ds_layout;
17900 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17901 ASSERT_VK_SUCCESS(err);
17902
17903 VkDescriptorSet descriptor_set;
17904 VkDescriptorSetAllocateInfo alloc_info = {};
17905 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17906 alloc_info.descriptorSetCount = 1;
17907 alloc_info.descriptorPool = ds_pool;
17908 alloc_info.pSetLayouts = &ds_layout;
17909 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17910 ASSERT_VK_SUCCESS(err);
17911
17912 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
17913 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
17914 pipeline_layout_ci.pNext = NULL;
17915 pipeline_layout_ci.setLayoutCount = 1;
17916 pipeline_layout_ci.pSetLayouts = &ds_layout;
17917
17918 VkPipelineLayout pipeline_layout;
17919 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
17920 ASSERT_VK_SUCCESS(err);
17921
17922 // Create two buffers to update the descriptors with
17923 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
17924 uint32_t qfi = 0;
17925 VkBufferCreateInfo buffCI = {};
17926 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17927 buffCI.size = 2048;
17928 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
17929 buffCI.queueFamilyIndexCount = 1;
17930 buffCI.pQueueFamilyIndices = &qfi;
17931
17932 VkBuffer dyub1;
17933 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
17934 ASSERT_VK_SUCCESS(err);
17935 // buffer2
17936 buffCI.size = 1024;
17937 VkBuffer dyub2;
17938 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
17939 ASSERT_VK_SUCCESS(err);
17940 // Allocate memory and bind to buffers
17941 VkMemoryAllocateInfo mem_alloc[2] = {};
17942 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17943 mem_alloc[0].pNext = NULL;
17944 mem_alloc[0].memoryTypeIndex = 0;
17945 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17946 mem_alloc[1].pNext = NULL;
17947 mem_alloc[1].memoryTypeIndex = 0;
17948
17949 VkMemoryRequirements mem_reqs1;
17950 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
17951 VkMemoryRequirements mem_reqs2;
17952 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
17953 mem_alloc[0].allocationSize = mem_reqs1.size;
17954 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
17955 mem_alloc[1].allocationSize = mem_reqs2.size;
17956 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
17957 if (!pass) {
17958 vkDestroyBuffer(m_device->device(), dyub1, NULL);
17959 vkDestroyBuffer(m_device->device(), dyub2, NULL);
17960 return;
17961 }
17962
17963 VkDeviceMemory mem1;
17964 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
17965 ASSERT_VK_SUCCESS(err);
17966 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
17967 ASSERT_VK_SUCCESS(err);
17968 VkDeviceMemory mem2;
17969 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
17970 ASSERT_VK_SUCCESS(err);
17971 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
17972 ASSERT_VK_SUCCESS(err);
17973 // Update descriptors
17974 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
17975 buff_info[0].buffer = dyub1;
17976 buff_info[0].offset = 0;
17977 buff_info[0].range = 256;
17978 buff_info[1].buffer = dyub1;
17979 buff_info[1].offset = 256;
17980 buff_info[1].range = 512;
17981 buff_info[2].buffer = dyub2;
17982 buff_info[2].offset = 0;
17983 buff_info[2].range = 512;
17984
17985 VkWriteDescriptorSet descriptor_write;
17986 memset(&descriptor_write, 0, sizeof(descriptor_write));
17987 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17988 descriptor_write.dstSet = descriptor_set;
17989 descriptor_write.dstBinding = 0;
17990 descriptor_write.descriptorCount = BINDING_COUNT;
17991 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17992 descriptor_write.pBufferInfo = buff_info;
17993
17994 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17995
Tony Barbour552f6c02016-12-21 14:34:07 -070017996 m_commandBuffer->BeginCommandBuffer();
17997 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070017998
17999 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018000 char const *vsSource =
18001 "#version 450\n"
18002 "\n"
18003 "out gl_PerVertex { \n"
18004 " vec4 gl_Position;\n"
18005 "};\n"
18006 "void main(){\n"
18007 " gl_Position = vec4(1);\n"
18008 "}\n";
18009 char const *fsSource =
18010 "#version 450\n"
18011 "\n"
18012 "layout(location=0) out vec4 x;\n"
18013 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
18014 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
18015 "void main(){\n"
18016 " x = vec4(bar1.y) + vec4(bar2.y);\n"
18017 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070018018 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
18019 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
18020 VkPipelineObj pipe(m_device);
18021 pipe.SetViewport(m_viewports);
18022 pipe.SetScissor(m_scissors);
18023 pipe.AddShader(&vs);
18024 pipe.AddShader(&fs);
18025 pipe.AddColorAttachment();
18026 pipe.CreateVKPipeline(pipeline_layout, renderPass());
18027
18028 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
18029 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
18030 // we used to have a bug in this case.
18031 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
18032 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
18033 &descriptor_set, BINDING_COUNT, dyn_off);
18034 Draw(1, 0, 0, 0);
18035 m_errorMonitor->VerifyNotFound();
18036
18037 vkDestroyBuffer(m_device->device(), dyub1, NULL);
18038 vkDestroyBuffer(m_device->device(), dyub2, NULL);
18039 vkFreeMemory(m_device->device(), mem1, NULL);
18040 vkFreeMemory(m_device->device(), mem2, NULL);
18041
18042 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
18043 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18044 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18045}
18046
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018047TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018048 TEST_DESCRIPTION(
18049 "Ensure that validations handling of non-coherent memory "
18050 "mapping while using VK_WHOLE_SIZE does not cause access "
18051 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018052 VkResult err;
18053 uint8_t *pData;
18054 ASSERT_NO_FATAL_FAILURE(InitState());
18055
18056 VkDeviceMemory mem;
18057 VkMemoryRequirements mem_reqs;
18058 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018059 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018060 VkMemoryAllocateInfo alloc_info = {};
18061 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18062 alloc_info.pNext = NULL;
18063 alloc_info.memoryTypeIndex = 0;
18064
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018065 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018066 alloc_info.allocationSize = allocation_size;
18067
18068 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
18069 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 -070018070 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018071 if (!pass) {
18072 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018073 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
18074 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018075 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018076 pass = m_device->phy().set_memory_type(
18077 mem_reqs.memoryTypeBits, &alloc_info,
18078 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
18079 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018080 if (!pass) {
18081 return;
18082 }
18083 }
18084 }
18085
18086 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
18087 ASSERT_VK_SUCCESS(err);
18088
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018089 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018090 m_errorMonitor->ExpectSuccess();
18091 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
18092 ASSERT_VK_SUCCESS(err);
18093 VkMappedMemoryRange mmr = {};
18094 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
18095 mmr.memory = mem;
18096 mmr.offset = 0;
18097 mmr.size = VK_WHOLE_SIZE;
18098 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18099 ASSERT_VK_SUCCESS(err);
18100 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
18101 ASSERT_VK_SUCCESS(err);
18102 m_errorMonitor->VerifyNotFound();
18103 vkUnmapMemory(m_device->device(), mem);
18104
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018105 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018106 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018107 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018108 ASSERT_VK_SUCCESS(err);
18109 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
18110 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018111 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018112 mmr.size = VK_WHOLE_SIZE;
18113 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18114 ASSERT_VK_SUCCESS(err);
18115 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
18116 ASSERT_VK_SUCCESS(err);
18117 m_errorMonitor->VerifyNotFound();
18118 vkUnmapMemory(m_device->device(), mem);
18119
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018120 // Map with offset and size
18121 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018122 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018123 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018124 ASSERT_VK_SUCCESS(err);
18125 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
18126 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018127 mmr.offset = 4 * atom_size;
18128 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018129 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18130 ASSERT_VK_SUCCESS(err);
18131 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
18132 ASSERT_VK_SUCCESS(err);
18133 m_errorMonitor->VerifyNotFound();
18134 vkUnmapMemory(m_device->device(), mem);
18135
18136 // Map without offset and flush WHOLE_SIZE with two separate offsets
18137 m_errorMonitor->ExpectSuccess();
18138 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
18139 ASSERT_VK_SUCCESS(err);
18140 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
18141 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018142 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018143 mmr.size = VK_WHOLE_SIZE;
18144 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18145 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018146 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018147 mmr.size = VK_WHOLE_SIZE;
18148 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18149 ASSERT_VK_SUCCESS(err);
18150 m_errorMonitor->VerifyNotFound();
18151 vkUnmapMemory(m_device->device(), mem);
18152
18153 vkFreeMemory(m_device->device(), mem, NULL);
18154}
18155
18156// This is a positive test. We used to expect error in this case but spec now allows it
18157TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
18158 m_errorMonitor->ExpectSuccess();
18159 vk_testing::Fence testFence;
18160 VkFenceCreateInfo fenceInfo = {};
18161 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18162 fenceInfo.pNext = NULL;
18163
18164 ASSERT_NO_FATAL_FAILURE(InitState());
18165 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018166 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018167 VkResult result = vkResetFences(m_device->device(), 1, fences);
18168 ASSERT_VK_SUCCESS(result);
18169
18170 m_errorMonitor->VerifyNotFound();
18171}
18172
18173TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
18174 m_errorMonitor->ExpectSuccess();
18175
18176 ASSERT_NO_FATAL_FAILURE(InitState());
18177 VkResult err;
18178
18179 // Record (empty!) command buffer that can be submitted multiple times
18180 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018181 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
18182 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018183 m_commandBuffer->BeginCommandBuffer(&cbbi);
18184 m_commandBuffer->EndCommandBuffer();
18185
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018186 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018187 VkFence fence;
18188 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
18189 ASSERT_VK_SUCCESS(err);
18190
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018191 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018192 VkSemaphore s1, s2;
18193 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
18194 ASSERT_VK_SUCCESS(err);
18195 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
18196 ASSERT_VK_SUCCESS(err);
18197
18198 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018199 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018200 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
18201 ASSERT_VK_SUCCESS(err);
18202
18203 // Submit CB again, signaling s2.
18204 si.pSignalSemaphores = &s2;
18205 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
18206 ASSERT_VK_SUCCESS(err);
18207
18208 // Wait for fence.
18209 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18210 ASSERT_VK_SUCCESS(err);
18211
18212 // CB is still in flight from second submission, but semaphore s1 is no
18213 // longer in flight. delete it.
18214 vkDestroySemaphore(m_device->device(), s1, nullptr);
18215
18216 m_errorMonitor->VerifyNotFound();
18217
18218 // Force device idle and clean up remaining objects
18219 vkDeviceWaitIdle(m_device->device());
18220 vkDestroySemaphore(m_device->device(), s2, nullptr);
18221 vkDestroyFence(m_device->device(), fence, nullptr);
18222}
18223
18224TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
18225 m_errorMonitor->ExpectSuccess();
18226
18227 ASSERT_NO_FATAL_FAILURE(InitState());
18228 VkResult err;
18229
18230 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018231 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018232 VkFence f1;
18233 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
18234 ASSERT_VK_SUCCESS(err);
18235
18236 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018237 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018238 VkFence f2;
18239 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
18240 ASSERT_VK_SUCCESS(err);
18241
18242 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018243 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018244 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
18245
18246 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018247 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018248 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
18249
18250 // Should have both retired!
18251 vkDestroyFence(m_device->device(), f1, nullptr);
18252 vkDestroyFence(m_device->device(), f2, nullptr);
18253
18254 m_errorMonitor->VerifyNotFound();
18255}
18256
18257TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018258 TEST_DESCRIPTION(
18259 "Verify that creating an image view from an image with valid usage "
18260 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018261
18262 ASSERT_NO_FATAL_FAILURE(InitState());
18263
18264 m_errorMonitor->ExpectSuccess();
18265 // Verify that we can create a view with usage INPUT_ATTACHMENT
18266 VkImageObj image(m_device);
18267 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
18268 ASSERT_TRUE(image.initialized());
18269 VkImageView imageView;
18270 VkImageViewCreateInfo ivci = {};
18271 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18272 ivci.image = image.handle();
18273 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
18274 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
18275 ivci.subresourceRange.layerCount = 1;
18276 ivci.subresourceRange.baseMipLevel = 0;
18277 ivci.subresourceRange.levelCount = 1;
18278 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18279
18280 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
18281 m_errorMonitor->VerifyNotFound();
18282 vkDestroyImageView(m_device->device(), imageView, NULL);
18283}
18284
18285// This is a positive test. No failures are expected.
18286TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018287 TEST_DESCRIPTION(
18288 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
18289 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018290
18291 ASSERT_NO_FATAL_FAILURE(InitState());
18292
18293 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018294 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018295
18296 m_errorMonitor->ExpectSuccess();
18297
18298 VkImage image;
18299 VkImageCreateInfo image_create_info = {};
18300 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18301 image_create_info.pNext = NULL;
18302 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18303 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18304 image_create_info.extent.width = 64;
18305 image_create_info.extent.height = 64;
18306 image_create_info.extent.depth = 1;
18307 image_create_info.mipLevels = 1;
18308 image_create_info.arrayLayers = 1;
18309 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18310 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18311 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
18312 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
18313 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18314 ASSERT_VK_SUCCESS(err);
18315
18316 VkMemoryRequirements memory_reqs;
18317 VkDeviceMemory memory_one, memory_two;
18318 bool pass;
18319 VkMemoryAllocateInfo memory_info = {};
18320 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18321 memory_info.pNext = NULL;
18322 memory_info.allocationSize = 0;
18323 memory_info.memoryTypeIndex = 0;
18324 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18325 // Find an image big enough to allow sparse mapping of 2 memory regions
18326 // Increase the image size until it is at least twice the
18327 // size of the required alignment, to ensure we can bind both
18328 // allocated memory blocks to the image on aligned offsets.
18329 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
18330 vkDestroyImage(m_device->device(), image, nullptr);
18331 image_create_info.extent.width *= 2;
18332 image_create_info.extent.height *= 2;
18333 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
18334 ASSERT_VK_SUCCESS(err);
18335 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18336 }
18337 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
18338 // at the end of the first
18339 memory_info.allocationSize = memory_reqs.alignment;
18340 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18341 ASSERT_TRUE(pass);
18342 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
18343 ASSERT_VK_SUCCESS(err);
18344 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
18345 ASSERT_VK_SUCCESS(err);
18346 VkSparseMemoryBind binds[2];
18347 binds[0].flags = 0;
18348 binds[0].memory = memory_one;
18349 binds[0].memoryOffset = 0;
18350 binds[0].resourceOffset = 0;
18351 binds[0].size = memory_info.allocationSize;
18352 binds[1].flags = 0;
18353 binds[1].memory = memory_two;
18354 binds[1].memoryOffset = 0;
18355 binds[1].resourceOffset = memory_info.allocationSize;
18356 binds[1].size = memory_info.allocationSize;
18357
18358 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
18359 opaqueBindInfo.image = image;
18360 opaqueBindInfo.bindCount = 2;
18361 opaqueBindInfo.pBinds = binds;
18362
18363 VkFence fence = VK_NULL_HANDLE;
18364 VkBindSparseInfo bindSparseInfo = {};
18365 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
18366 bindSparseInfo.imageOpaqueBindCount = 1;
18367 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
18368
18369 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
18370 vkQueueWaitIdle(m_device->m_queue);
18371 vkDestroyImage(m_device->device(), image, NULL);
18372 vkFreeMemory(m_device->device(), memory_one, NULL);
18373 vkFreeMemory(m_device->device(), memory_two, NULL);
18374 m_errorMonitor->VerifyNotFound();
18375}
18376
18377TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018378 TEST_DESCRIPTION(
18379 "Ensure that CmdBeginRenderPass with an attachment's "
18380 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
18381 "the command buffer has prior knowledge of that "
18382 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018383
18384 m_errorMonitor->ExpectSuccess();
18385
18386 ASSERT_NO_FATAL_FAILURE(InitState());
18387
18388 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018389 VkAttachmentDescription attachment = {0,
18390 VK_FORMAT_R8G8B8A8_UNORM,
18391 VK_SAMPLE_COUNT_1_BIT,
18392 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18393 VK_ATTACHMENT_STORE_OP_STORE,
18394 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18395 VK_ATTACHMENT_STORE_OP_DONT_CARE,
18396 VK_IMAGE_LAYOUT_UNDEFINED,
18397 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018398
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018399 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018400
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018401 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018402
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018403 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018404
18405 VkRenderPass rp;
18406 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18407 ASSERT_VK_SUCCESS(err);
18408
18409 // A compatible framebuffer.
18410 VkImageObj image(m_device);
18411 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
18412 ASSERT_TRUE(image.initialized());
18413
18414 VkImageViewCreateInfo ivci = {
18415 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
18416 nullptr,
18417 0,
18418 image.handle(),
18419 VK_IMAGE_VIEW_TYPE_2D,
18420 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018421 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
18422 VK_COMPONENT_SWIZZLE_IDENTITY},
18423 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018424 };
18425 VkImageView view;
18426 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
18427 ASSERT_VK_SUCCESS(err);
18428
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018429 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018430 VkFramebuffer fb;
18431 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18432 ASSERT_VK_SUCCESS(err);
18433
18434 // Record a single command buffer which uses this renderpass twice. The
18435 // bug is triggered at the beginning of the second renderpass, when the
18436 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018437 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 -070018438 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018439 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18440 vkCmdEndRenderPass(m_commandBuffer->handle());
18441 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18442
18443 m_errorMonitor->VerifyNotFound();
18444
18445 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070018446 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018447
18448 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18449 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18450 vkDestroyImageView(m_device->device(), view, nullptr);
18451}
18452
18453TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018454 TEST_DESCRIPTION(
18455 "This test should pass. Create a Framebuffer and "
18456 "command buffer, bind them together, then destroy "
18457 "command pool and framebuffer and verify there are no "
18458 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018459
18460 m_errorMonitor->ExpectSuccess();
18461
18462 ASSERT_NO_FATAL_FAILURE(InitState());
18463
18464 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018465 VkAttachmentDescription attachment = {0,
18466 VK_FORMAT_R8G8B8A8_UNORM,
18467 VK_SAMPLE_COUNT_1_BIT,
18468 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18469 VK_ATTACHMENT_STORE_OP_STORE,
18470 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18471 VK_ATTACHMENT_STORE_OP_DONT_CARE,
18472 VK_IMAGE_LAYOUT_UNDEFINED,
18473 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018474
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018475 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018476
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018477 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018478
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018479 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018480
18481 VkRenderPass rp;
18482 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18483 ASSERT_VK_SUCCESS(err);
18484
18485 // A compatible framebuffer.
18486 VkImageObj image(m_device);
18487 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
18488 ASSERT_TRUE(image.initialized());
18489
18490 VkImageViewCreateInfo ivci = {
18491 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
18492 nullptr,
18493 0,
18494 image.handle(),
18495 VK_IMAGE_VIEW_TYPE_2D,
18496 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018497 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
18498 VK_COMPONENT_SWIZZLE_IDENTITY},
18499 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018500 };
18501 VkImageView view;
18502 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
18503 ASSERT_VK_SUCCESS(err);
18504
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018505 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018506 VkFramebuffer fb;
18507 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18508 ASSERT_VK_SUCCESS(err);
18509
18510 // Explicitly create a command buffer to bind the FB to so that we can then
18511 // destroy the command pool in order to implicitly free command buffer
18512 VkCommandPool command_pool;
18513 VkCommandPoolCreateInfo pool_create_info{};
18514 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18515 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18516 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18517 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18518
18519 VkCommandBuffer command_buffer;
18520 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18521 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18522 command_buffer_allocate_info.commandPool = command_pool;
18523 command_buffer_allocate_info.commandBufferCount = 1;
18524 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18525 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
18526
18527 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018528 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 -060018529 VkCommandBufferBeginInfo begin_info{};
18530 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18531 vkBeginCommandBuffer(command_buffer, &begin_info);
18532
18533 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18534 vkCmdEndRenderPass(command_buffer);
18535 vkEndCommandBuffer(command_buffer);
18536 vkDestroyImageView(m_device->device(), view, nullptr);
18537 // Destroy command pool to implicitly free command buffer
18538 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18539 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18540 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18541 m_errorMonitor->VerifyNotFound();
18542}
18543
18544TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018545 TEST_DESCRIPTION(
18546 "Ensure that CmdBeginRenderPass applies the layout "
18547 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018548
18549 m_errorMonitor->ExpectSuccess();
18550
18551 ASSERT_NO_FATAL_FAILURE(InitState());
18552
18553 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018554 VkAttachmentDescription attachment = {0,
18555 VK_FORMAT_R8G8B8A8_UNORM,
18556 VK_SAMPLE_COUNT_1_BIT,
18557 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18558 VK_ATTACHMENT_STORE_OP_STORE,
18559 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18560 VK_ATTACHMENT_STORE_OP_DONT_CARE,
18561 VK_IMAGE_LAYOUT_UNDEFINED,
18562 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018563
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018564 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018565
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018566 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018567
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018568 VkSubpassDependency dep = {0,
18569 0,
18570 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
18571 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
18572 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18573 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18574 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018575
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018576 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018577
18578 VkResult err;
18579 VkRenderPass rp;
18580 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18581 ASSERT_VK_SUCCESS(err);
18582
18583 // A compatible framebuffer.
18584 VkImageObj image(m_device);
18585 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
18586 ASSERT_TRUE(image.initialized());
18587
18588 VkImageViewCreateInfo ivci = {
18589 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
18590 nullptr,
18591 0,
18592 image.handle(),
18593 VK_IMAGE_VIEW_TYPE_2D,
18594 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018595 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
18596 VK_COMPONENT_SWIZZLE_IDENTITY},
18597 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018598 };
18599 VkImageView view;
18600 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
18601 ASSERT_VK_SUCCESS(err);
18602
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018603 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018604 VkFramebuffer fb;
18605 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18606 ASSERT_VK_SUCCESS(err);
18607
18608 // Record a single command buffer which issues a pipeline barrier w/
18609 // image memory barrier for the attachment. This detects the previously
18610 // missing tracking of the subpass layout by throwing a validation error
18611 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018612 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 -070018613 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018614 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18615
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018616 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
18617 nullptr,
18618 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18619 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18620 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
18621 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
18622 VK_QUEUE_FAMILY_IGNORED,
18623 VK_QUEUE_FAMILY_IGNORED,
18624 image.handle(),
18625 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018626 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018627 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
18628 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018629
18630 vkCmdEndRenderPass(m_commandBuffer->handle());
18631 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070018632 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018633
18634 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18635 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18636 vkDestroyImageView(m_device->device(), view, nullptr);
18637}
18638
18639TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018640 TEST_DESCRIPTION(
18641 "Validate that when an imageView of a depth/stencil image "
18642 "is used as a depth/stencil framebuffer attachment, the "
18643 "aspectMask is ignored and both depth and stencil image "
18644 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018645
18646 VkFormatProperties format_properties;
18647 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
18648 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
18649 return;
18650 }
18651
18652 m_errorMonitor->ExpectSuccess();
18653
18654 ASSERT_NO_FATAL_FAILURE(InitState());
18655
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018656 VkAttachmentDescription attachment = {0,
18657 VK_FORMAT_D32_SFLOAT_S8_UINT,
18658 VK_SAMPLE_COUNT_1_BIT,
18659 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18660 VK_ATTACHMENT_STORE_OP_STORE,
18661 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18662 VK_ATTACHMENT_STORE_OP_DONT_CARE,
18663 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
18664 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018665
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018666 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018667
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018668 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018669
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018670 VkSubpassDependency dep = {0,
18671 0,
18672 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
18673 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
18674 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18675 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18676 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018677
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018678 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018679
18680 VkResult err;
18681 VkRenderPass rp;
18682 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18683 ASSERT_VK_SUCCESS(err);
18684
18685 VkImageObj image(m_device);
18686 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018687 0x26, // usage
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018688 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018689 ASSERT_TRUE(image.initialized());
18690 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
18691
18692 VkImageViewCreateInfo ivci = {
18693 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
18694 nullptr,
18695 0,
18696 image.handle(),
18697 VK_IMAGE_VIEW_TYPE_2D,
18698 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018699 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
18700 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018701 };
18702 VkImageView view;
18703 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
18704 ASSERT_VK_SUCCESS(err);
18705
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018706 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018707 VkFramebuffer fb;
18708 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18709 ASSERT_VK_SUCCESS(err);
18710
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018711 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Tony Barbour552f6c02016-12-21 14:34:07 -070018712 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018713 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18714
18715 VkImageMemoryBarrier imb = {};
18716 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18717 imb.pNext = nullptr;
18718 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
18719 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18720 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18721 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18722 imb.srcQueueFamilyIndex = 0;
18723 imb.dstQueueFamilyIndex = 0;
18724 imb.image = image.handle();
18725 imb.subresourceRange.aspectMask = 0x6;
18726 imb.subresourceRange.baseMipLevel = 0;
18727 imb.subresourceRange.levelCount = 0x1;
18728 imb.subresourceRange.baseArrayLayer = 0;
18729 imb.subresourceRange.layerCount = 0x1;
18730
18731 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018732 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
18733 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018734
18735 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070018736 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018737 QueueCommandBuffer(false);
18738 m_errorMonitor->VerifyNotFound();
18739
18740 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18741 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18742 vkDestroyImageView(m_device->device(), view, nullptr);
18743}
18744
18745TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018746 TEST_DESCRIPTION(
18747 "Ensure that layout transitions work correctly without "
18748 "errors, when an attachment reference is "
18749 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018750
18751 m_errorMonitor->ExpectSuccess();
18752
18753 ASSERT_NO_FATAL_FAILURE(InitState());
18754
18755 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018756 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018757
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018758 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018759
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018760 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018761
18762 VkRenderPass rp;
18763 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18764 ASSERT_VK_SUCCESS(err);
18765
18766 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018767 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018768 VkFramebuffer fb;
18769 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18770 ASSERT_VK_SUCCESS(err);
18771
18772 // Record a command buffer which just begins and ends the renderpass. The
18773 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018774 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 -070018775 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018776 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18777 vkCmdEndRenderPass(m_commandBuffer->handle());
18778 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070018779 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018780
18781 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18782 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18783}
18784
18785// This is a positive test. No errors are expected.
18786TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018787 TEST_DESCRIPTION(
18788 "Create a stencil-only attachment with a LOAD_OP set to "
18789 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018790 VkResult result = VK_SUCCESS;
18791 VkImageFormatProperties formatProps;
18792 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018793 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
18794 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018795 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
18796 return;
18797 }
18798
18799 ASSERT_NO_FATAL_FAILURE(InitState());
18800 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
18801 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018802 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018803 VkAttachmentDescription att = {};
18804 VkAttachmentReference ref = {};
18805 att.format = depth_stencil_fmt;
18806 att.samples = VK_SAMPLE_COUNT_1_BIT;
18807 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
18808 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
18809 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
18810 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
18811 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18812 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18813
18814 VkClearValue clear;
18815 clear.depthStencil.depth = 1.0;
18816 clear.depthStencil.stencil = 0;
18817 ref.attachment = 0;
18818 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18819
18820 VkSubpassDescription subpass = {};
18821 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
18822 subpass.flags = 0;
18823 subpass.inputAttachmentCount = 0;
18824 subpass.pInputAttachments = NULL;
18825 subpass.colorAttachmentCount = 0;
18826 subpass.pColorAttachments = NULL;
18827 subpass.pResolveAttachments = NULL;
18828 subpass.pDepthStencilAttachment = &ref;
18829 subpass.preserveAttachmentCount = 0;
18830 subpass.pPreserveAttachments = NULL;
18831
18832 VkRenderPass rp;
18833 VkRenderPassCreateInfo rp_info = {};
18834 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
18835 rp_info.attachmentCount = 1;
18836 rp_info.pAttachments = &att;
18837 rp_info.subpassCount = 1;
18838 rp_info.pSubpasses = &subpass;
18839 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
18840 ASSERT_VK_SUCCESS(result);
18841
18842 VkImageView *depthView = m_depthStencil->BindInfo();
18843 VkFramebufferCreateInfo fb_info = {};
18844 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
18845 fb_info.pNext = NULL;
18846 fb_info.renderPass = rp;
18847 fb_info.attachmentCount = 1;
18848 fb_info.pAttachments = depthView;
18849 fb_info.width = 100;
18850 fb_info.height = 100;
18851 fb_info.layers = 1;
18852 VkFramebuffer fb;
18853 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
18854 ASSERT_VK_SUCCESS(result);
18855
18856 VkRenderPassBeginInfo rpbinfo = {};
18857 rpbinfo.clearValueCount = 1;
18858 rpbinfo.pClearValues = &clear;
18859 rpbinfo.pNext = NULL;
18860 rpbinfo.renderPass = rp;
18861 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
18862 rpbinfo.renderArea.extent.width = 100;
18863 rpbinfo.renderArea.extent.height = 100;
18864 rpbinfo.renderArea.offset.x = 0;
18865 rpbinfo.renderArea.offset.y = 0;
18866 rpbinfo.framebuffer = fb;
18867
18868 VkFence fence = {};
18869 VkFenceCreateInfo fence_ci = {};
18870 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18871 fence_ci.pNext = nullptr;
18872 fence_ci.flags = 0;
18873 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
18874 ASSERT_VK_SUCCESS(result);
18875
18876 m_commandBuffer->BeginCommandBuffer();
18877 m_commandBuffer->BeginRenderPass(rpbinfo);
18878 m_commandBuffer->EndRenderPass();
18879 m_commandBuffer->EndCommandBuffer();
18880 m_commandBuffer->QueueCommandBuffer(fence);
18881
18882 VkImageObj destImage(m_device);
18883 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 -070018884 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018885 VkImageMemoryBarrier barrier = {};
18886 VkImageSubresourceRange range;
18887 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18888 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
18889 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
18890 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18891 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
18892 barrier.image = m_depthStencil->handle();
18893 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18894 range.baseMipLevel = 0;
18895 range.levelCount = 1;
18896 range.baseArrayLayer = 0;
18897 range.layerCount = 1;
18898 barrier.subresourceRange = range;
18899 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18900 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
18901 cmdbuf.BeginCommandBuffer();
18902 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 -070018903 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018904 barrier.srcAccessMask = 0;
18905 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18906 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
18907 barrier.image = destImage.handle();
18908 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
18909 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 -070018910 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018911 VkImageCopy cregion;
18912 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18913 cregion.srcSubresource.mipLevel = 0;
18914 cregion.srcSubresource.baseArrayLayer = 0;
18915 cregion.srcSubresource.layerCount = 1;
18916 cregion.srcOffset.x = 0;
18917 cregion.srcOffset.y = 0;
18918 cregion.srcOffset.z = 0;
18919 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18920 cregion.dstSubresource.mipLevel = 0;
18921 cregion.dstSubresource.baseArrayLayer = 0;
18922 cregion.dstSubresource.layerCount = 1;
18923 cregion.dstOffset.x = 0;
18924 cregion.dstOffset.y = 0;
18925 cregion.dstOffset.z = 0;
18926 cregion.extent.width = 100;
18927 cregion.extent.height = 100;
18928 cregion.extent.depth = 1;
18929 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018930 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018931 cmdbuf.EndCommandBuffer();
18932
18933 VkSubmitInfo submit_info;
18934 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18935 submit_info.pNext = NULL;
18936 submit_info.waitSemaphoreCount = 0;
18937 submit_info.pWaitSemaphores = NULL;
18938 submit_info.pWaitDstStageMask = NULL;
18939 submit_info.commandBufferCount = 1;
18940 submit_info.pCommandBuffers = &cmdbuf.handle();
18941 submit_info.signalSemaphoreCount = 0;
18942 submit_info.pSignalSemaphores = NULL;
18943
18944 m_errorMonitor->ExpectSuccess();
18945 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18946 m_errorMonitor->VerifyNotFound();
18947
18948 vkQueueWaitIdle(m_device->m_queue);
18949 vkDestroyFence(m_device->device(), fence, nullptr);
18950 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18951 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18952}
18953
18954// This is a positive test. No errors should be generated.
18955TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
18956 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
18957
18958 m_errorMonitor->ExpectSuccess();
18959 ASSERT_NO_FATAL_FAILURE(InitState());
18960
18961 VkEvent event;
18962 VkEventCreateInfo event_create_info{};
18963 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
18964 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
18965
18966 VkCommandPool command_pool;
18967 VkCommandPoolCreateInfo pool_create_info{};
18968 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18969 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18970 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18971 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18972
18973 VkCommandBuffer command_buffer;
18974 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18975 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18976 command_buffer_allocate_info.commandPool = command_pool;
18977 command_buffer_allocate_info.commandBufferCount = 1;
18978 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18979 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
18980
18981 VkQueue queue = VK_NULL_HANDLE;
18982 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
18983
18984 {
18985 VkCommandBufferBeginInfo begin_info{};
18986 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18987 vkBeginCommandBuffer(command_buffer, &begin_info);
18988
18989 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 -070018990 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018991 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
18992 vkEndCommandBuffer(command_buffer);
18993 }
18994 {
18995 VkSubmitInfo submit_info{};
18996 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18997 submit_info.commandBufferCount = 1;
18998 submit_info.pCommandBuffers = &command_buffer;
18999 submit_info.signalSemaphoreCount = 0;
19000 submit_info.pSignalSemaphores = nullptr;
19001 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19002 }
19003 { vkSetEvent(m_device->device(), event); }
19004
19005 vkQueueWaitIdle(queue);
19006
19007 vkDestroyEvent(m_device->device(), event, nullptr);
19008 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
19009 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19010
19011 m_errorMonitor->VerifyNotFound();
19012}
19013// This is a positive test. No errors should be generated.
19014TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
19015 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
19016
19017 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019018 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019019
19020 m_errorMonitor->ExpectSuccess();
19021
19022 VkQueryPool query_pool;
19023 VkQueryPoolCreateInfo query_pool_create_info{};
19024 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
19025 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
19026 query_pool_create_info.queryCount = 1;
19027 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
19028
19029 VkCommandPool command_pool;
19030 VkCommandPoolCreateInfo pool_create_info{};
19031 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19032 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19033 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19034 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19035
19036 VkCommandBuffer command_buffer;
19037 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19038 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19039 command_buffer_allocate_info.commandPool = command_pool;
19040 command_buffer_allocate_info.commandBufferCount = 1;
19041 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19042 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
19043
19044 VkCommandBuffer secondary_command_buffer;
19045 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19046 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
19047
19048 VkQueue queue = VK_NULL_HANDLE;
19049 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19050
19051 uint32_t qfi = 0;
19052 VkBufferCreateInfo buff_create_info = {};
19053 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19054 buff_create_info.size = 1024;
19055 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
19056 buff_create_info.queueFamilyIndexCount = 1;
19057 buff_create_info.pQueueFamilyIndices = &qfi;
19058
19059 VkResult err;
19060 VkBuffer buffer;
19061 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
19062 ASSERT_VK_SUCCESS(err);
19063 VkMemoryAllocateInfo mem_alloc = {};
19064 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19065 mem_alloc.pNext = NULL;
19066 mem_alloc.allocationSize = 1024;
19067 mem_alloc.memoryTypeIndex = 0;
19068
19069 VkMemoryRequirements memReqs;
19070 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
19071 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
19072 if (!pass) {
19073 vkDestroyBuffer(m_device->device(), buffer, NULL);
19074 return;
19075 }
19076
19077 VkDeviceMemory mem;
19078 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19079 ASSERT_VK_SUCCESS(err);
19080 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19081 ASSERT_VK_SUCCESS(err);
19082
19083 VkCommandBufferInheritanceInfo hinfo = {};
19084 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
19085 hinfo.renderPass = VK_NULL_HANDLE;
19086 hinfo.subpass = 0;
19087 hinfo.framebuffer = VK_NULL_HANDLE;
19088 hinfo.occlusionQueryEnable = VK_FALSE;
19089 hinfo.queryFlags = 0;
19090 hinfo.pipelineStatistics = 0;
19091
19092 {
19093 VkCommandBufferBeginInfo begin_info{};
19094 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19095 begin_info.pInheritanceInfo = &hinfo;
19096 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
19097
19098 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
19099 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
19100
19101 vkEndCommandBuffer(secondary_command_buffer);
19102
19103 begin_info.pInheritanceInfo = nullptr;
19104 vkBeginCommandBuffer(command_buffer, &begin_info);
19105
19106 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
19107 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
19108
19109 vkEndCommandBuffer(command_buffer);
19110 }
19111 {
19112 VkSubmitInfo submit_info{};
19113 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19114 submit_info.commandBufferCount = 1;
19115 submit_info.pCommandBuffers = &command_buffer;
19116 submit_info.signalSemaphoreCount = 0;
19117 submit_info.pSignalSemaphores = nullptr;
19118 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19119 }
19120
19121 vkQueueWaitIdle(queue);
19122
19123 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
19124 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
19125 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
19126 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19127 vkDestroyBuffer(m_device->device(), buffer, NULL);
19128 vkFreeMemory(m_device->device(), mem, NULL);
19129
19130 m_errorMonitor->VerifyNotFound();
19131}
19132
19133// This is a positive test. No errors should be generated.
19134TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
19135 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
19136
19137 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019138 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019139
19140 m_errorMonitor->ExpectSuccess();
19141
19142 VkQueryPool query_pool;
19143 VkQueryPoolCreateInfo query_pool_create_info{};
19144 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
19145 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
19146 query_pool_create_info.queryCount = 1;
19147 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
19148
19149 VkCommandPool command_pool;
19150 VkCommandPoolCreateInfo pool_create_info{};
19151 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19152 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19153 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19154 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19155
19156 VkCommandBuffer command_buffer[2];
19157 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19158 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19159 command_buffer_allocate_info.commandPool = command_pool;
19160 command_buffer_allocate_info.commandBufferCount = 2;
19161 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19162 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19163
19164 VkQueue queue = VK_NULL_HANDLE;
19165 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19166
19167 uint32_t qfi = 0;
19168 VkBufferCreateInfo buff_create_info = {};
19169 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19170 buff_create_info.size = 1024;
19171 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
19172 buff_create_info.queueFamilyIndexCount = 1;
19173 buff_create_info.pQueueFamilyIndices = &qfi;
19174
19175 VkResult err;
19176 VkBuffer buffer;
19177 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
19178 ASSERT_VK_SUCCESS(err);
19179 VkMemoryAllocateInfo mem_alloc = {};
19180 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19181 mem_alloc.pNext = NULL;
19182 mem_alloc.allocationSize = 1024;
19183 mem_alloc.memoryTypeIndex = 0;
19184
19185 VkMemoryRequirements memReqs;
19186 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
19187 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
19188 if (!pass) {
19189 vkDestroyBuffer(m_device->device(), buffer, NULL);
19190 return;
19191 }
19192
19193 VkDeviceMemory mem;
19194 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19195 ASSERT_VK_SUCCESS(err);
19196 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19197 ASSERT_VK_SUCCESS(err);
19198
19199 {
19200 VkCommandBufferBeginInfo begin_info{};
19201 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19202 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19203
19204 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
19205 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
19206
19207 vkEndCommandBuffer(command_buffer[0]);
19208
19209 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19210
19211 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
19212
19213 vkEndCommandBuffer(command_buffer[1]);
19214 }
19215 {
19216 VkSubmitInfo submit_info{};
19217 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19218 submit_info.commandBufferCount = 2;
19219 submit_info.pCommandBuffers = command_buffer;
19220 submit_info.signalSemaphoreCount = 0;
19221 submit_info.pSignalSemaphores = nullptr;
19222 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19223 }
19224
19225 vkQueueWaitIdle(queue);
19226
19227 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
19228 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
19229 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19230 vkDestroyBuffer(m_device->device(), buffer, NULL);
19231 vkFreeMemory(m_device->device(), mem, NULL);
19232
19233 m_errorMonitor->VerifyNotFound();
19234}
19235
Tony Barbourc46924f2016-11-04 11:49:52 -060019236TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019237 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
19238
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019239 ASSERT_NO_FATAL_FAILURE(InitState());
19240 VkEvent event;
19241 VkEventCreateInfo event_create_info{};
19242 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
19243 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
19244
19245 VkCommandPool command_pool;
19246 VkCommandPoolCreateInfo pool_create_info{};
19247 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19248 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19249 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19250 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19251
19252 VkCommandBuffer command_buffer;
19253 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19254 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19255 command_buffer_allocate_info.commandPool = command_pool;
19256 command_buffer_allocate_info.commandBufferCount = 1;
19257 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19258 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
19259
19260 VkQueue queue = VK_NULL_HANDLE;
19261 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
19262
19263 {
19264 VkCommandBufferBeginInfo begin_info{};
19265 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19266 vkBeginCommandBuffer(command_buffer, &begin_info);
19267
19268 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019269 vkEndCommandBuffer(command_buffer);
19270 }
19271 {
19272 VkSubmitInfo submit_info{};
19273 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19274 submit_info.commandBufferCount = 1;
19275 submit_info.pCommandBuffers = &command_buffer;
19276 submit_info.signalSemaphoreCount = 0;
19277 submit_info.pSignalSemaphores = nullptr;
19278 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19279 }
19280 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019281 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19282 "that is already in use by a "
19283 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019284 vkSetEvent(m_device->device(), event);
19285 m_errorMonitor->VerifyFound();
19286 }
19287
19288 vkQueueWaitIdle(queue);
19289
19290 vkDestroyEvent(m_device->device(), event, nullptr);
19291 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
19292 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19293}
19294
19295// This is a positive test. No errors should be generated.
19296TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019297 TEST_DESCRIPTION(
19298 "Two command buffers with two separate fences are each "
19299 "run through a Submit & WaitForFences cycle 3 times. This "
19300 "previously revealed a bug so running this positive test "
19301 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019302 m_errorMonitor->ExpectSuccess();
19303
19304 ASSERT_NO_FATAL_FAILURE(InitState());
19305 VkQueue queue = VK_NULL_HANDLE;
19306 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
19307
19308 static const uint32_t NUM_OBJECTS = 2;
19309 static const uint32_t NUM_FRAMES = 3;
19310 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
19311 VkFence fences[NUM_OBJECTS] = {};
19312
19313 VkCommandPool cmd_pool;
19314 VkCommandPoolCreateInfo cmd_pool_ci = {};
19315 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19316 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
19317 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19318 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
19319 ASSERT_VK_SUCCESS(err);
19320
19321 VkCommandBufferAllocateInfo cmd_buf_info = {};
19322 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19323 cmd_buf_info.commandPool = cmd_pool;
19324 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19325 cmd_buf_info.commandBufferCount = 1;
19326
19327 VkFenceCreateInfo fence_ci = {};
19328 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19329 fence_ci.pNext = nullptr;
19330 fence_ci.flags = 0;
19331
19332 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
19333 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
19334 ASSERT_VK_SUCCESS(err);
19335 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
19336 ASSERT_VK_SUCCESS(err);
19337 }
19338
19339 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
19340 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
19341 // Create empty cmd buffer
19342 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
19343 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19344
19345 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
19346 ASSERT_VK_SUCCESS(err);
19347 err = vkEndCommandBuffer(cmd_buffers[obj]);
19348 ASSERT_VK_SUCCESS(err);
19349
19350 VkSubmitInfo submit_info = {};
19351 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19352 submit_info.commandBufferCount = 1;
19353 submit_info.pCommandBuffers = &cmd_buffers[obj];
19354 // Submit cmd buffer and wait for fence
19355 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
19356 ASSERT_VK_SUCCESS(err);
19357 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
19358 ASSERT_VK_SUCCESS(err);
19359 err = vkResetFences(m_device->device(), 1, &fences[obj]);
19360 ASSERT_VK_SUCCESS(err);
19361 }
19362 }
19363 m_errorMonitor->VerifyNotFound();
19364 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
19365 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
19366 vkDestroyFence(m_device->device(), fences[i], nullptr);
19367 }
19368}
19369// This is a positive test. No errors should be generated.
19370TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019371 TEST_DESCRIPTION(
19372 "Two command buffers, each in a separate QueueSubmit call "
19373 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019374
19375 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019376 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019377
19378 m_errorMonitor->ExpectSuccess();
19379
19380 VkSemaphore semaphore;
19381 VkSemaphoreCreateInfo semaphore_create_info{};
19382 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19383 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19384
19385 VkCommandPool command_pool;
19386 VkCommandPoolCreateInfo pool_create_info{};
19387 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19388 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19389 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19390 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19391
19392 VkCommandBuffer command_buffer[2];
19393 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19394 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19395 command_buffer_allocate_info.commandPool = command_pool;
19396 command_buffer_allocate_info.commandBufferCount = 2;
19397 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19398 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19399
19400 VkQueue queue = VK_NULL_HANDLE;
19401 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19402
19403 {
19404 VkCommandBufferBeginInfo begin_info{};
19405 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19406 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19407
19408 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 -070019409 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019410
19411 VkViewport viewport{};
19412 viewport.maxDepth = 1.0f;
19413 viewport.minDepth = 0.0f;
19414 viewport.width = 512;
19415 viewport.height = 512;
19416 viewport.x = 0;
19417 viewport.y = 0;
19418 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19419 vkEndCommandBuffer(command_buffer[0]);
19420 }
19421 {
19422 VkCommandBufferBeginInfo begin_info{};
19423 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19424 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19425
19426 VkViewport viewport{};
19427 viewport.maxDepth = 1.0f;
19428 viewport.minDepth = 0.0f;
19429 viewport.width = 512;
19430 viewport.height = 512;
19431 viewport.x = 0;
19432 viewport.y = 0;
19433 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19434 vkEndCommandBuffer(command_buffer[1]);
19435 }
19436 {
19437 VkSubmitInfo submit_info{};
19438 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19439 submit_info.commandBufferCount = 1;
19440 submit_info.pCommandBuffers = &command_buffer[0];
19441 submit_info.signalSemaphoreCount = 1;
19442 submit_info.pSignalSemaphores = &semaphore;
19443 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19444 }
19445 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019446 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019447 VkSubmitInfo submit_info{};
19448 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19449 submit_info.commandBufferCount = 1;
19450 submit_info.pCommandBuffers = &command_buffer[1];
19451 submit_info.waitSemaphoreCount = 1;
19452 submit_info.pWaitSemaphores = &semaphore;
19453 submit_info.pWaitDstStageMask = flags;
19454 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19455 }
19456
19457 vkQueueWaitIdle(m_device->m_queue);
19458
19459 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19460 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19461 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19462
19463 m_errorMonitor->VerifyNotFound();
19464}
19465
19466// This is a positive test. No errors should be generated.
19467TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019468 TEST_DESCRIPTION(
19469 "Two command buffers, each in a separate QueueSubmit call "
19470 "submitted on separate queues, the second having a fence"
19471 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019472
19473 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019474 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019475
19476 m_errorMonitor->ExpectSuccess();
19477
19478 VkFence fence;
19479 VkFenceCreateInfo fence_create_info{};
19480 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19481 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19482
19483 VkSemaphore semaphore;
19484 VkSemaphoreCreateInfo semaphore_create_info{};
19485 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19486 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19487
19488 VkCommandPool command_pool;
19489 VkCommandPoolCreateInfo pool_create_info{};
19490 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19491 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19492 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19493 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19494
19495 VkCommandBuffer command_buffer[2];
19496 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19497 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19498 command_buffer_allocate_info.commandPool = command_pool;
19499 command_buffer_allocate_info.commandBufferCount = 2;
19500 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19501 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19502
19503 VkQueue queue = VK_NULL_HANDLE;
19504 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19505
19506 {
19507 VkCommandBufferBeginInfo begin_info{};
19508 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19509 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19510
19511 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 -070019512 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019513
19514 VkViewport viewport{};
19515 viewport.maxDepth = 1.0f;
19516 viewport.minDepth = 0.0f;
19517 viewport.width = 512;
19518 viewport.height = 512;
19519 viewport.x = 0;
19520 viewport.y = 0;
19521 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19522 vkEndCommandBuffer(command_buffer[0]);
19523 }
19524 {
19525 VkCommandBufferBeginInfo begin_info{};
19526 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19527 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19528
19529 VkViewport viewport{};
19530 viewport.maxDepth = 1.0f;
19531 viewport.minDepth = 0.0f;
19532 viewport.width = 512;
19533 viewport.height = 512;
19534 viewport.x = 0;
19535 viewport.y = 0;
19536 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19537 vkEndCommandBuffer(command_buffer[1]);
19538 }
19539 {
19540 VkSubmitInfo submit_info{};
19541 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19542 submit_info.commandBufferCount = 1;
19543 submit_info.pCommandBuffers = &command_buffer[0];
19544 submit_info.signalSemaphoreCount = 1;
19545 submit_info.pSignalSemaphores = &semaphore;
19546 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19547 }
19548 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019549 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019550 VkSubmitInfo submit_info{};
19551 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19552 submit_info.commandBufferCount = 1;
19553 submit_info.pCommandBuffers = &command_buffer[1];
19554 submit_info.waitSemaphoreCount = 1;
19555 submit_info.pWaitSemaphores = &semaphore;
19556 submit_info.pWaitDstStageMask = flags;
19557 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19558 }
19559
19560 vkQueueWaitIdle(m_device->m_queue);
19561
19562 vkDestroyFence(m_device->device(), fence, nullptr);
19563 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19564 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19565 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19566
19567 m_errorMonitor->VerifyNotFound();
19568}
19569
19570// This is a positive test. No errors should be generated.
19571TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019572 TEST_DESCRIPTION(
19573 "Two command buffers, each in a separate QueueSubmit call "
19574 "submitted on separate queues, the second having a fence"
19575 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019576
19577 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019578 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019579
19580 m_errorMonitor->ExpectSuccess();
19581
19582 VkFence fence;
19583 VkFenceCreateInfo fence_create_info{};
19584 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19585 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19586
19587 VkSemaphore semaphore;
19588 VkSemaphoreCreateInfo semaphore_create_info{};
19589 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19590 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19591
19592 VkCommandPool command_pool;
19593 VkCommandPoolCreateInfo pool_create_info{};
19594 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19595 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19596 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19597 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19598
19599 VkCommandBuffer command_buffer[2];
19600 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19601 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19602 command_buffer_allocate_info.commandPool = command_pool;
19603 command_buffer_allocate_info.commandBufferCount = 2;
19604 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19605 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19606
19607 VkQueue queue = VK_NULL_HANDLE;
19608 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19609
19610 {
19611 VkCommandBufferBeginInfo begin_info{};
19612 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19613 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19614
19615 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 -070019616 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019617
19618 VkViewport viewport{};
19619 viewport.maxDepth = 1.0f;
19620 viewport.minDepth = 0.0f;
19621 viewport.width = 512;
19622 viewport.height = 512;
19623 viewport.x = 0;
19624 viewport.y = 0;
19625 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19626 vkEndCommandBuffer(command_buffer[0]);
19627 }
19628 {
19629 VkCommandBufferBeginInfo begin_info{};
19630 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19631 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19632
19633 VkViewport viewport{};
19634 viewport.maxDepth = 1.0f;
19635 viewport.minDepth = 0.0f;
19636 viewport.width = 512;
19637 viewport.height = 512;
19638 viewport.x = 0;
19639 viewport.y = 0;
19640 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19641 vkEndCommandBuffer(command_buffer[1]);
19642 }
19643 {
19644 VkSubmitInfo submit_info{};
19645 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19646 submit_info.commandBufferCount = 1;
19647 submit_info.pCommandBuffers = &command_buffer[0];
19648 submit_info.signalSemaphoreCount = 1;
19649 submit_info.pSignalSemaphores = &semaphore;
19650 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19651 }
19652 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019653 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019654 VkSubmitInfo submit_info{};
19655 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19656 submit_info.commandBufferCount = 1;
19657 submit_info.pCommandBuffers = &command_buffer[1];
19658 submit_info.waitSemaphoreCount = 1;
19659 submit_info.pWaitSemaphores = &semaphore;
19660 submit_info.pWaitDstStageMask = flags;
19661 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19662 }
19663
19664 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19665 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19666
19667 vkDestroyFence(m_device->device(), fence, nullptr);
19668 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19669 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19670 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19671
19672 m_errorMonitor->VerifyNotFound();
19673}
19674
19675TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019676 ASSERT_NO_FATAL_FAILURE(InitState());
19677 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
19678 printf("Test requires two queues, skipping\n");
19679 return;
19680 }
19681
19682 VkResult err;
19683
19684 m_errorMonitor->ExpectSuccess();
19685
19686 VkQueue q0 = m_device->m_queue;
19687 VkQueue q1 = nullptr;
19688 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
19689 ASSERT_NE(q1, nullptr);
19690
19691 // An (empty) command buffer. We must have work in the first submission --
19692 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019693 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019694 VkCommandPool pool;
19695 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
19696 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019697 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
19698 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019699 VkCommandBuffer cb;
19700 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
19701 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019702 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019703 err = vkBeginCommandBuffer(cb, &cbbi);
19704 ASSERT_VK_SUCCESS(err);
19705 err = vkEndCommandBuffer(cb);
19706 ASSERT_VK_SUCCESS(err);
19707
19708 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019709 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019710 VkSemaphore s;
19711 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
19712 ASSERT_VK_SUCCESS(err);
19713
19714 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019715 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019716
19717 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
19718 ASSERT_VK_SUCCESS(err);
19719
19720 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019721 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019722 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019723
19724 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
19725 ASSERT_VK_SUCCESS(err);
19726
19727 // Wait for q0 idle
19728 err = vkQueueWaitIdle(q0);
19729 ASSERT_VK_SUCCESS(err);
19730
19731 // Command buffer should have been completed (it was on q0); reset the pool.
19732 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
19733
19734 m_errorMonitor->VerifyNotFound();
19735
19736 // Force device completely idle and clean up resources
19737 vkDeviceWaitIdle(m_device->device());
19738 vkDestroyCommandPool(m_device->device(), pool, nullptr);
19739 vkDestroySemaphore(m_device->device(), s, nullptr);
19740}
19741
19742// This is a positive test. No errors should be generated.
19743TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019744 TEST_DESCRIPTION(
19745 "Two command buffers, each in a separate QueueSubmit call "
19746 "submitted on separate queues, the second having a fence, "
19747 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019748
19749 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019750 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019751
19752 m_errorMonitor->ExpectSuccess();
19753
19754 ASSERT_NO_FATAL_FAILURE(InitState());
19755 VkFence fence;
19756 VkFenceCreateInfo fence_create_info{};
19757 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19758 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19759
19760 VkSemaphore semaphore;
19761 VkSemaphoreCreateInfo semaphore_create_info{};
19762 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19763 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19764
19765 VkCommandPool command_pool;
19766 VkCommandPoolCreateInfo pool_create_info{};
19767 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19768 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19769 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19770 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19771
19772 VkCommandBuffer command_buffer[2];
19773 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19774 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19775 command_buffer_allocate_info.commandPool = command_pool;
19776 command_buffer_allocate_info.commandBufferCount = 2;
19777 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19778 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19779
19780 VkQueue queue = VK_NULL_HANDLE;
19781 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19782
19783 {
19784 VkCommandBufferBeginInfo begin_info{};
19785 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19786 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19787
19788 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 -070019789 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019790
19791 VkViewport viewport{};
19792 viewport.maxDepth = 1.0f;
19793 viewport.minDepth = 0.0f;
19794 viewport.width = 512;
19795 viewport.height = 512;
19796 viewport.x = 0;
19797 viewport.y = 0;
19798 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19799 vkEndCommandBuffer(command_buffer[0]);
19800 }
19801 {
19802 VkCommandBufferBeginInfo begin_info{};
19803 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19804 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19805
19806 VkViewport viewport{};
19807 viewport.maxDepth = 1.0f;
19808 viewport.minDepth = 0.0f;
19809 viewport.width = 512;
19810 viewport.height = 512;
19811 viewport.x = 0;
19812 viewport.y = 0;
19813 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19814 vkEndCommandBuffer(command_buffer[1]);
19815 }
19816 {
19817 VkSubmitInfo submit_info{};
19818 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19819 submit_info.commandBufferCount = 1;
19820 submit_info.pCommandBuffers = &command_buffer[0];
19821 submit_info.signalSemaphoreCount = 1;
19822 submit_info.pSignalSemaphores = &semaphore;
19823 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19824 }
19825 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019826 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019827 VkSubmitInfo submit_info{};
19828 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19829 submit_info.commandBufferCount = 1;
19830 submit_info.pCommandBuffers = &command_buffer[1];
19831 submit_info.waitSemaphoreCount = 1;
19832 submit_info.pWaitSemaphores = &semaphore;
19833 submit_info.pWaitDstStageMask = flags;
19834 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19835 }
19836
19837 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19838
19839 vkDestroyFence(m_device->device(), fence, nullptr);
19840 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19841 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19842 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19843
19844 m_errorMonitor->VerifyNotFound();
19845}
19846
19847// This is a positive test. No errors should be generated.
19848TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019849 TEST_DESCRIPTION(
19850 "Two command buffers, each in a separate QueueSubmit call "
19851 "on the same queue, sharing a signal/wait semaphore, the "
19852 "second having a fence, "
19853 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019854
19855 m_errorMonitor->ExpectSuccess();
19856
19857 ASSERT_NO_FATAL_FAILURE(InitState());
19858 VkFence fence;
19859 VkFenceCreateInfo fence_create_info{};
19860 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19861 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19862
19863 VkSemaphore semaphore;
19864 VkSemaphoreCreateInfo semaphore_create_info{};
19865 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19866 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19867
19868 VkCommandPool command_pool;
19869 VkCommandPoolCreateInfo pool_create_info{};
19870 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19871 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19872 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19873 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19874
19875 VkCommandBuffer command_buffer[2];
19876 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19877 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19878 command_buffer_allocate_info.commandPool = command_pool;
19879 command_buffer_allocate_info.commandBufferCount = 2;
19880 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19881 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19882
19883 {
19884 VkCommandBufferBeginInfo begin_info{};
19885 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19886 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19887
19888 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 -070019889 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019890
19891 VkViewport viewport{};
19892 viewport.maxDepth = 1.0f;
19893 viewport.minDepth = 0.0f;
19894 viewport.width = 512;
19895 viewport.height = 512;
19896 viewport.x = 0;
19897 viewport.y = 0;
19898 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19899 vkEndCommandBuffer(command_buffer[0]);
19900 }
19901 {
19902 VkCommandBufferBeginInfo begin_info{};
19903 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19904 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19905
19906 VkViewport viewport{};
19907 viewport.maxDepth = 1.0f;
19908 viewport.minDepth = 0.0f;
19909 viewport.width = 512;
19910 viewport.height = 512;
19911 viewport.x = 0;
19912 viewport.y = 0;
19913 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19914 vkEndCommandBuffer(command_buffer[1]);
19915 }
19916 {
19917 VkSubmitInfo submit_info{};
19918 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19919 submit_info.commandBufferCount = 1;
19920 submit_info.pCommandBuffers = &command_buffer[0];
19921 submit_info.signalSemaphoreCount = 1;
19922 submit_info.pSignalSemaphores = &semaphore;
19923 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19924 }
19925 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019926 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019927 VkSubmitInfo submit_info{};
19928 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19929 submit_info.commandBufferCount = 1;
19930 submit_info.pCommandBuffers = &command_buffer[1];
19931 submit_info.waitSemaphoreCount = 1;
19932 submit_info.pWaitSemaphores = &semaphore;
19933 submit_info.pWaitDstStageMask = flags;
19934 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19935 }
19936
19937 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19938
19939 vkDestroyFence(m_device->device(), fence, nullptr);
19940 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19941 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19942 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19943
19944 m_errorMonitor->VerifyNotFound();
19945}
19946
19947// This is a positive test. No errors should be generated.
19948TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019949 TEST_DESCRIPTION(
19950 "Two command buffers, each in a separate QueueSubmit call "
19951 "on the same queue, no fences, followed by a third QueueSubmit with NO "
19952 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019953
19954 m_errorMonitor->ExpectSuccess();
19955
19956 ASSERT_NO_FATAL_FAILURE(InitState());
19957 VkFence fence;
19958 VkFenceCreateInfo fence_create_info{};
19959 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19960 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19961
19962 VkCommandPool command_pool;
19963 VkCommandPoolCreateInfo pool_create_info{};
19964 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19965 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19966 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19967 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19968
19969 VkCommandBuffer command_buffer[2];
19970 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19971 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19972 command_buffer_allocate_info.commandPool = command_pool;
19973 command_buffer_allocate_info.commandBufferCount = 2;
19974 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19975 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19976
19977 {
19978 VkCommandBufferBeginInfo begin_info{};
19979 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19980 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19981
19982 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 -070019983 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019984
19985 VkViewport viewport{};
19986 viewport.maxDepth = 1.0f;
19987 viewport.minDepth = 0.0f;
19988 viewport.width = 512;
19989 viewport.height = 512;
19990 viewport.x = 0;
19991 viewport.y = 0;
19992 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19993 vkEndCommandBuffer(command_buffer[0]);
19994 }
19995 {
19996 VkCommandBufferBeginInfo begin_info{};
19997 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19998 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19999
20000 VkViewport viewport{};
20001 viewport.maxDepth = 1.0f;
20002 viewport.minDepth = 0.0f;
20003 viewport.width = 512;
20004 viewport.height = 512;
20005 viewport.x = 0;
20006 viewport.y = 0;
20007 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
20008 vkEndCommandBuffer(command_buffer[1]);
20009 }
20010 {
20011 VkSubmitInfo submit_info{};
20012 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20013 submit_info.commandBufferCount = 1;
20014 submit_info.pCommandBuffers = &command_buffer[0];
20015 submit_info.signalSemaphoreCount = 0;
20016 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
20017 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20018 }
20019 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020020 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020021 VkSubmitInfo submit_info{};
20022 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20023 submit_info.commandBufferCount = 1;
20024 submit_info.pCommandBuffers = &command_buffer[1];
20025 submit_info.waitSemaphoreCount = 0;
20026 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
20027 submit_info.pWaitDstStageMask = flags;
20028 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20029 }
20030
20031 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
20032
20033 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20034 ASSERT_VK_SUCCESS(err);
20035
20036 vkDestroyFence(m_device->device(), fence, nullptr);
20037 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
20038 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20039
20040 m_errorMonitor->VerifyNotFound();
20041}
20042
20043// This is a positive test. No errors should be generated.
20044TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020045 TEST_DESCRIPTION(
20046 "Two command buffers, each in a separate QueueSubmit call "
20047 "on the same queue, the second having a fence, followed "
20048 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020049
20050 m_errorMonitor->ExpectSuccess();
20051
20052 ASSERT_NO_FATAL_FAILURE(InitState());
20053 VkFence fence;
20054 VkFenceCreateInfo fence_create_info{};
20055 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20056 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
20057
20058 VkCommandPool command_pool;
20059 VkCommandPoolCreateInfo pool_create_info{};
20060 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20061 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20062 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20063 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20064
20065 VkCommandBuffer command_buffer[2];
20066 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20067 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20068 command_buffer_allocate_info.commandPool = command_pool;
20069 command_buffer_allocate_info.commandBufferCount = 2;
20070 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20071 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20072
20073 {
20074 VkCommandBufferBeginInfo begin_info{};
20075 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20076 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20077
20078 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 -070020079 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020080
20081 VkViewport viewport{};
20082 viewport.maxDepth = 1.0f;
20083 viewport.minDepth = 0.0f;
20084 viewport.width = 512;
20085 viewport.height = 512;
20086 viewport.x = 0;
20087 viewport.y = 0;
20088 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
20089 vkEndCommandBuffer(command_buffer[0]);
20090 }
20091 {
20092 VkCommandBufferBeginInfo begin_info{};
20093 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20094 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20095
20096 VkViewport viewport{};
20097 viewport.maxDepth = 1.0f;
20098 viewport.minDepth = 0.0f;
20099 viewport.width = 512;
20100 viewport.height = 512;
20101 viewport.x = 0;
20102 viewport.y = 0;
20103 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
20104 vkEndCommandBuffer(command_buffer[1]);
20105 }
20106 {
20107 VkSubmitInfo submit_info{};
20108 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20109 submit_info.commandBufferCount = 1;
20110 submit_info.pCommandBuffers = &command_buffer[0];
20111 submit_info.signalSemaphoreCount = 0;
20112 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
20113 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20114 }
20115 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020116 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020117 VkSubmitInfo submit_info{};
20118 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20119 submit_info.commandBufferCount = 1;
20120 submit_info.pCommandBuffers = &command_buffer[1];
20121 submit_info.waitSemaphoreCount = 0;
20122 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
20123 submit_info.pWaitDstStageMask = flags;
20124 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
20125 }
20126
20127 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20128
20129 vkDestroyFence(m_device->device(), fence, nullptr);
20130 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
20131 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20132
20133 m_errorMonitor->VerifyNotFound();
20134}
20135
20136// This is a positive test. No errors should be generated.
20137TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020138 TEST_DESCRIPTION(
20139 "Two command buffers each in a separate SubmitInfo sent in a single "
20140 "QueueSubmit call followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020141 ASSERT_NO_FATAL_FAILURE(InitState());
20142
20143 m_errorMonitor->ExpectSuccess();
20144
20145 VkFence fence;
20146 VkFenceCreateInfo fence_create_info{};
20147 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20148 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
20149
20150 VkSemaphore semaphore;
20151 VkSemaphoreCreateInfo semaphore_create_info{};
20152 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
20153 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
20154
20155 VkCommandPool command_pool;
20156 VkCommandPoolCreateInfo pool_create_info{};
20157 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20158 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20159 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20160 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20161
20162 VkCommandBuffer command_buffer[2];
20163 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20164 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20165 command_buffer_allocate_info.commandPool = command_pool;
20166 command_buffer_allocate_info.commandBufferCount = 2;
20167 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20168 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20169
20170 {
20171 VkCommandBufferBeginInfo begin_info{};
20172 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20173 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20174
20175 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 -070020176 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020177
20178 VkViewport viewport{};
20179 viewport.maxDepth = 1.0f;
20180 viewport.minDepth = 0.0f;
20181 viewport.width = 512;
20182 viewport.height = 512;
20183 viewport.x = 0;
20184 viewport.y = 0;
20185 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
20186 vkEndCommandBuffer(command_buffer[0]);
20187 }
20188 {
20189 VkCommandBufferBeginInfo begin_info{};
20190 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20191 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20192
20193 VkViewport viewport{};
20194 viewport.maxDepth = 1.0f;
20195 viewport.minDepth = 0.0f;
20196 viewport.width = 512;
20197 viewport.height = 512;
20198 viewport.x = 0;
20199 viewport.y = 0;
20200 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
20201 vkEndCommandBuffer(command_buffer[1]);
20202 }
20203 {
20204 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020205 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020206
20207 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20208 submit_info[0].pNext = NULL;
20209 submit_info[0].commandBufferCount = 1;
20210 submit_info[0].pCommandBuffers = &command_buffer[0];
20211 submit_info[0].signalSemaphoreCount = 1;
20212 submit_info[0].pSignalSemaphores = &semaphore;
20213 submit_info[0].waitSemaphoreCount = 0;
20214 submit_info[0].pWaitSemaphores = NULL;
20215 submit_info[0].pWaitDstStageMask = 0;
20216
20217 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20218 submit_info[1].pNext = NULL;
20219 submit_info[1].commandBufferCount = 1;
20220 submit_info[1].pCommandBuffers = &command_buffer[1];
20221 submit_info[1].waitSemaphoreCount = 1;
20222 submit_info[1].pWaitSemaphores = &semaphore;
20223 submit_info[1].pWaitDstStageMask = flags;
20224 submit_info[1].signalSemaphoreCount = 0;
20225 submit_info[1].pSignalSemaphores = NULL;
20226 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
20227 }
20228
20229 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20230
20231 vkDestroyFence(m_device->device(), fence, nullptr);
20232 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
20233 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20234 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
20235
20236 m_errorMonitor->VerifyNotFound();
20237}
20238
20239TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
20240 m_errorMonitor->ExpectSuccess();
20241
20242 ASSERT_NO_FATAL_FAILURE(InitState());
20243 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20244
Tony Barbour552f6c02016-12-21 14:34:07 -070020245 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020246
20247 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
20248 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
20249 m_errorMonitor->VerifyNotFound();
20250 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
20251 m_errorMonitor->VerifyNotFound();
20252 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
20253 m_errorMonitor->VerifyNotFound();
20254
20255 m_commandBuffer->EndCommandBuffer();
20256 m_errorMonitor->VerifyNotFound();
20257}
20258
20259TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020260 TEST_DESCRIPTION(
20261 "Positive test where we create a renderpass with an "
20262 "attachment that uses LOAD_OP_CLEAR, the first subpass "
20263 "has a valid layout, and a second subpass then uses a "
20264 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020265 m_errorMonitor->ExpectSuccess();
20266 ASSERT_NO_FATAL_FAILURE(InitState());
20267
20268 VkAttachmentReference attach[2] = {};
20269 attach[0].attachment = 0;
20270 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20271 attach[1].attachment = 0;
20272 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
20273 VkSubpassDescription subpasses[2] = {};
20274 // First subpass clears DS attach on load
20275 subpasses[0].pDepthStencilAttachment = &attach[0];
20276 // 2nd subpass reads in DS as input attachment
20277 subpasses[1].inputAttachmentCount = 1;
20278 subpasses[1].pInputAttachments = &attach[1];
20279 VkAttachmentDescription attach_desc = {};
20280 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
20281 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
20282 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
20283 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20284 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20285 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20286 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20287 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
20288 VkRenderPassCreateInfo rpci = {};
20289 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20290 rpci.attachmentCount = 1;
20291 rpci.pAttachments = &attach_desc;
20292 rpci.subpassCount = 2;
20293 rpci.pSubpasses = subpasses;
20294
20295 // Now create RenderPass and verify no errors
20296 VkRenderPass rp;
20297 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
20298 m_errorMonitor->VerifyNotFound();
20299
20300 vkDestroyRenderPass(m_device->device(), rp, NULL);
20301}
20302
20303TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020304 TEST_DESCRIPTION(
20305 "Test that pipeline validation accepts matrices passed "
20306 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020307 m_errorMonitor->ExpectSuccess();
20308
20309 ASSERT_NO_FATAL_FAILURE(InitState());
20310 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20311
20312 VkVertexInputBindingDescription input_binding;
20313 memset(&input_binding, 0, sizeof(input_binding));
20314
20315 VkVertexInputAttributeDescription input_attribs[2];
20316 memset(input_attribs, 0, sizeof(input_attribs));
20317
20318 for (int i = 0; i < 2; i++) {
20319 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
20320 input_attribs[i].location = i;
20321 }
20322
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020323 char const *vsSource =
20324 "#version 450\n"
20325 "\n"
20326 "layout(location=0) in mat2x4 x;\n"
20327 "out gl_PerVertex {\n"
20328 " vec4 gl_Position;\n"
20329 "};\n"
20330 "void main(){\n"
20331 " gl_Position = x[0] + x[1];\n"
20332 "}\n";
20333 char const *fsSource =
20334 "#version 450\n"
20335 "\n"
20336 "layout(location=0) out vec4 color;\n"
20337 "void main(){\n"
20338 " color = vec4(1);\n"
20339 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020340
20341 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20342 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20343
20344 VkPipelineObj pipe(m_device);
20345 pipe.AddColorAttachment();
20346 pipe.AddShader(&vs);
20347 pipe.AddShader(&fs);
20348
20349 pipe.AddVertexInputBindings(&input_binding, 1);
20350 pipe.AddVertexInputAttribs(input_attribs, 2);
20351
20352 VkDescriptorSetObj descriptorSet(m_device);
20353 descriptorSet.AppendDummy();
20354 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20355
20356 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20357
20358 /* expect success */
20359 m_errorMonitor->VerifyNotFound();
20360}
20361
20362TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
20363 m_errorMonitor->ExpectSuccess();
20364
20365 ASSERT_NO_FATAL_FAILURE(InitState());
20366 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20367
20368 VkVertexInputBindingDescription input_binding;
20369 memset(&input_binding, 0, sizeof(input_binding));
20370
20371 VkVertexInputAttributeDescription input_attribs[2];
20372 memset(input_attribs, 0, sizeof(input_attribs));
20373
20374 for (int i = 0; i < 2; i++) {
20375 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
20376 input_attribs[i].location = i;
20377 }
20378
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020379 char const *vsSource =
20380 "#version 450\n"
20381 "\n"
20382 "layout(location=0) in vec4 x[2];\n"
20383 "out gl_PerVertex {\n"
20384 " vec4 gl_Position;\n"
20385 "};\n"
20386 "void main(){\n"
20387 " gl_Position = x[0] + x[1];\n"
20388 "}\n";
20389 char const *fsSource =
20390 "#version 450\n"
20391 "\n"
20392 "layout(location=0) out vec4 color;\n"
20393 "void main(){\n"
20394 " color = vec4(1);\n"
20395 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020396
20397 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20398 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20399
20400 VkPipelineObj pipe(m_device);
20401 pipe.AddColorAttachment();
20402 pipe.AddShader(&vs);
20403 pipe.AddShader(&fs);
20404
20405 pipe.AddVertexInputBindings(&input_binding, 1);
20406 pipe.AddVertexInputAttribs(input_attribs, 2);
20407
20408 VkDescriptorSetObj descriptorSet(m_device);
20409 descriptorSet.AppendDummy();
20410 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20411
20412 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20413
20414 m_errorMonitor->VerifyNotFound();
20415}
20416
20417TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020418 TEST_DESCRIPTION(
20419 "Test that pipeline validation accepts consuming a vertex attribute "
20420 "through multiple vertex shader inputs, each consuming a different "
20421 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020422 m_errorMonitor->ExpectSuccess();
20423
20424 ASSERT_NO_FATAL_FAILURE(InitState());
20425 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20426
20427 VkVertexInputBindingDescription input_binding;
20428 memset(&input_binding, 0, sizeof(input_binding));
20429
20430 VkVertexInputAttributeDescription input_attribs[3];
20431 memset(input_attribs, 0, sizeof(input_attribs));
20432
20433 for (int i = 0; i < 3; i++) {
20434 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
20435 input_attribs[i].location = i;
20436 }
20437
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020438 char const *vsSource =
20439 "#version 450\n"
20440 "\n"
20441 "layout(location=0) in vec4 x;\n"
20442 "layout(location=1) in vec3 y1;\n"
20443 "layout(location=1, component=3) in float y2;\n"
20444 "layout(location=2) in vec4 z;\n"
20445 "out gl_PerVertex {\n"
20446 " vec4 gl_Position;\n"
20447 "};\n"
20448 "void main(){\n"
20449 " gl_Position = x + vec4(y1, y2) + z;\n"
20450 "}\n";
20451 char const *fsSource =
20452 "#version 450\n"
20453 "\n"
20454 "layout(location=0) out vec4 color;\n"
20455 "void main(){\n"
20456 " color = vec4(1);\n"
20457 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020458
20459 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20460 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20461
20462 VkPipelineObj pipe(m_device);
20463 pipe.AddColorAttachment();
20464 pipe.AddShader(&vs);
20465 pipe.AddShader(&fs);
20466
20467 pipe.AddVertexInputBindings(&input_binding, 1);
20468 pipe.AddVertexInputAttribs(input_attribs, 3);
20469
20470 VkDescriptorSetObj descriptorSet(m_device);
20471 descriptorSet.AppendDummy();
20472 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20473
20474 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20475
20476 m_errorMonitor->VerifyNotFound();
20477}
20478
20479TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
20480 m_errorMonitor->ExpectSuccess();
20481
20482 ASSERT_NO_FATAL_FAILURE(InitState());
20483 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20484
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020485 char const *vsSource =
20486 "#version 450\n"
20487 "out gl_PerVertex {\n"
20488 " vec4 gl_Position;\n"
20489 "};\n"
20490 "void main(){\n"
20491 " gl_Position = vec4(0);\n"
20492 "}\n";
20493 char const *fsSource =
20494 "#version 450\n"
20495 "\n"
20496 "layout(location=0) out vec4 color;\n"
20497 "void main(){\n"
20498 " color = vec4(1);\n"
20499 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020500
20501 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20502 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20503
20504 VkPipelineObj pipe(m_device);
20505 pipe.AddColorAttachment();
20506 pipe.AddShader(&vs);
20507 pipe.AddShader(&fs);
20508
20509 VkDescriptorSetObj descriptorSet(m_device);
20510 descriptorSet.AppendDummy();
20511 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20512
20513 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20514
20515 m_errorMonitor->VerifyNotFound();
20516}
20517
20518TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020519 TEST_DESCRIPTION(
20520 "Test that pipeline validation accepts the relaxed type matching rules "
20521 "set out in 14.1.3: fundamental type must match, and producer side must "
20522 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020523 m_errorMonitor->ExpectSuccess();
20524
20525 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
20526
20527 ASSERT_NO_FATAL_FAILURE(InitState());
20528 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20529
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020530 char const *vsSource =
20531 "#version 450\n"
20532 "out gl_PerVertex {\n"
20533 " vec4 gl_Position;\n"
20534 "};\n"
20535 "layout(location=0) out vec3 x;\n"
20536 "layout(location=1) out ivec3 y;\n"
20537 "layout(location=2) out vec3 z;\n"
20538 "void main(){\n"
20539 " gl_Position = vec4(0);\n"
20540 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
20541 "}\n";
20542 char const *fsSource =
20543 "#version 450\n"
20544 "\n"
20545 "layout(location=0) out vec4 color;\n"
20546 "layout(location=0) in float x;\n"
20547 "layout(location=1) flat in int y;\n"
20548 "layout(location=2) in vec2 z;\n"
20549 "void main(){\n"
20550 " color = vec4(1 + x + y + z.x);\n"
20551 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020552
20553 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20554 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20555
20556 VkPipelineObj pipe(m_device);
20557 pipe.AddColorAttachment();
20558 pipe.AddShader(&vs);
20559 pipe.AddShader(&fs);
20560
20561 VkDescriptorSetObj descriptorSet(m_device);
20562 descriptorSet.AppendDummy();
20563 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20564
20565 VkResult err = VK_SUCCESS;
20566 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20567 ASSERT_VK_SUCCESS(err);
20568
20569 m_errorMonitor->VerifyNotFound();
20570}
20571
20572TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020573 TEST_DESCRIPTION(
20574 "Test that pipeline validation accepts per-vertex variables "
20575 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020576 m_errorMonitor->ExpectSuccess();
20577
20578 ASSERT_NO_FATAL_FAILURE(InitState());
20579 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20580
20581 if (!m_device->phy().features().tessellationShader) {
20582 printf("Device does not support tessellation shaders; skipped.\n");
20583 return;
20584 }
20585
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020586 char const *vsSource =
20587 "#version 450\n"
20588 "void main(){}\n";
20589 char const *tcsSource =
20590 "#version 450\n"
20591 "layout(location=0) out int x[];\n"
20592 "layout(vertices=3) out;\n"
20593 "void main(){\n"
20594 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
20595 " gl_TessLevelInner[0] = 1;\n"
20596 " x[gl_InvocationID] = gl_InvocationID;\n"
20597 "}\n";
20598 char const *tesSource =
20599 "#version 450\n"
20600 "layout(triangles, equal_spacing, cw) in;\n"
20601 "layout(location=0) in int x[];\n"
20602 "out gl_PerVertex { vec4 gl_Position; };\n"
20603 "void main(){\n"
20604 " gl_Position.xyz = gl_TessCoord;\n"
20605 " gl_Position.w = x[0] + x[1] + x[2];\n"
20606 "}\n";
20607 char const *fsSource =
20608 "#version 450\n"
20609 "layout(location=0) out vec4 color;\n"
20610 "void main(){\n"
20611 " color = vec4(1);\n"
20612 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020613
20614 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20615 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
20616 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
20617 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20618
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020619 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
20620 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020621
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020622 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020623
20624 VkPipelineObj pipe(m_device);
20625 pipe.SetInputAssembly(&iasci);
20626 pipe.SetTessellation(&tsci);
20627 pipe.AddColorAttachment();
20628 pipe.AddShader(&vs);
20629 pipe.AddShader(&tcs);
20630 pipe.AddShader(&tes);
20631 pipe.AddShader(&fs);
20632
20633 VkDescriptorSetObj descriptorSet(m_device);
20634 descriptorSet.AppendDummy();
20635 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20636
20637 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20638
20639 m_errorMonitor->VerifyNotFound();
20640}
20641
20642TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020643 TEST_DESCRIPTION(
20644 "Test that pipeline validation accepts a user-defined "
20645 "interface block passed into the geometry shader. This "
20646 "is interesting because the 'extra' array level is not "
20647 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020648 m_errorMonitor->ExpectSuccess();
20649
20650 ASSERT_NO_FATAL_FAILURE(InitState());
20651 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20652
20653 if (!m_device->phy().features().geometryShader) {
20654 printf("Device does not support geometry shaders; skipped.\n");
20655 return;
20656 }
20657
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020658 char const *vsSource =
20659 "#version 450\n"
20660 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
20661 "void main(){\n"
20662 " vs_out.x = vec4(1);\n"
20663 "}\n";
20664 char const *gsSource =
20665 "#version 450\n"
20666 "layout(triangles) in;\n"
20667 "layout(triangle_strip, max_vertices=3) out;\n"
20668 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
20669 "out gl_PerVertex { vec4 gl_Position; };\n"
20670 "void main() {\n"
20671 " gl_Position = gs_in[0].x;\n"
20672 " EmitVertex();\n"
20673 "}\n";
20674 char const *fsSource =
20675 "#version 450\n"
20676 "layout(location=0) out vec4 color;\n"
20677 "void main(){\n"
20678 " color = vec4(1);\n"
20679 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020680
20681 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20682 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
20683 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20684
20685 VkPipelineObj pipe(m_device);
20686 pipe.AddColorAttachment();
20687 pipe.AddShader(&vs);
20688 pipe.AddShader(&gs);
20689 pipe.AddShader(&fs);
20690
20691 VkDescriptorSetObj descriptorSet(m_device);
20692 descriptorSet.AppendDummy();
20693 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20694
20695 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20696
20697 m_errorMonitor->VerifyNotFound();
20698}
20699
20700TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020701 TEST_DESCRIPTION(
20702 "Test that pipeline validation accepts basic use of 64bit vertex "
20703 "attributes. This is interesting because they consume multiple "
20704 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020705 m_errorMonitor->ExpectSuccess();
20706
20707 ASSERT_NO_FATAL_FAILURE(InitState());
20708 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20709
20710 if (!m_device->phy().features().shaderFloat64) {
20711 printf("Device does not support 64bit vertex attributes; skipped.\n");
20712 return;
20713 }
20714
20715 VkVertexInputBindingDescription input_bindings[1];
20716 memset(input_bindings, 0, sizeof(input_bindings));
20717
20718 VkVertexInputAttributeDescription input_attribs[4];
20719 memset(input_attribs, 0, sizeof(input_attribs));
20720 input_attribs[0].location = 0;
20721 input_attribs[0].offset = 0;
20722 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
20723 input_attribs[1].location = 2;
20724 input_attribs[1].offset = 32;
20725 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
20726 input_attribs[2].location = 4;
20727 input_attribs[2].offset = 64;
20728 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
20729 input_attribs[3].location = 6;
20730 input_attribs[3].offset = 96;
20731 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
20732
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020733 char const *vsSource =
20734 "#version 450\n"
20735 "\n"
20736 "layout(location=0) in dmat4 x;\n"
20737 "out gl_PerVertex {\n"
20738 " vec4 gl_Position;\n"
20739 "};\n"
20740 "void main(){\n"
20741 " gl_Position = vec4(x[0][0]);\n"
20742 "}\n";
20743 char const *fsSource =
20744 "#version 450\n"
20745 "\n"
20746 "layout(location=0) out vec4 color;\n"
20747 "void main(){\n"
20748 " color = vec4(1);\n"
20749 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020750
20751 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20752 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20753
20754 VkPipelineObj pipe(m_device);
20755 pipe.AddColorAttachment();
20756 pipe.AddShader(&vs);
20757 pipe.AddShader(&fs);
20758
20759 pipe.AddVertexInputBindings(input_bindings, 1);
20760 pipe.AddVertexInputAttribs(input_attribs, 4);
20761
20762 VkDescriptorSetObj descriptorSet(m_device);
20763 descriptorSet.AppendDummy();
20764 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20765
20766 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20767
20768 m_errorMonitor->VerifyNotFound();
20769}
20770
20771TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
20772 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
20773 m_errorMonitor->ExpectSuccess();
20774
20775 ASSERT_NO_FATAL_FAILURE(InitState());
20776
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020777 char const *vsSource =
20778 "#version 450\n"
20779 "\n"
20780 "out gl_PerVertex {\n"
20781 " vec4 gl_Position;\n"
20782 "};\n"
20783 "void main(){\n"
20784 " gl_Position = vec4(1);\n"
20785 "}\n";
20786 char const *fsSource =
20787 "#version 450\n"
20788 "\n"
20789 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
20790 "layout(location=0) out vec4 color;\n"
20791 "void main() {\n"
20792 " color = subpassLoad(x);\n"
20793 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020794
20795 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20796 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20797
20798 VkPipelineObj pipe(m_device);
20799 pipe.AddShader(&vs);
20800 pipe.AddShader(&fs);
20801 pipe.AddColorAttachment();
20802 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20803
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020804 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
20805 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020806 VkDescriptorSetLayout dsl;
20807 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
20808 ASSERT_VK_SUCCESS(err);
20809
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020810 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020811 VkPipelineLayout pl;
20812 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
20813 ASSERT_VK_SUCCESS(err);
20814
20815 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020816 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
20817 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20818 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
20819 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
20820 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 -060020821 };
20822 VkAttachmentReference color = {
20823 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20824 };
20825 VkAttachmentReference input = {
20826 1, VK_IMAGE_LAYOUT_GENERAL,
20827 };
20828
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020829 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020830
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020831 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020832 VkRenderPass rp;
20833 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20834 ASSERT_VK_SUCCESS(err);
20835
20836 // should be OK. would go wrong here if it's going to...
20837 pipe.CreateVKPipeline(pl, rp);
20838
20839 m_errorMonitor->VerifyNotFound();
20840
20841 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20842 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
20843 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
20844}
20845
20846TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020847 TEST_DESCRIPTION(
20848 "Test that pipeline validation accepts a compute pipeline which declares a "
20849 "descriptor-backed resource which is not provided, but the shader does not "
20850 "statically use it. This is interesting because it requires compute pipelines "
20851 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020852 m_errorMonitor->ExpectSuccess();
20853
20854 ASSERT_NO_FATAL_FAILURE(InitState());
20855
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020856 char const *csSource =
20857 "#version 450\n"
20858 "\n"
20859 "layout(local_size_x=1) in;\n"
20860 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
20861 "void main(){\n"
20862 " // x is not used.\n"
20863 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020864
20865 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
20866
20867 VkDescriptorSetObj descriptorSet(m_device);
20868 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20869
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020870 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
20871 nullptr,
20872 0,
20873 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
20874 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
20875 descriptorSet.GetPipelineLayout(),
20876 VK_NULL_HANDLE,
20877 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020878
20879 VkPipeline pipe;
20880 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
20881
20882 m_errorMonitor->VerifyNotFound();
20883
20884 if (err == VK_SUCCESS) {
20885 vkDestroyPipeline(m_device->device(), pipe, nullptr);
20886 }
20887}
20888
20889TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020890 TEST_DESCRIPTION(
20891 "Test that pipeline validation accepts a shader consuming only the "
20892 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020893 m_errorMonitor->ExpectSuccess();
20894
20895 ASSERT_NO_FATAL_FAILURE(InitState());
20896
20897 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020898 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
20899 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
20900 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020901 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020902 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020903 VkDescriptorSetLayout dsl;
20904 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
20905 ASSERT_VK_SUCCESS(err);
20906
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020907 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020908 VkPipelineLayout pl;
20909 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
20910 ASSERT_VK_SUCCESS(err);
20911
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020912 char const *csSource =
20913 "#version 450\n"
20914 "\n"
20915 "layout(local_size_x=1) in;\n"
20916 "layout(set=0, binding=0) uniform sampler s;\n"
20917 "layout(set=0, binding=1) uniform texture2D t;\n"
20918 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
20919 "void main() {\n"
20920 " x = texture(sampler2D(t, s), vec2(0));\n"
20921 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020922 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
20923
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020924 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
20925 nullptr,
20926 0,
20927 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
20928 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
20929 pl,
20930 VK_NULL_HANDLE,
20931 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020932
20933 VkPipeline pipe;
20934 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
20935
20936 m_errorMonitor->VerifyNotFound();
20937
20938 if (err == VK_SUCCESS) {
20939 vkDestroyPipeline(m_device->device(), pipe, nullptr);
20940 }
20941
20942 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
20943 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
20944}
20945
20946TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020947 TEST_DESCRIPTION(
20948 "Test that pipeline validation accepts a shader consuming only the "
20949 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020950 m_errorMonitor->ExpectSuccess();
20951
20952 ASSERT_NO_FATAL_FAILURE(InitState());
20953
20954 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020955 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
20956 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
20957 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020958 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020959 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020960 VkDescriptorSetLayout dsl;
20961 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
20962 ASSERT_VK_SUCCESS(err);
20963
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020964 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020965 VkPipelineLayout pl;
20966 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
20967 ASSERT_VK_SUCCESS(err);
20968
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020969 char const *csSource =
20970 "#version 450\n"
20971 "\n"
20972 "layout(local_size_x=1) in;\n"
20973 "layout(set=0, binding=0) uniform texture2D t;\n"
20974 "layout(set=0, binding=1) uniform sampler s;\n"
20975 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
20976 "void main() {\n"
20977 " x = texture(sampler2D(t, s), vec2(0));\n"
20978 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020979 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
20980
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020981 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
20982 nullptr,
20983 0,
20984 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
20985 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
20986 pl,
20987 VK_NULL_HANDLE,
20988 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020989
20990 VkPipeline pipe;
20991 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
20992
20993 m_errorMonitor->VerifyNotFound();
20994
20995 if (err == VK_SUCCESS) {
20996 vkDestroyPipeline(m_device->device(), pipe, nullptr);
20997 }
20998
20999 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
21000 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
21001}
21002
21003TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021004 TEST_DESCRIPTION(
21005 "Test that pipeline validation accepts a shader consuming "
21006 "both the sampler and the image of a combined image+sampler "
21007 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021008 m_errorMonitor->ExpectSuccess();
21009
21010 ASSERT_NO_FATAL_FAILURE(InitState());
21011
21012 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021013 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
21014 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021015 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021016 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021017 VkDescriptorSetLayout dsl;
21018 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
21019 ASSERT_VK_SUCCESS(err);
21020
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021021 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021022 VkPipelineLayout pl;
21023 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
21024 ASSERT_VK_SUCCESS(err);
21025
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021026 char const *csSource =
21027 "#version 450\n"
21028 "\n"
21029 "layout(local_size_x=1) in;\n"
21030 "layout(set=0, binding=0) uniform texture2D t;\n"
21031 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
21032 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
21033 "void main() {\n"
21034 " x = texture(sampler2D(t, s), vec2(0));\n"
21035 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021036 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
21037
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021038 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
21039 nullptr,
21040 0,
21041 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
21042 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
21043 pl,
21044 VK_NULL_HANDLE,
21045 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021046
21047 VkPipeline pipe;
21048 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
21049
21050 m_errorMonitor->VerifyNotFound();
21051
21052 if (err == VK_SUCCESS) {
21053 vkDestroyPipeline(m_device->device(), pipe, nullptr);
21054 }
21055
21056 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
21057 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
21058}
21059
21060TEST_F(VkPositiveLayerTest, ValidStructPNext) {
21061 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
21062
21063 ASSERT_NO_FATAL_FAILURE(InitState());
21064
21065 // Positive test to check parameter_validation and unique_objects support
21066 // for NV_dedicated_allocation
21067 uint32_t extension_count = 0;
21068 bool supports_nv_dedicated_allocation = false;
21069 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
21070 ASSERT_VK_SUCCESS(err);
21071
21072 if (extension_count > 0) {
21073 std::vector<VkExtensionProperties> available_extensions(extension_count);
21074
21075 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
21076 ASSERT_VK_SUCCESS(err);
21077
21078 for (const auto &extension_props : available_extensions) {
21079 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
21080 supports_nv_dedicated_allocation = true;
21081 }
21082 }
21083 }
21084
21085 if (supports_nv_dedicated_allocation) {
21086 m_errorMonitor->ExpectSuccess();
21087
21088 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
21089 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
21090 dedicated_buffer_create_info.pNext = nullptr;
21091 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
21092
21093 uint32_t queue_family_index = 0;
21094 VkBufferCreateInfo buffer_create_info = {};
21095 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21096 buffer_create_info.pNext = &dedicated_buffer_create_info;
21097 buffer_create_info.size = 1024;
21098 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
21099 buffer_create_info.queueFamilyIndexCount = 1;
21100 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
21101
21102 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070021103 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021104 ASSERT_VK_SUCCESS(err);
21105
21106 VkMemoryRequirements memory_reqs;
21107 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
21108
21109 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
21110 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
21111 dedicated_memory_info.pNext = nullptr;
21112 dedicated_memory_info.buffer = buffer;
21113 dedicated_memory_info.image = VK_NULL_HANDLE;
21114
21115 VkMemoryAllocateInfo memory_info = {};
21116 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21117 memory_info.pNext = &dedicated_memory_info;
21118 memory_info.allocationSize = memory_reqs.size;
21119
21120 bool pass;
21121 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
21122 ASSERT_TRUE(pass);
21123
21124 VkDeviceMemory buffer_memory;
21125 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
21126 ASSERT_VK_SUCCESS(err);
21127
21128 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
21129 ASSERT_VK_SUCCESS(err);
21130
21131 vkDestroyBuffer(m_device->device(), buffer, NULL);
21132 vkFreeMemory(m_device->device(), buffer_memory, NULL);
21133
21134 m_errorMonitor->VerifyNotFound();
21135 }
21136}
21137
21138TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
21139 VkResult err;
21140
21141 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
21142
21143 ASSERT_NO_FATAL_FAILURE(InitState());
21144 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21145
21146 std::vector<const char *> device_extension_names;
21147 auto features = m_device->phy().features();
21148 // Artificially disable support for non-solid fill modes
21149 features.fillModeNonSolid = false;
21150 // The sacrificial device object
21151 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
21152
21153 VkRenderpassObj render_pass(&test_device);
21154
21155 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
21156 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
21157 pipeline_layout_ci.setLayoutCount = 0;
21158 pipeline_layout_ci.pSetLayouts = NULL;
21159
21160 VkPipelineLayout pipeline_layout;
21161 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
21162 ASSERT_VK_SUCCESS(err);
21163
21164 VkPipelineRasterizationStateCreateInfo rs_ci = {};
21165 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
21166 rs_ci.pNext = nullptr;
21167 rs_ci.lineWidth = 1.0f;
21168 rs_ci.rasterizerDiscardEnable = true;
21169
21170 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
21171 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
21172
21173 // Set polygonMode=FILL. No error is expected
21174 m_errorMonitor->ExpectSuccess();
21175 {
21176 VkPipelineObj pipe(&test_device);
21177 pipe.AddShader(&vs);
21178 pipe.AddShader(&fs);
21179 pipe.AddColorAttachment();
21180 // Set polygonMode to a good value
21181 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
21182 pipe.SetRasterization(&rs_ci);
21183 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
21184 }
21185 m_errorMonitor->VerifyNotFound();
21186
21187 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
21188}
21189
21190TEST_F(VkPositiveLayerTest, ValidPushConstants) {
21191 VkResult err;
21192 ASSERT_NO_FATAL_FAILURE(InitState());
21193 ASSERT_NO_FATAL_FAILURE(InitViewport());
21194 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21195
21196 VkPipelineLayout pipeline_layout;
21197 VkPushConstantRange pc_range = {};
21198 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
21199 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
21200 pipeline_layout_ci.pushConstantRangeCount = 1;
21201 pipeline_layout_ci.pPushConstantRanges = &pc_range;
21202
21203 //
21204 // Check for invalid push constant ranges in pipeline layouts.
21205 //
21206 struct PipelineLayoutTestCase {
21207 VkPushConstantRange const range;
21208 char const *msg;
21209 };
21210
21211 // Check for overlapping ranges
21212 const uint32_t ranges_per_test = 5;
21213 struct OverlappingRangeTestCase {
21214 VkPushConstantRange const ranges[ranges_per_test];
21215 char const *msg;
21216 };
21217
21218 // Run some positive tests to make sure overlap checking in the layer is OK
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021219 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos = {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
21220 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
21221 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
21222 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
21223 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
21224 ""},
21225 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
21226 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
21227 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
21228 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
21229 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
21230 ""}}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021231 for (const auto &iter : overlapping_range_tests_pos) {
21232 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
21233 m_errorMonitor->ExpectSuccess();
21234 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
21235 m_errorMonitor->VerifyNotFound();
21236 if (VK_SUCCESS == err) {
21237 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
21238 }
21239 }
21240
21241 //
21242 // CmdPushConstants tests
21243 //
21244 const uint8_t dummy_values[100] = {};
21245
Tony Barbour552f6c02016-12-21 14:34:07 -070021246 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021247
21248 // positive overlapping range tests with cmd
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021249 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
21250 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
21251 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
21252 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
21253 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
21254 }};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021255
21256 // Setup ranges: [0,16) [20,36) [36,44) [44,52) [56,80) [80,92)
21257 const VkPushConstantRange pc_range4[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021258 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
21259 {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 -060021260 };
21261
21262 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range4) / sizeof(VkPushConstantRange);
21263 pipeline_layout_ci.pPushConstantRanges = pc_range4;
21264 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
21265 ASSERT_VK_SUCCESS(err);
21266 for (const auto &iter : cmd_overlap_tests_pos) {
21267 m_errorMonitor->ExpectSuccess();
21268 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021269 iter.range.size, dummy_values);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021270 m_errorMonitor->VerifyNotFound();
21271 }
21272 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
21273
Tony Barbour552f6c02016-12-21 14:34:07 -070021274 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021275}
21276
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021277#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021278TEST_F(VkPositiveLayerTest, LongFenceChain)
21279{
21280 m_errorMonitor->ExpectSuccess();
21281
21282 ASSERT_NO_FATAL_FAILURE(InitState());
21283 VkResult err;
21284
21285 std::vector<VkFence> fences;
21286
21287 const int chainLength = 32768;
21288
21289 for (int i = 0; i < chainLength; i++) {
21290 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
21291 VkFence fence;
21292 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
21293 ASSERT_VK_SUCCESS(err);
21294
21295 fences.push_back(fence);
21296
21297 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
21298 0, nullptr, 0, nullptr };
21299 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
21300 ASSERT_VK_SUCCESS(err);
21301
21302 }
21303
21304 // BOOM, stack overflow.
21305 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
21306
21307 for (auto fence : fences)
21308 vkDestroyFence(m_device->device(), fence, nullptr);
21309
21310 m_errorMonitor->VerifyNotFound();
21311}
21312#endif
21313
Cody Northrop1242dfd2016-07-13 17:24:59 -060021314#if defined(ANDROID) && defined(VALIDATION_APK)
21315static bool initialized = false;
21316static bool active = false;
21317
21318// Convert Intents to argv
21319// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021320std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060021321 std::vector<std::string> args;
21322 JavaVM &vm = *app.activity->vm;
21323 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021324 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060021325
21326 JNIEnv &env = *p_env;
21327 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021328 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060021329 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021330 jmethodID get_string_extra_method =
21331 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060021332 jvalue get_string_extra_args;
21333 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021334 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060021335
21336 std::string args_str;
21337 if (extra_str) {
21338 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
21339 args_str = extra_utf;
21340 env.ReleaseStringUTFChars(extra_str, extra_utf);
21341 env.DeleteLocalRef(extra_str);
21342 }
21343
21344 env.DeleteLocalRef(get_string_extra_args.l);
21345 env.DeleteLocalRef(intent);
21346 vm.DetachCurrentThread();
21347
21348 // split args_str
21349 std::stringstream ss(args_str);
21350 std::string arg;
21351 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021352 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021353 }
21354
21355 return args;
21356}
21357
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021358static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060021359
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021360static void processCommand(struct android_app *app, int32_t cmd) {
21361 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021362 case APP_CMD_INIT_WINDOW: {
21363 if (app->window) {
21364 initialized = true;
21365 }
21366 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060021367 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021368 case APP_CMD_GAINED_FOCUS: {
21369 active = true;
21370 break;
21371 }
21372 case APP_CMD_LOST_FOCUS: {
21373 active = false;
21374 break;
21375 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060021376 }
21377}
21378
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021379void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060021380 app_dummy();
21381
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021382 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060021383
21384 int vulkanSupport = InitVulkan();
21385 if (vulkanSupport == 0) {
21386 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
21387 return;
21388 }
21389
21390 app->onAppCmd = processCommand;
21391 app->onInputEvent = processInput;
21392
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021393 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060021394 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021395 struct android_poll_source *source;
21396 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060021397 if (source) {
21398 source->process(app, source);
21399 }
21400
21401 if (app->destroyRequested != 0) {
21402 VkTestFramework::Finish();
21403 return;
21404 }
21405 }
21406
21407 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021408 // Use the following key to send arguments to gtest, i.e.
21409 // --es args "--gtest_filter=-VkLayerTest.foo"
21410 const char key[] = "args";
21411 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021412
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021413 std::string filter = "";
21414 if (args.size() > 0) {
21415 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
21416 filter += args[0];
21417 } else {
21418 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
21419 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060021420
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021421 int argc = 2;
21422 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
21423 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021424
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021425 // Route output to files until we can override the gtest output
21426 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
21427 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021428
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021429 ::testing::InitGoogleTest(&argc, argv);
21430 VkTestFramework::InitArgs(&argc, argv);
21431 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021432
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021433 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060021434
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021435 if (result != 0) {
21436 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
21437 } else {
21438 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
21439 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060021440
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021441 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060021442
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021443 fclose(stdout);
21444 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021445
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021446 ANativeActivity_finish(app->activity);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021447
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021448 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060021449 }
21450 }
21451}
21452#endif
21453
Tony Barbour300a6082015-04-07 13:44:53 -060021454int main(int argc, char **argv) {
21455 int result;
21456
Cody Northrop8e54a402016-03-08 22:25:52 -070021457#ifdef ANDROID
21458 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021459 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070021460#endif
21461
Tony Barbour300a6082015-04-07 13:44:53 -060021462 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060021463 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060021464
21465 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
21466
21467 result = RUN_ALL_TESTS();
21468
Tony Barbour6918cd52015-04-09 12:58:51 -060021469 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060021470 return result;
21471}