blob: 0bd2da1188bddeaae34b3428b2fb3afca91ff7fa [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Karl Schultz6addd812016-02-02 17:17:23 -070021 */
Tony Barbour65c48b32015-11-17 10:02:56 -070022
Cody Northrop8e54a402016-03-08 22:25:52 -070023#ifdef ANDROID
24#include "vulkan_wrapper.h"
25#else
David Pinedo9316d3b2015-11-06 12:54:48 -070026#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070027#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060028
29#if defined(ANDROID) && defined(VALIDATION_APK)
30#include <android/log.h>
31#include <android_native_app_glue.h>
32#endif
33
Jon Ashburn7fa7e222016-02-02 12:08:10 -070034#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060035#include "test_common.h"
36#include "vk_layer_config.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060037#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060038#include "vkrenderframework.h"
39#include <limits.h>
40#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060041
Mark Lobodzinski3780e142015-05-14 15:08:13 -050042#define GLM_FORCE_RADIANS
43#include "glm/glm.hpp"
44#include <glm/gtc/matrix_transform.hpp>
45
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
Chris Forbes26ec2122016-11-29 08:58:33 +13003276#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003277TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3278 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3279 "depth attachments in subpass");
Cody Northropc31a84f2016-08-22 10:41:47 -06003280 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour4e919972016-08-09 13:27:40 -06003281
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3283 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003284
3285 // Create a renderPass with a single color attachment
3286 VkAttachmentReference attach = {};
3287 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3288 VkSubpassDescription subpass = {};
3289 VkRenderPassCreateInfo rpci = {};
3290 rpci.subpassCount = 1;
3291 rpci.pSubpasses = &subpass;
3292 rpci.attachmentCount = 1;
3293 VkAttachmentDescription attach_desc = {};
3294 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3295 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3296 rpci.pAttachments = &attach_desc;
3297 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3298 VkRenderPass rp;
3299 subpass.pDepthStencilAttachment = &attach;
3300 subpass.pColorAttachments = NULL;
3301 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3302 m_errorMonitor->VerifyFound();
3303}
Chris Forbes26ec2122016-11-29 08:58:33 +13003304#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003305
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003306TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003307 TEST_DESCRIPTION(
3308 "Create a framebuffer where a subpass has a preserve "
3309 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003310
3311 ASSERT_NO_FATAL_FAILURE(InitState());
3312 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3313
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003315
3316 VkAttachmentReference color_attach = {};
3317 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3318 color_attach.attachment = 0;
3319 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3320 VkSubpassDescription subpass = {};
3321 subpass.colorAttachmentCount = 1;
3322 subpass.pColorAttachments = &color_attach;
3323 subpass.preserveAttachmentCount = 1;
3324 subpass.pPreserveAttachments = &preserve_attachment;
3325
3326 VkRenderPassCreateInfo rpci = {};
3327 rpci.subpassCount = 1;
3328 rpci.pSubpasses = &subpass;
3329 rpci.attachmentCount = 1;
3330 VkAttachmentDescription attach_desc = {};
3331 attach_desc.format = VK_FORMAT_UNDEFINED;
3332 rpci.pAttachments = &attach_desc;
3333 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3334 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003335 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003336
3337 m_errorMonitor->VerifyFound();
3338
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003339 if (result == VK_SUCCESS) {
3340 vkDestroyRenderPass(m_device->device(), rp, NULL);
3341 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003342}
3343
Chris Forbesc5389742016-06-29 11:49:23 +12003344TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003345 TEST_DESCRIPTION(
3346 "Ensure that CreateRenderPass produces a validation error "
3347 "when the source of a subpass multisample resolve "
3348 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003349
Chris Forbesc5389742016-06-29 11:49:23 +12003350 ASSERT_NO_FATAL_FAILURE(InitState());
3351
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003352 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3353 "Subpass 0 requests multisample resolve from attachment 0 which has "
3354 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003355
3356 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003357 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3358 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3359 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3360 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3361 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3362 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003363 };
3364
3365 VkAttachmentReference color = {
3366 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3367 };
3368
3369 VkAttachmentReference resolve = {
3370 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3371 };
3372
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003373 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003374
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003375 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003376
3377 VkRenderPass rp;
3378 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3379
3380 m_errorMonitor->VerifyFound();
3381
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003382 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003383}
3384
3385TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003386 TEST_DESCRIPTION(
3387 "Ensure CreateRenderPass produces a validation error "
3388 "when a subpass multisample resolve operation is "
3389 "requested, and the destination of that resolve has "
3390 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003391
Chris Forbesc5389742016-06-29 11:49:23 +12003392 ASSERT_NO_FATAL_FAILURE(InitState());
3393
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3395 "Subpass 0 requests multisample resolve into attachment 1, which "
3396 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003397
3398 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003399 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3400 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3401 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3402 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3403 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3404 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003405 };
3406
3407 VkAttachmentReference color = {
3408 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3409 };
3410
3411 VkAttachmentReference resolve = {
3412 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3413 };
3414
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003415 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003416
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003417 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003418
3419 VkRenderPass rp;
3420 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3421
3422 m_errorMonitor->VerifyFound();
3423
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003424 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003425}
3426
Chris Forbes3f128ef2016-06-29 14:58:53 +12003427TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003428 TEST_DESCRIPTION(
3429 "Ensure CreateRenderPass produces a validation error "
3430 "when the color and depth attachments used by a subpass "
3431 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003432
Chris Forbes3f128ef2016-06-29 14:58:53 +12003433 ASSERT_NO_FATAL_FAILURE(InitState());
3434
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3436 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003437
3438 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003439 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3440 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3441 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3442 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3443 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3444 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003445 };
3446
3447 VkAttachmentReference color[] = {
3448 {
3449 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3450 },
3451 {
3452 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3453 },
3454 };
3455
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003456 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003457
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003458 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003459
3460 VkRenderPass rp;
3461 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3462
3463 m_errorMonitor->VerifyFound();
3464
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003465 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003466}
3467
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003468TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003469 TEST_DESCRIPTION(
3470 "Hit errors when attempting to create a framebuffer :\n"
3471 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3472 " 2. Use a color image as depthStencil attachment\n"
3473 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3474 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3475 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3476 " 6. Framebuffer attachment where dimensions don't match\n"
3477 " 7. Framebuffer attachment w/o identity swizzle\n"
3478 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003479
3480 ASSERT_NO_FATAL_FAILURE(InitState());
3481 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3482
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003483 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3484 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
3485 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003486
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003487 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003488 VkAttachmentReference attach = {};
3489 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3490 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003491 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003492 VkRenderPassCreateInfo rpci = {};
3493 rpci.subpassCount = 1;
3494 rpci.pSubpasses = &subpass;
3495 rpci.attachmentCount = 1;
3496 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003497 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003498 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003499 rpci.pAttachments = &attach_desc;
3500 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3501 VkRenderPass rp;
3502 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3503 ASSERT_VK_SUCCESS(err);
3504
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003505 VkImageView ivs[2];
3506 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3507 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003508 VkFramebufferCreateInfo fb_info = {};
3509 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3510 fb_info.pNext = NULL;
3511 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003512 // Set mis-matching attachmentCount
3513 fb_info.attachmentCount = 2;
3514 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003515 fb_info.width = 100;
3516 fb_info.height = 100;
3517 fb_info.layers = 1;
3518
3519 VkFramebuffer fb;
3520 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3521
3522 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003523 if (err == VK_SUCCESS) {
3524 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3525 }
3526 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003527
3528 // Create a renderPass with a depth-stencil attachment created with
3529 // IMAGE_USAGE_COLOR_ATTACHMENT
3530 // Add our color attachment to pDepthStencilAttachment
3531 subpass.pDepthStencilAttachment = &attach;
3532 subpass.pColorAttachments = NULL;
3533 VkRenderPass rp_ds;
3534 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3535 ASSERT_VK_SUCCESS(err);
3536 // Set correct attachment count, but attachment has COLOR usage bit set
3537 fb_info.attachmentCount = 1;
3538 fb_info.renderPass = rp_ds;
3539
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003540 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003541 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3542
3543 m_errorMonitor->VerifyFound();
3544 if (err == VK_SUCCESS) {
3545 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3546 }
3547 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003548
3549 // Create new renderpass with alternate attachment format from fb
3550 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3551 subpass.pDepthStencilAttachment = NULL;
3552 subpass.pColorAttachments = &attach;
3553 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3554 ASSERT_VK_SUCCESS(err);
3555
3556 // Cause error due to mis-matched formats between rp & fb
3557 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3558 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3560 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003561 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3562
3563 m_errorMonitor->VerifyFound();
3564 if (err == VK_SUCCESS) {
3565 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3566 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003567 vkDestroyRenderPass(m_device->device(), rp, NULL);
3568
3569 // Create new renderpass with alternate sample count from fb
3570 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3571 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3572 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3573 ASSERT_VK_SUCCESS(err);
3574
3575 // Cause error due to mis-matched sample count between rp & fb
3576 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003577 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3578 " has VK_SAMPLE_COUNT_1_BIT samples "
3579 "that do not match the "
3580 "VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003581 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3582
3583 m_errorMonitor->VerifyFound();
3584 if (err == VK_SUCCESS) {
3585 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3586 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003587
3588 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003589
3590 // Create a custom imageView with non-1 mip levels
3591 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003592 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 -06003593 ASSERT_TRUE(image.initialized());
3594
3595 VkImageView view;
3596 VkImageViewCreateInfo ivci = {};
3597 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3598 ivci.image = image.handle();
3599 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3600 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3601 ivci.subresourceRange.layerCount = 1;
3602 ivci.subresourceRange.baseMipLevel = 0;
3603 // Set level count 2 (only 1 is allowed for FB attachment)
3604 ivci.subresourceRange.levelCount = 2;
3605 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3606 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3607 ASSERT_VK_SUCCESS(err);
3608 // Re-create renderpass to have matching sample count
3609 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3610 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3611 ASSERT_VK_SUCCESS(err);
3612
3613 fb_info.renderPass = rp;
3614 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003616 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3617
3618 m_errorMonitor->VerifyFound();
3619 if (err == VK_SUCCESS) {
3620 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3621 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003622 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003623 // Update view to original color buffer and grow FB dimensions too big
3624 fb_info.pAttachments = ivs;
3625 fb_info.height = 1024;
3626 fb_info.width = 1024;
3627 fb_info.layers = 2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003628 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3629 " Attachment dimensions must be at "
3630 "least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003631 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3632
3633 m_errorMonitor->VerifyFound();
3634 if (err == VK_SUCCESS) {
3635 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3636 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06003637 // Create view attachment with non-identity swizzle
3638 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3639 ivci.image = image.handle();
3640 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3641 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3642 ivci.subresourceRange.layerCount = 1;
3643 ivci.subresourceRange.baseMipLevel = 0;
3644 ivci.subresourceRange.levelCount = 1;
3645 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3646 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
3647 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
3648 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
3649 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
3650 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3651 ASSERT_VK_SUCCESS(err);
3652
3653 fb_info.pAttachments = &view;
3654 fb_info.height = 100;
3655 fb_info.width = 100;
3656 fb_info.layers = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3658 " has non-identy swizzle. All "
3659 "framebuffer attachments must have "
3660 "been created with the identity "
3661 "swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06003662 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3663
3664 m_errorMonitor->VerifyFound();
3665 if (err == VK_SUCCESS) {
3666 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3667 }
3668 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003669 // reset attachment to color attachment
3670 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003671
3672 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003673 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003674 fb_info.height = 100;
3675 fb_info.layers = 1;
3676 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
3677 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3678
3679 m_errorMonitor->VerifyFound();
3680 if (err == VK_SUCCESS) {
3681 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3682 }
3683
3684 // Request fb that exceeds max height
3685 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003686 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003687 fb_info.layers = 1;
3688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
3689 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3690
3691 m_errorMonitor->VerifyFound();
3692 if (err == VK_SUCCESS) {
3693 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3694 }
3695
3696 // Request fb that exceeds max layers
3697 fb_info.width = 100;
3698 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003699 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003700 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003701 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3702
3703 m_errorMonitor->VerifyFound();
3704 if (err == VK_SUCCESS) {
3705 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3706 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003707
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003708 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003709}
3710
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003711TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003712 TEST_DESCRIPTION(
3713 "Run a simple draw calls to validate failure when Depth Bias dynamic "
3714 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003715
Cody Northropc31a84f2016-08-22 10:41:47 -06003716 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003717 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
3719 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003720 m_errorMonitor->VerifyFound();
3721}
3722
3723TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003724 TEST_DESCRIPTION(
3725 "Run a simple draw calls to validate failure when Line Width dynamic "
3726 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003727
Cody Northropc31a84f2016-08-22 10:41:47 -06003728 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003729 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
3731 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003732 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003733}
3734
3735TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003736 TEST_DESCRIPTION(
3737 "Run a simple draw calls to validate failure when Viewport dynamic "
3738 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003739
Cody Northropc31a84f2016-08-22 10:41:47 -06003740 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003741 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3743 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003744 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003745 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003746}
3747
3748TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003749 TEST_DESCRIPTION(
3750 "Run a simple draw calls to validate failure when Scissor dynamic "
3751 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003752
Cody Northropc31a84f2016-08-22 10:41:47 -06003753 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003754 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3756 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003757 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003758 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003759}
3760
Cortd713fe82016-07-27 09:51:27 -07003761TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003762 TEST_DESCRIPTION(
3763 "Run a simple draw calls to validate failure when Blend Constants "
3764 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003765
3766 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06003767 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003768 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3769 "Dynamic blend constants state not set for this command buffer");
3770 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06003771 m_errorMonitor->VerifyFound();
3772}
3773
3774TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003775 TEST_DESCRIPTION(
3776 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
3777 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003778
3779 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06003780 if (!m_device->phy().features().depthBounds) {
3781 printf("Device does not support depthBounds test; skipped.\n");
3782 return;
3783 }
3784 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3786 "Dynamic depth bounds state not set for this command buffer");
3787 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003788 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003789}
3790
3791TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003792 TEST_DESCRIPTION(
3793 "Run a simple draw calls to validate failure when Stencil Read dynamic "
3794 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003795
3796 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003797 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3799 "Dynamic stencil read mask state not set for this command buffer");
3800 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003801 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003802}
3803
3804TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003805 TEST_DESCRIPTION(
3806 "Run a simple draw calls to validate failure when Stencil Write dynamic"
3807 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003808
3809 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003810 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3812 "Dynamic stencil write mask state not set for this command buffer");
3813 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003814 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003815}
3816
3817TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003818 TEST_DESCRIPTION(
3819 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
3820 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003821
3822 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003823 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3825 "Dynamic stencil reference state not set for this command buffer");
3826 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003827 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06003828}
3829
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06003830TEST_F(VkLayerTest, IndexBufferNotBound) {
3831 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003832
3833 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3835 "Index buffer object not bound to this command buffer when Indexed ");
3836 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06003837 m_errorMonitor->VerifyFound();
3838}
3839
Karl Schultz6addd812016-02-02 17:17:23 -07003840TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003841 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3842 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
3843 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003844
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003845 ASSERT_NO_FATAL_FAILURE(InitState());
3846 ASSERT_NO_FATAL_FAILURE(InitViewport());
3847 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3848
Karl Schultz6addd812016-02-02 17:17:23 -07003849 // We luck out b/c by default the framework creates CB w/ the
3850 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07003851 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003852 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07003853 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003854
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003855 // Bypass framework since it does the waits automatically
3856 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003857 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003858 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3859 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003860 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003861 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003862 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003863 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003864 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003865 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003866 submit_info.pSignalSemaphores = NULL;
3867
Chris Forbes40028e22016-06-13 09:59:34 +12003868 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07003869 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07003870 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003871
Karl Schultz6addd812016-02-02 17:17:23 -07003872 // Cause validation error by re-submitting cmd buffer that should only be
3873 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12003874 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07003875 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003876
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003877 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003878}
3879
Karl Schultz6addd812016-02-02 17:17:23 -07003880TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003881 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07003882 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003883
3884 ASSERT_NO_FATAL_FAILURE(InitState());
3885 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003886
Karl Schultz6addd812016-02-02 17:17:23 -07003887 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
3888 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003889 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003890 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003891 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003892
3893 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003894 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3895 ds_pool_ci.pNext = NULL;
3896 ds_pool_ci.flags = 0;
3897 ds_pool_ci.maxSets = 1;
3898 ds_pool_ci.poolSizeCount = 1;
3899 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003900
3901 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003902 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003903 ASSERT_VK_SUCCESS(err);
3904
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003905 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
3906 dsl_binding_samp.binding = 0;
3907 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3908 dsl_binding_samp.descriptorCount = 1;
3909 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
3910 dsl_binding_samp.pImmutableSamplers = NULL;
3911
3912 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3913 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3914 ds_layout_ci.pNext = NULL;
3915 ds_layout_ci.bindingCount = 1;
3916 ds_layout_ci.pBindings = &dsl_binding_samp;
3917
3918 VkDescriptorSetLayout ds_layout_samp;
3919 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
3920 ASSERT_VK_SUCCESS(err);
3921
3922 // Try to allocate 2 sets when pool only has 1 set
3923 VkDescriptorSet descriptor_sets[2];
3924 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
3925 VkDescriptorSetAllocateInfo alloc_info = {};
3926 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3927 alloc_info.descriptorSetCount = 2;
3928 alloc_info.descriptorPool = ds_pool;
3929 alloc_info.pSetLayouts = set_layouts;
3930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
3931 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
3932 m_errorMonitor->VerifyFound();
3933
3934 alloc_info.descriptorSetCount = 1;
3935 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003936 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003937 dsl_binding.binding = 0;
3938 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3939 dsl_binding.descriptorCount = 1;
3940 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3941 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003942
Karl Schultz6addd812016-02-02 17:17:23 -07003943 ds_layout_ci.bindingCount = 1;
3944 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003945
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003946 VkDescriptorSetLayout ds_layout_ub;
3947 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003948 ASSERT_VK_SUCCESS(err);
3949
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003950 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003951 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003952 alloc_info.pSetLayouts = &ds_layout_ub;
3953 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
3954 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003955
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003956 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003957
Karl Schultz2825ab92016-12-02 08:23:14 -07003958 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003959 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08003960 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003961}
3962
Karl Schultz6addd812016-02-02 17:17:23 -07003963TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
3964 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06003965
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07003966 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003967
Tobin Ehlise735c692015-10-08 13:13:50 -06003968 ASSERT_NO_FATAL_FAILURE(InitState());
3969 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06003970
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003971 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003972 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3973 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06003974
3975 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003976 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3977 ds_pool_ci.pNext = NULL;
3978 ds_pool_ci.maxSets = 1;
3979 ds_pool_ci.poolSizeCount = 1;
3980 ds_pool_ci.flags = 0;
3981 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
3982 // app can only call vkResetDescriptorPool on this pool.;
3983 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06003984
3985 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003986 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06003987 ASSERT_VK_SUCCESS(err);
3988
3989 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003990 dsl_binding.binding = 0;
3991 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3992 dsl_binding.descriptorCount = 1;
3993 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3994 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06003995
3996 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003997 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3998 ds_layout_ci.pNext = NULL;
3999 ds_layout_ci.bindingCount = 1;
4000 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004001
4002 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004003 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004004 ASSERT_VK_SUCCESS(err);
4005
4006 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004007 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004008 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004009 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004010 alloc_info.descriptorPool = ds_pool;
4011 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004012 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004013 ASSERT_VK_SUCCESS(err);
4014
4015 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004016 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004017
Chia-I Wuf7458c52015-10-26 21:10:41 +08004018 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4019 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004020}
4021
Karl Schultz6addd812016-02-02 17:17:23 -07004022TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004023 // Attempt to clear Descriptor Pool with bad object.
4024 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004025
4026 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004028 uint64_t fake_pool_handle = 0xbaad6001;
4029 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4030 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004031 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004032}
4033
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004034TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004035 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4036 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004037 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004038 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004039
4040 uint64_t fake_set_handle = 0xbaad6001;
4041 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004042 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004043 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004044
4045 ASSERT_NO_FATAL_FAILURE(InitState());
4046
4047 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4048 layout_bindings[0].binding = 0;
4049 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4050 layout_bindings[0].descriptorCount = 1;
4051 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4052 layout_bindings[0].pImmutableSamplers = NULL;
4053
4054 VkDescriptorSetLayout descriptor_set_layout;
4055 VkDescriptorSetLayoutCreateInfo dslci = {};
4056 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4057 dslci.pNext = NULL;
4058 dslci.bindingCount = 1;
4059 dslci.pBindings = layout_bindings;
4060 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004061 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004062
4063 VkPipelineLayout pipeline_layout;
4064 VkPipelineLayoutCreateInfo plci = {};
4065 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4066 plci.pNext = NULL;
4067 plci.setLayoutCount = 1;
4068 plci.pSetLayouts = &descriptor_set_layout;
4069 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004070 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004071
Tony Barbour552f6c02016-12-21 14:34:07 -07004072 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004073 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4074 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004075 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004076 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004077 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4078 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004079}
4080
Karl Schultz6addd812016-02-02 17:17:23 -07004081TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004082 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4083 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004084 uint64_t fake_layout_handle = 0xbaad6001;
4085 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004086 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Cody Northropc31a84f2016-08-22 10:41:47 -06004087 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzbdb75952016-04-19 11:36:49 -06004088 VkPipelineLayout pipeline_layout;
4089 VkPipelineLayoutCreateInfo plci = {};
4090 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4091 plci.pNext = NULL;
4092 plci.setLayoutCount = 1;
4093 plci.pSetLayouts = &bad_layout;
4094 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4095
4096 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004097}
4098
Mark Muellerd4914412016-06-13 17:52:06 -06004099TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004100 TEST_DESCRIPTION(
4101 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4102 "1) A uniform buffer update must have a valid buffer index."
4103 "2) When using an array of descriptors in a single WriteDescriptor,"
4104 " the descriptor types and stageflags must all be the same."
4105 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004106
Mike Weiblena6666382017-01-05 15:16:11 -07004107 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004108
4109 ASSERT_NO_FATAL_FAILURE(InitState());
4110 VkDescriptorPoolSize ds_type_count[4] = {};
4111 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4112 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004113 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004114 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004115 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004116 ds_type_count[2].descriptorCount = 1;
4117 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4118 ds_type_count[3].descriptorCount = 1;
4119
4120 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4121 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4122 ds_pool_ci.maxSets = 1;
4123 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4124 ds_pool_ci.pPoolSizes = ds_type_count;
4125
4126 VkDescriptorPool ds_pool;
4127 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4128 ASSERT_VK_SUCCESS(err);
4129
Mark Muellerb9896722016-06-16 09:54:29 -06004130 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004131 layout_binding[0].binding = 0;
4132 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4133 layout_binding[0].descriptorCount = 1;
4134 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4135 layout_binding[0].pImmutableSamplers = NULL;
4136
4137 layout_binding[1].binding = 1;
4138 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4139 layout_binding[1].descriptorCount = 1;
4140 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4141 layout_binding[1].pImmutableSamplers = NULL;
4142
4143 VkSamplerCreateInfo sampler_ci = {};
4144 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4145 sampler_ci.pNext = NULL;
4146 sampler_ci.magFilter = VK_FILTER_NEAREST;
4147 sampler_ci.minFilter = VK_FILTER_NEAREST;
4148 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4149 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4150 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4151 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4152 sampler_ci.mipLodBias = 1.0;
4153 sampler_ci.anisotropyEnable = VK_FALSE;
4154 sampler_ci.maxAnisotropy = 1;
4155 sampler_ci.compareEnable = VK_FALSE;
4156 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4157 sampler_ci.minLod = 1.0;
4158 sampler_ci.maxLod = 1.0;
4159 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4160 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4161 VkSampler sampler;
4162
4163 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4164 ASSERT_VK_SUCCESS(err);
4165
4166 layout_binding[2].binding = 2;
4167 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4168 layout_binding[2].descriptorCount = 1;
4169 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4170 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4171
Mark Muellerd4914412016-06-13 17:52:06 -06004172 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4173 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4174 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4175 ds_layout_ci.pBindings = layout_binding;
4176 VkDescriptorSetLayout ds_layout;
4177 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4178 ASSERT_VK_SUCCESS(err);
4179
4180 VkDescriptorSetAllocateInfo alloc_info = {};
4181 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4182 alloc_info.descriptorSetCount = 1;
4183 alloc_info.descriptorPool = ds_pool;
4184 alloc_info.pSetLayouts = &ds_layout;
4185 VkDescriptorSet descriptorSet;
4186 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4187 ASSERT_VK_SUCCESS(err);
4188
4189 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4190 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4191 pipeline_layout_ci.pNext = NULL;
4192 pipeline_layout_ci.setLayoutCount = 1;
4193 pipeline_layout_ci.pSetLayouts = &ds_layout;
4194
4195 VkPipelineLayout pipeline_layout;
4196 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4197 ASSERT_VK_SUCCESS(err);
4198
Mark Mueller5c838ce2016-06-16 09:54:29 -06004199 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004200 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4201 descriptor_write.dstSet = descriptorSet;
4202 descriptor_write.dstBinding = 0;
4203 descriptor_write.descriptorCount = 1;
4204 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4205
Mark Mueller5c838ce2016-06-16 09:54:29 -06004206 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004207 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4208 m_errorMonitor->VerifyFound();
4209
4210 // Create a buffer to update the descriptor with
4211 uint32_t qfi = 0;
4212 VkBufferCreateInfo buffCI = {};
4213 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4214 buffCI.size = 1024;
4215 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4216 buffCI.queueFamilyIndexCount = 1;
4217 buffCI.pQueueFamilyIndices = &qfi;
4218
4219 VkBuffer dyub;
4220 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4221 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004222
Tony Barboure132c5f2016-12-12 11:50:20 -07004223 VkDeviceMemory mem;
4224 VkMemoryRequirements mem_reqs;
4225 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4226
4227 VkMemoryAllocateInfo mem_alloc_info = {};
4228 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4229 mem_alloc_info.allocationSize = mem_reqs.size;
4230 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4231 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4232 ASSERT_VK_SUCCESS(err);
4233
4234 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4235 ASSERT_VK_SUCCESS(err);
4236
4237 VkDescriptorBufferInfo buffInfo[2] = {};
4238 buffInfo[0].buffer = dyub;
4239 buffInfo[0].offset = 0;
4240 buffInfo[0].range = 1024;
4241 buffInfo[1].buffer = dyub;
4242 buffInfo[1].offset = 0;
4243 buffInfo[1].range = 1024;
4244 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004245 descriptor_write.descriptorCount = 2;
4246
Mark Mueller5c838ce2016-06-16 09:54:29 -06004247 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004249 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4250 m_errorMonitor->VerifyFound();
4251
Mark Mueller5c838ce2016-06-16 09:54:29 -06004252 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4253 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004254 descriptor_write.dstBinding = 1;
4255 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004256
Mark Mueller5c838ce2016-06-16 09:54:29 -06004257 // Make pImageInfo index non-null to avoid complaints of it missing
4258 VkDescriptorImageInfo imageInfo = {};
4259 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4260 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004261 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004262 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4263 m_errorMonitor->VerifyFound();
4264
Mark Muellerd4914412016-06-13 17:52:06 -06004265 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004266 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004267 vkDestroySampler(m_device->device(), sampler, NULL);
4268 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4269 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4270 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4271}
4272
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004273TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004274 TEST_DESCRIPTION(
4275 "Attempt to draw with a command buffer that is invalid "
4276 "due to a buffer dependency being destroyed.");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004277 ASSERT_NO_FATAL_FAILURE(InitState());
4278
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004279 VkBuffer buffer;
4280 VkDeviceMemory mem;
4281 VkMemoryRequirements mem_reqs;
4282
4283 VkBufferCreateInfo buf_info = {};
4284 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004285 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004286 buf_info.size = 256;
4287 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4288 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4289 ASSERT_VK_SUCCESS(err);
4290
4291 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4292
4293 VkMemoryAllocateInfo alloc_info = {};
4294 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4295 alloc_info.allocationSize = 256;
4296 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004297 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 -06004298 if (!pass) {
4299 vkDestroyBuffer(m_device->device(), buffer, NULL);
4300 return;
4301 }
4302 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4303 ASSERT_VK_SUCCESS(err);
4304
4305 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4306 ASSERT_VK_SUCCESS(err);
4307
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004308 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004309 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004310 m_commandBuffer->EndCommandBuffer();
4311
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004312 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004313 // Destroy buffer dependency prior to submit to cause ERROR
4314 vkDestroyBuffer(m_device->device(), buffer, NULL);
4315
4316 VkSubmitInfo submit_info = {};
4317 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4318 submit_info.commandBufferCount = 1;
4319 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4320 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4321
4322 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004323 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004324 vkFreeMemory(m_device->handle(), mem, NULL);
4325}
4326
Tobin Ehlisea413442016-09-28 10:23:59 -06004327TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4328 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4329
4330 ASSERT_NO_FATAL_FAILURE(InitState());
4331 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4332
4333 VkDescriptorPoolSize ds_type_count;
4334 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4335 ds_type_count.descriptorCount = 1;
4336
4337 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4338 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4339 ds_pool_ci.maxSets = 1;
4340 ds_pool_ci.poolSizeCount = 1;
4341 ds_pool_ci.pPoolSizes = &ds_type_count;
4342
4343 VkDescriptorPool ds_pool;
4344 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4345 ASSERT_VK_SUCCESS(err);
4346
4347 VkDescriptorSetLayoutBinding layout_binding;
4348 layout_binding.binding = 0;
4349 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4350 layout_binding.descriptorCount = 1;
4351 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4352 layout_binding.pImmutableSamplers = NULL;
4353
4354 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4355 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4356 ds_layout_ci.bindingCount = 1;
4357 ds_layout_ci.pBindings = &layout_binding;
4358 VkDescriptorSetLayout ds_layout;
4359 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4360 ASSERT_VK_SUCCESS(err);
4361
4362 VkDescriptorSetAllocateInfo alloc_info = {};
4363 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4364 alloc_info.descriptorSetCount = 1;
4365 alloc_info.descriptorPool = ds_pool;
4366 alloc_info.pSetLayouts = &ds_layout;
4367 VkDescriptorSet descriptor_set;
4368 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4369 ASSERT_VK_SUCCESS(err);
4370
4371 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4372 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4373 pipeline_layout_ci.pNext = NULL;
4374 pipeline_layout_ci.setLayoutCount = 1;
4375 pipeline_layout_ci.pSetLayouts = &ds_layout;
4376
4377 VkPipelineLayout pipeline_layout;
4378 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4379 ASSERT_VK_SUCCESS(err);
4380
4381 VkBuffer buffer;
4382 uint32_t queue_family_index = 0;
4383 VkBufferCreateInfo buffer_create_info = {};
4384 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4385 buffer_create_info.size = 1024;
4386 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4387 buffer_create_info.queueFamilyIndexCount = 1;
4388 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4389
4390 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4391 ASSERT_VK_SUCCESS(err);
4392
4393 VkMemoryRequirements memory_reqs;
4394 VkDeviceMemory buffer_memory;
4395
4396 VkMemoryAllocateInfo memory_info = {};
4397 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4398 memory_info.allocationSize = 0;
4399 memory_info.memoryTypeIndex = 0;
4400
4401 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4402 memory_info.allocationSize = memory_reqs.size;
4403 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4404 ASSERT_TRUE(pass);
4405
4406 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4407 ASSERT_VK_SUCCESS(err);
4408 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4409 ASSERT_VK_SUCCESS(err);
4410
4411 VkBufferView view;
4412 VkBufferViewCreateInfo bvci = {};
4413 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4414 bvci.buffer = buffer;
4415 bvci.format = VK_FORMAT_R8_UNORM;
4416 bvci.range = VK_WHOLE_SIZE;
4417
4418 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4419 ASSERT_VK_SUCCESS(err);
4420
4421 VkWriteDescriptorSet descriptor_write = {};
4422 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4423 descriptor_write.dstSet = descriptor_set;
4424 descriptor_write.dstBinding = 0;
4425 descriptor_write.descriptorCount = 1;
4426 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4427 descriptor_write.pTexelBufferView = &view;
4428
4429 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4430
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004431 char const *vsSource =
4432 "#version 450\n"
4433 "\n"
4434 "out gl_PerVertex { \n"
4435 " vec4 gl_Position;\n"
4436 "};\n"
4437 "void main(){\n"
4438 " gl_Position = vec4(1);\n"
4439 "}\n";
4440 char const *fsSource =
4441 "#version 450\n"
4442 "\n"
4443 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4444 "layout(location=0) out vec4 x;\n"
4445 "void main(){\n"
4446 " x = imageLoad(s, 0);\n"
4447 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004448 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4449 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4450 VkPipelineObj pipe(m_device);
4451 pipe.AddShader(&vs);
4452 pipe.AddShader(&fs);
4453 pipe.AddColorAttachment();
4454 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4455
4456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted buffer view ");
4457 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4458
Tony Barbour552f6c02016-12-21 14:34:07 -07004459 m_commandBuffer->BeginCommandBuffer();
4460 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4461
Tobin Ehlisea413442016-09-28 10:23:59 -06004462 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4463 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4464 VkRect2D scissor = {{0, 0}, {16, 16}};
4465 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4466 // Bind pipeline to cmd buffer
4467 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4468 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4469 &descriptor_set, 0, nullptr);
4470 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004471 m_commandBuffer->EndRenderPass();
4472 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004473
4474 // Delete BufferView in order to invalidate cmd buffer
4475 vkDestroyBufferView(m_device->device(), view, NULL);
4476 // Now attempt submit of cmd buffer
4477 VkSubmitInfo submit_info = {};
4478 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4479 submit_info.commandBufferCount = 1;
4480 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4481 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4482 m_errorMonitor->VerifyFound();
4483
4484 // Clean-up
4485 vkDestroyBuffer(m_device->device(), buffer, NULL);
4486 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4487 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4488 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4489 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4490}
4491
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004492TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004493 TEST_DESCRIPTION(
4494 "Attempt to draw with a command buffer that is invalid "
4495 "due to an image dependency being destroyed.");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004496 ASSERT_NO_FATAL_FAILURE(InitState());
4497
4498 VkImage image;
4499 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4500 VkImageCreateInfo image_create_info = {};
4501 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4502 image_create_info.pNext = NULL;
4503 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4504 image_create_info.format = tex_format;
4505 image_create_info.extent.width = 32;
4506 image_create_info.extent.height = 32;
4507 image_create_info.extent.depth = 1;
4508 image_create_info.mipLevels = 1;
4509 image_create_info.arrayLayers = 1;
4510 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4511 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004512 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004513 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004514 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004515 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004516 // Have to bind memory to image before recording cmd in cmd buffer using it
4517 VkMemoryRequirements mem_reqs;
4518 VkDeviceMemory image_mem;
4519 bool pass;
4520 VkMemoryAllocateInfo mem_alloc = {};
4521 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4522 mem_alloc.pNext = NULL;
4523 mem_alloc.memoryTypeIndex = 0;
4524 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4525 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004526 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004527 ASSERT_TRUE(pass);
4528 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4529 ASSERT_VK_SUCCESS(err);
4530 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4531 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004532
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004533 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004534 VkClearColorValue ccv;
4535 ccv.float32[0] = 1.0f;
4536 ccv.float32[1] = 1.0f;
4537 ccv.float32[2] = 1.0f;
4538 ccv.float32[3] = 1.0f;
4539 VkImageSubresourceRange isr = {};
4540 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004541 isr.baseArrayLayer = 0;
4542 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004543 isr.layerCount = 1;
4544 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004545 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004546 m_commandBuffer->EndCommandBuffer();
4547
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004549 // Destroy image dependency prior to submit to cause ERROR
4550 vkDestroyImage(m_device->device(), image, NULL);
4551
4552 VkSubmitInfo submit_info = {};
4553 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4554 submit_info.commandBufferCount = 1;
4555 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4556 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4557
4558 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004559 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004560}
4561
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004562TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004563 TEST_DESCRIPTION(
4564 "Attempt to draw with a command buffer that is invalid "
4565 "due to a framebuffer image dependency being destroyed.");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004566 VkFormatProperties format_properties;
4567 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004568 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4569 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004570 return;
4571 }
4572
4573 ASSERT_NO_FATAL_FAILURE(InitState());
4574 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4575
4576 VkImageCreateInfo image_ci = {};
4577 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4578 image_ci.pNext = NULL;
4579 image_ci.imageType = VK_IMAGE_TYPE_2D;
4580 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4581 image_ci.extent.width = 32;
4582 image_ci.extent.height = 32;
4583 image_ci.extent.depth = 1;
4584 image_ci.mipLevels = 1;
4585 image_ci.arrayLayers = 1;
4586 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4587 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004588 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004589 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4590 image_ci.flags = 0;
4591 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004592 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004593
4594 VkMemoryRequirements memory_reqs;
4595 VkDeviceMemory image_memory;
4596 bool pass;
4597 VkMemoryAllocateInfo memory_info = {};
4598 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4599 memory_info.pNext = NULL;
4600 memory_info.allocationSize = 0;
4601 memory_info.memoryTypeIndex = 0;
4602 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
4603 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004604 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004605 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004606 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004607 ASSERT_VK_SUCCESS(err);
4608 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
4609 ASSERT_VK_SUCCESS(err);
4610
4611 VkImageViewCreateInfo ivci = {
4612 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4613 nullptr,
4614 0,
4615 image,
4616 VK_IMAGE_VIEW_TYPE_2D,
4617 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004618 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004619 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
4620 };
4621 VkImageView view;
4622 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4623 ASSERT_VK_SUCCESS(err);
4624
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004625 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004626 VkFramebuffer fb;
4627 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4628 ASSERT_VK_SUCCESS(err);
4629
4630 // Just use default renderpass with our framebuffer
4631 m_renderPassBeginInfo.framebuffer = fb;
4632 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07004633 m_commandBuffer->BeginCommandBuffer();
4634 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4635 m_commandBuffer->EndRenderPass();
4636 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004637 // Destroy image attached to framebuffer to invalidate cmd buffer
4638 vkDestroyImage(m_device->device(), image, NULL);
4639 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004640 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004641 QueueCommandBuffer(false);
4642 m_errorMonitor->VerifyFound();
4643
4644 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4645 vkDestroyImageView(m_device->device(), view, nullptr);
4646 vkFreeMemory(m_device->device(), image_memory, nullptr);
4647}
4648
Tobin Ehlisb329f992016-10-12 13:20:29 -06004649TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
4650 TEST_DESCRIPTION("Delete in-use framebuffer.");
4651 VkFormatProperties format_properties;
4652 VkResult err = VK_SUCCESS;
4653 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4654
4655 ASSERT_NO_FATAL_FAILURE(InitState());
4656 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4657
4658 VkImageObj image(m_device);
4659 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4660 ASSERT_TRUE(image.initialized());
4661 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
4662
4663 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
4664 VkFramebuffer fb;
4665 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4666 ASSERT_VK_SUCCESS(err);
4667
4668 // Just use default renderpass with our framebuffer
4669 m_renderPassBeginInfo.framebuffer = fb;
4670 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07004671 m_commandBuffer->BeginCommandBuffer();
4672 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4673 m_commandBuffer->EndRenderPass();
4674 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06004675 // Submit cmd buffer to put it in-flight
4676 VkSubmitInfo submit_info = {};
4677 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4678 submit_info.commandBufferCount = 1;
4679 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4680 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4681 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004682 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06004683 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4684 m_errorMonitor->VerifyFound();
4685 // Wait for queue to complete so we can safely destroy everything
4686 vkQueueWaitIdle(m_device->m_queue);
4687 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4688}
4689
Tobin Ehlis88becd72016-09-21 14:33:41 -06004690TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
4691 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
4692 VkFormatProperties format_properties;
4693 VkResult err = VK_SUCCESS;
4694 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06004695
4696 ASSERT_NO_FATAL_FAILURE(InitState());
4697 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4698
4699 VkImageCreateInfo image_ci = {};
4700 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4701 image_ci.pNext = NULL;
4702 image_ci.imageType = VK_IMAGE_TYPE_2D;
4703 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4704 image_ci.extent.width = 256;
4705 image_ci.extent.height = 256;
4706 image_ci.extent.depth = 1;
4707 image_ci.mipLevels = 1;
4708 image_ci.arrayLayers = 1;
4709 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4710 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06004711 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06004712 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4713 image_ci.flags = 0;
4714 VkImage image;
4715 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
4716
4717 VkMemoryRequirements memory_reqs;
4718 VkDeviceMemory image_memory;
4719 bool pass;
4720 VkMemoryAllocateInfo memory_info = {};
4721 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4722 memory_info.pNext = NULL;
4723 memory_info.allocationSize = 0;
4724 memory_info.memoryTypeIndex = 0;
4725 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
4726 memory_info.allocationSize = memory_reqs.size;
4727 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4728 ASSERT_TRUE(pass);
4729 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
4730 ASSERT_VK_SUCCESS(err);
4731 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
4732 ASSERT_VK_SUCCESS(err);
4733
4734 VkImageViewCreateInfo ivci = {
4735 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4736 nullptr,
4737 0,
4738 image,
4739 VK_IMAGE_VIEW_TYPE_2D,
4740 VK_FORMAT_B8G8R8A8_UNORM,
4741 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
4742 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
4743 };
4744 VkImageView view;
4745 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4746 ASSERT_VK_SUCCESS(err);
4747
4748 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
4749 VkFramebuffer fb;
4750 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4751 ASSERT_VK_SUCCESS(err);
4752
4753 // Just use default renderpass with our framebuffer
4754 m_renderPassBeginInfo.framebuffer = fb;
4755 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07004756 m_commandBuffer->BeginCommandBuffer();
4757 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4758 m_commandBuffer->EndRenderPass();
4759 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06004760 // Submit cmd buffer to put it (and attached imageView) in-flight
4761 VkSubmitInfo submit_info = {};
4762 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4763 submit_info.commandBufferCount = 1;
4764 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4765 // Submit cmd buffer to put framebuffer and children in-flight
4766 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4767 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004768 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06004769 vkDestroyImage(m_device->device(), image, NULL);
4770 m_errorMonitor->VerifyFound();
4771 // Wait for queue to complete so we can safely destroy image and other objects
4772 vkQueueWaitIdle(m_device->m_queue);
4773 vkDestroyImage(m_device->device(), image, NULL);
4774 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4775 vkDestroyImageView(m_device->device(), view, nullptr);
4776 vkFreeMemory(m_device->device(), image_memory, nullptr);
4777}
4778
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06004779TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
4780 TEST_DESCRIPTION("Delete in-use renderPass.");
4781
4782 ASSERT_NO_FATAL_FAILURE(InitState());
4783 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4784
4785 // Create simple renderpass
4786 VkAttachmentReference attach = {};
4787 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4788 VkSubpassDescription subpass = {};
4789 subpass.pColorAttachments = &attach;
4790 VkRenderPassCreateInfo rpci = {};
4791 rpci.subpassCount = 1;
4792 rpci.pSubpasses = &subpass;
4793 rpci.attachmentCount = 1;
4794 VkAttachmentDescription attach_desc = {};
4795 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4796 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4797 rpci.pAttachments = &attach_desc;
4798 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4799 VkRenderPass rp;
4800 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4801 ASSERT_VK_SUCCESS(err);
4802
4803 // Create a pipeline that uses the given renderpass
4804 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4805 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4806
4807 VkPipelineLayout pipeline_layout;
4808 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4809 ASSERT_VK_SUCCESS(err);
4810
4811 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4812 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4813 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004814 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06004815 vp_state_ci.pViewports = &vp;
4816 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004817 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06004818 vp_state_ci.pScissors = &scissors;
4819
4820 VkPipelineShaderStageCreateInfo shaderStages[2];
4821 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4822
4823 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004824 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 -06004825 // but add it to be able to run on more devices
4826 shaderStages[0] = vs.GetStageCreateInfo();
4827 shaderStages[1] = fs.GetStageCreateInfo();
4828
4829 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4830 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4831
4832 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4833 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4834 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4835
4836 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4837 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4838 rs_ci.rasterizerDiscardEnable = true;
4839 rs_ci.lineWidth = 1.0f;
4840
4841 VkPipelineColorBlendAttachmentState att = {};
4842 att.blendEnable = VK_FALSE;
4843 att.colorWriteMask = 0xf;
4844
4845 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4846 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4847 cb_ci.attachmentCount = 1;
4848 cb_ci.pAttachments = &att;
4849
4850 VkGraphicsPipelineCreateInfo gp_ci = {};
4851 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4852 gp_ci.stageCount = 2;
4853 gp_ci.pStages = shaderStages;
4854 gp_ci.pVertexInputState = &vi_ci;
4855 gp_ci.pInputAssemblyState = &ia_ci;
4856 gp_ci.pViewportState = &vp_state_ci;
4857 gp_ci.pRasterizationState = &rs_ci;
4858 gp_ci.pColorBlendState = &cb_ci;
4859 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4860 gp_ci.layout = pipeline_layout;
4861 gp_ci.renderPass = rp;
4862
4863 VkPipelineCacheCreateInfo pc_ci = {};
4864 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4865
4866 VkPipeline pipeline;
4867 VkPipelineCache pipe_cache;
4868 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
4869 ASSERT_VK_SUCCESS(err);
4870
4871 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
4872 ASSERT_VK_SUCCESS(err);
4873 // Bind pipeline to cmd buffer, will also bind renderpass
4874 m_commandBuffer->BeginCommandBuffer();
4875 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4876 m_commandBuffer->EndCommandBuffer();
4877
4878 VkSubmitInfo submit_info = {};
4879 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4880 submit_info.commandBufferCount = 1;
4881 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4882 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4883
4884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
4885 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4886 m_errorMonitor->VerifyFound();
4887
4888 // Wait for queue to complete so we can safely destroy everything
4889 vkQueueWaitIdle(m_device->m_queue);
4890 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4891 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
4892 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
4893 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
4894}
4895
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004896TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004897 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004898 ASSERT_NO_FATAL_FAILURE(InitState());
4899
4900 VkImage image;
4901 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4902 VkImageCreateInfo image_create_info = {};
4903 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4904 image_create_info.pNext = NULL;
4905 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4906 image_create_info.format = tex_format;
4907 image_create_info.extent.width = 32;
4908 image_create_info.extent.height = 32;
4909 image_create_info.extent.depth = 1;
4910 image_create_info.mipLevels = 1;
4911 image_create_info.arrayLayers = 1;
4912 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4913 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004914 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004915 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004916 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004917 ASSERT_VK_SUCCESS(err);
4918 // Have to bind memory to image before recording cmd in cmd buffer using it
4919 VkMemoryRequirements mem_reqs;
4920 VkDeviceMemory image_mem;
4921 bool pass;
4922 VkMemoryAllocateInfo mem_alloc = {};
4923 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4924 mem_alloc.pNext = NULL;
4925 mem_alloc.memoryTypeIndex = 0;
4926 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4927 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004928 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004929 ASSERT_TRUE(pass);
4930 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4931 ASSERT_VK_SUCCESS(err);
4932
Tobin Ehlisfed999f2016-09-21 15:09:45 -06004933 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
4934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06004935 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004936
4937 m_commandBuffer->BeginCommandBuffer();
4938 VkClearColorValue ccv;
4939 ccv.float32[0] = 1.0f;
4940 ccv.float32[1] = 1.0f;
4941 ccv.float32[2] = 1.0f;
4942 ccv.float32[3] = 1.0f;
4943 VkImageSubresourceRange isr = {};
4944 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4945 isr.baseArrayLayer = 0;
4946 isr.baseMipLevel = 0;
4947 isr.layerCount = 1;
4948 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004949 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004950 m_commandBuffer->EndCommandBuffer();
4951
4952 m_errorMonitor->VerifyFound();
4953 vkDestroyImage(m_device->device(), image, NULL);
4954 vkFreeMemory(m_device->device(), image_mem, nullptr);
4955}
4956
4957TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004958 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004959 ASSERT_NO_FATAL_FAILURE(InitState());
4960
4961 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004962 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 -06004963 VK_IMAGE_TILING_OPTIMAL, 0);
4964 ASSERT_TRUE(image.initialized());
4965
4966 VkBuffer buffer;
4967 VkDeviceMemory mem;
4968 VkMemoryRequirements mem_reqs;
4969
4970 VkBufferCreateInfo buf_info = {};
4971 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12004972 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004973 buf_info.size = 256;
4974 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4975 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4976 ASSERT_VK_SUCCESS(err);
4977
4978 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4979
4980 VkMemoryAllocateInfo alloc_info = {};
4981 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4982 alloc_info.allocationSize = 256;
4983 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004984 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 -06004985 if (!pass) {
4986 vkDestroyBuffer(m_device->device(), buffer, NULL);
4987 return;
4988 }
4989 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4990 ASSERT_VK_SUCCESS(err);
4991
Tobin Ehlisfed999f2016-09-21 15:09:45 -06004992 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4993 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06004994 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004995 VkBufferImageCopy region = {};
4996 region.bufferRowLength = 128;
4997 region.bufferImageHeight = 128;
4998 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4999
5000 region.imageSubresource.layerCount = 1;
5001 region.imageExtent.height = 4;
5002 region.imageExtent.width = 4;
5003 region.imageExtent.depth = 1;
5004 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005005 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5006 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005007 m_commandBuffer->EndCommandBuffer();
5008
5009 m_errorMonitor->VerifyFound();
5010
5011 vkDestroyBuffer(m_device->device(), buffer, NULL);
5012 vkFreeMemory(m_device->handle(), mem, NULL);
5013}
5014
Tobin Ehlis85940f52016-07-07 16:57:21 -06005015TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005016 TEST_DESCRIPTION(
5017 "Attempt to draw with a command buffer that is invalid "
5018 "due to an event dependency being destroyed.");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005019 ASSERT_NO_FATAL_FAILURE(InitState());
5020
5021 VkEvent event;
5022 VkEventCreateInfo evci = {};
5023 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5024 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5025 ASSERT_VK_SUCCESS(result);
5026
5027 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005028 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005029 m_commandBuffer->EndCommandBuffer();
5030
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005032 // Destroy event dependency prior to submit to cause ERROR
5033 vkDestroyEvent(m_device->device(), event, NULL);
5034
5035 VkSubmitInfo submit_info = {};
5036 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5037 submit_info.commandBufferCount = 1;
5038 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5039 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5040
5041 m_errorMonitor->VerifyFound();
5042}
5043
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005044TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005045 TEST_DESCRIPTION(
5046 "Attempt to draw with a command buffer that is invalid "
5047 "due to a query pool dependency being destroyed.");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005048 ASSERT_NO_FATAL_FAILURE(InitState());
5049
5050 VkQueryPool query_pool;
5051 VkQueryPoolCreateInfo qpci{};
5052 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5053 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5054 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005055 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005056 ASSERT_VK_SUCCESS(result);
5057
5058 m_commandBuffer->BeginCommandBuffer();
5059 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5060 m_commandBuffer->EndCommandBuffer();
5061
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005062 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005063 // Destroy query pool dependency prior to submit to cause ERROR
5064 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5065
5066 VkSubmitInfo submit_info = {};
5067 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5068 submit_info.commandBufferCount = 1;
5069 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5070 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5071
5072 m_errorMonitor->VerifyFound();
5073}
5074
Tobin Ehlis24130d92016-07-08 15:50:53 -06005075TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005076 TEST_DESCRIPTION(
5077 "Attempt to draw with a command buffer that is invalid "
5078 "due to a pipeline dependency being destroyed.");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005079 ASSERT_NO_FATAL_FAILURE(InitState());
5080 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5081
5082 VkResult err;
5083
5084 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5085 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5086
5087 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005088 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005089 ASSERT_VK_SUCCESS(err);
5090
5091 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5092 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5093 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005094 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005095 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005096 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005097 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005098 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005099
5100 VkPipelineShaderStageCreateInfo shaderStages[2];
5101 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5102
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005103 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005104 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 -06005105 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005106 shaderStages[0] = vs.GetStageCreateInfo();
5107 shaderStages[1] = fs.GetStageCreateInfo();
5108
5109 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5110 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5111
5112 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5113 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5114 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5115
5116 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5117 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005118 rs_ci.rasterizerDiscardEnable = true;
5119 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005120
5121 VkPipelineColorBlendAttachmentState att = {};
5122 att.blendEnable = VK_FALSE;
5123 att.colorWriteMask = 0xf;
5124
5125 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5126 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5127 cb_ci.attachmentCount = 1;
5128 cb_ci.pAttachments = &att;
5129
5130 VkGraphicsPipelineCreateInfo gp_ci = {};
5131 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5132 gp_ci.stageCount = 2;
5133 gp_ci.pStages = shaderStages;
5134 gp_ci.pVertexInputState = &vi_ci;
5135 gp_ci.pInputAssemblyState = &ia_ci;
5136 gp_ci.pViewportState = &vp_state_ci;
5137 gp_ci.pRasterizationState = &rs_ci;
5138 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005139 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5140 gp_ci.layout = pipeline_layout;
5141 gp_ci.renderPass = renderPass();
5142
5143 VkPipelineCacheCreateInfo pc_ci = {};
5144 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5145
5146 VkPipeline pipeline;
5147 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005148 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005149 ASSERT_VK_SUCCESS(err);
5150
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005151 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005152 ASSERT_VK_SUCCESS(err);
5153
5154 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005155 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005156 m_commandBuffer->EndCommandBuffer();
5157 // Now destroy pipeline in order to cause error when submitting
5158 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5159
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005161
5162 VkSubmitInfo submit_info = {};
5163 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5164 submit_info.commandBufferCount = 1;
5165 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5166 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5167
5168 m_errorMonitor->VerifyFound();
5169 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5170 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5171}
5172
Tobin Ehlis31289162016-08-17 14:57:58 -06005173TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005174 TEST_DESCRIPTION(
5175 "Attempt to draw with a command buffer that is invalid "
5176 "due to a bound descriptor set with a buffer dependency "
5177 "being destroyed.");
Tobin Ehlis31289162016-08-17 14:57:58 -06005178 ASSERT_NO_FATAL_FAILURE(InitState());
5179 ASSERT_NO_FATAL_FAILURE(InitViewport());
5180 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5181
5182 VkDescriptorPoolSize ds_type_count = {};
5183 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5184 ds_type_count.descriptorCount = 1;
5185
5186 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5187 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5188 ds_pool_ci.pNext = NULL;
5189 ds_pool_ci.maxSets = 1;
5190 ds_pool_ci.poolSizeCount = 1;
5191 ds_pool_ci.pPoolSizes = &ds_type_count;
5192
5193 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005194 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005195 ASSERT_VK_SUCCESS(err);
5196
5197 VkDescriptorSetLayoutBinding dsl_binding = {};
5198 dsl_binding.binding = 0;
5199 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5200 dsl_binding.descriptorCount = 1;
5201 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5202 dsl_binding.pImmutableSamplers = NULL;
5203
5204 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5205 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5206 ds_layout_ci.pNext = NULL;
5207 ds_layout_ci.bindingCount = 1;
5208 ds_layout_ci.pBindings = &dsl_binding;
5209 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005210 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005211 ASSERT_VK_SUCCESS(err);
5212
5213 VkDescriptorSet descriptorSet;
5214 VkDescriptorSetAllocateInfo alloc_info = {};
5215 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5216 alloc_info.descriptorSetCount = 1;
5217 alloc_info.descriptorPool = ds_pool;
5218 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005219 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005220 ASSERT_VK_SUCCESS(err);
5221
5222 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5223 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5224 pipeline_layout_ci.pNext = NULL;
5225 pipeline_layout_ci.setLayoutCount = 1;
5226 pipeline_layout_ci.pSetLayouts = &ds_layout;
5227
5228 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005229 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005230 ASSERT_VK_SUCCESS(err);
5231
5232 // Create a buffer to update the descriptor with
5233 uint32_t qfi = 0;
5234 VkBufferCreateInfo buffCI = {};
5235 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5236 buffCI.size = 1024;
5237 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5238 buffCI.queueFamilyIndexCount = 1;
5239 buffCI.pQueueFamilyIndices = &qfi;
5240
5241 VkBuffer buffer;
5242 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5243 ASSERT_VK_SUCCESS(err);
5244 // Allocate memory and bind to buffer so we can make it to the appropriate
5245 // error
5246 VkMemoryAllocateInfo mem_alloc = {};
5247 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5248 mem_alloc.pNext = NULL;
5249 mem_alloc.allocationSize = 1024;
5250 mem_alloc.memoryTypeIndex = 0;
5251
5252 VkMemoryRequirements memReqs;
5253 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005254 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005255 if (!pass) {
5256 vkDestroyBuffer(m_device->device(), buffer, NULL);
5257 return;
5258 }
5259
5260 VkDeviceMemory mem;
5261 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5262 ASSERT_VK_SUCCESS(err);
5263 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5264 ASSERT_VK_SUCCESS(err);
5265 // Correctly update descriptor to avoid "NOT_UPDATED" error
5266 VkDescriptorBufferInfo buffInfo = {};
5267 buffInfo.buffer = buffer;
5268 buffInfo.offset = 0;
5269 buffInfo.range = 1024;
5270
5271 VkWriteDescriptorSet descriptor_write;
5272 memset(&descriptor_write, 0, sizeof(descriptor_write));
5273 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5274 descriptor_write.dstSet = descriptorSet;
5275 descriptor_write.dstBinding = 0;
5276 descriptor_write.descriptorCount = 1;
5277 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5278 descriptor_write.pBufferInfo = &buffInfo;
5279
5280 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5281
5282 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005283 char const *vsSource =
5284 "#version 450\n"
5285 "\n"
5286 "out gl_PerVertex { \n"
5287 " vec4 gl_Position;\n"
5288 "};\n"
5289 "void main(){\n"
5290 " gl_Position = vec4(1);\n"
5291 "}\n";
5292 char const *fsSource =
5293 "#version 450\n"
5294 "\n"
5295 "layout(location=0) out vec4 x;\n"
5296 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5297 "void main(){\n"
5298 " x = vec4(bar.y);\n"
5299 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005300 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5301 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5302 VkPipelineObj pipe(m_device);
5303 pipe.AddShader(&vs);
5304 pipe.AddShader(&fs);
5305 pipe.AddColorAttachment();
5306 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5307
Tony Barbour552f6c02016-12-21 14:34:07 -07005308 m_commandBuffer->BeginCommandBuffer();
5309 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005310 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5311 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5312 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005313
5314 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5315 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5316
Tobin Ehlis31289162016-08-17 14:57:58 -06005317 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005318 m_commandBuffer->EndRenderPass();
5319 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005321 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5322 vkDestroyBuffer(m_device->device(), buffer, NULL);
5323 // Attempt to submit cmd buffer
5324 VkSubmitInfo submit_info = {};
5325 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5326 submit_info.commandBufferCount = 1;
5327 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5328 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5329 m_errorMonitor->VerifyFound();
5330 // Cleanup
5331 vkFreeMemory(m_device->device(), mem, NULL);
5332
5333 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5334 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5335 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5336}
5337
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005338TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005339 TEST_DESCRIPTION(
5340 "Attempt to draw with a command buffer that is invalid "
5341 "due to a bound descriptor sets with a combined image "
5342 "sampler having their image, sampler, and descriptor set "
5343 "each respectively destroyed and then attempting to "
5344 "submit associated cmd buffers. Attempt to destroy a "
5345 "DescriptorSet that is in use.");
Rene Lindsayed88b732017-01-27 15:55:29 -07005346 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005347 ASSERT_NO_FATAL_FAILURE(InitViewport());
5348 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5349
5350 VkDescriptorPoolSize ds_type_count = {};
5351 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5352 ds_type_count.descriptorCount = 1;
5353
5354 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5355 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5356 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005357 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005358 ds_pool_ci.maxSets = 1;
5359 ds_pool_ci.poolSizeCount = 1;
5360 ds_pool_ci.pPoolSizes = &ds_type_count;
5361
5362 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005363 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005364 ASSERT_VK_SUCCESS(err);
5365
5366 VkDescriptorSetLayoutBinding dsl_binding = {};
5367 dsl_binding.binding = 0;
5368 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5369 dsl_binding.descriptorCount = 1;
5370 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5371 dsl_binding.pImmutableSamplers = NULL;
5372
5373 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5374 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5375 ds_layout_ci.pNext = NULL;
5376 ds_layout_ci.bindingCount = 1;
5377 ds_layout_ci.pBindings = &dsl_binding;
5378 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005379 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005380 ASSERT_VK_SUCCESS(err);
5381
5382 VkDescriptorSet descriptorSet;
5383 VkDescriptorSetAllocateInfo alloc_info = {};
5384 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5385 alloc_info.descriptorSetCount = 1;
5386 alloc_info.descriptorPool = ds_pool;
5387 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005388 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005389 ASSERT_VK_SUCCESS(err);
5390
5391 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5392 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5393 pipeline_layout_ci.pNext = NULL;
5394 pipeline_layout_ci.setLayoutCount = 1;
5395 pipeline_layout_ci.pSetLayouts = &ds_layout;
5396
5397 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005398 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005399 ASSERT_VK_SUCCESS(err);
5400
5401 // Create images to update the descriptor with
5402 VkImage image;
5403 VkImage image2;
5404 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5405 const int32_t tex_width = 32;
5406 const int32_t tex_height = 32;
5407 VkImageCreateInfo image_create_info = {};
5408 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5409 image_create_info.pNext = NULL;
5410 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5411 image_create_info.format = tex_format;
5412 image_create_info.extent.width = tex_width;
5413 image_create_info.extent.height = tex_height;
5414 image_create_info.extent.depth = 1;
5415 image_create_info.mipLevels = 1;
5416 image_create_info.arrayLayers = 1;
5417 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5418 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5419 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5420 image_create_info.flags = 0;
5421 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5422 ASSERT_VK_SUCCESS(err);
5423 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5424 ASSERT_VK_SUCCESS(err);
5425
5426 VkMemoryRequirements memory_reqs;
5427 VkDeviceMemory image_memory;
5428 bool pass;
5429 VkMemoryAllocateInfo memory_info = {};
5430 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5431 memory_info.pNext = NULL;
5432 memory_info.allocationSize = 0;
5433 memory_info.memoryTypeIndex = 0;
5434 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5435 // Allocate enough memory for both images
5436 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005437 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005438 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005439 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005440 ASSERT_VK_SUCCESS(err);
5441 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5442 ASSERT_VK_SUCCESS(err);
5443 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005444 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005445 ASSERT_VK_SUCCESS(err);
5446
5447 VkImageViewCreateInfo image_view_create_info = {};
5448 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5449 image_view_create_info.image = image;
5450 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5451 image_view_create_info.format = tex_format;
5452 image_view_create_info.subresourceRange.layerCount = 1;
5453 image_view_create_info.subresourceRange.baseMipLevel = 0;
5454 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005455 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005456
5457 VkImageView view;
5458 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005459 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005460 ASSERT_VK_SUCCESS(err);
5461 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005462 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005463 ASSERT_VK_SUCCESS(err);
5464 // Create Samplers
5465 VkSamplerCreateInfo sampler_ci = {};
5466 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5467 sampler_ci.pNext = NULL;
5468 sampler_ci.magFilter = VK_FILTER_NEAREST;
5469 sampler_ci.minFilter = VK_FILTER_NEAREST;
5470 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5471 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5472 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5473 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5474 sampler_ci.mipLodBias = 1.0;
5475 sampler_ci.anisotropyEnable = VK_FALSE;
5476 sampler_ci.maxAnisotropy = 1;
5477 sampler_ci.compareEnable = VK_FALSE;
5478 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5479 sampler_ci.minLod = 1.0;
5480 sampler_ci.maxLod = 1.0;
5481 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5482 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5483 VkSampler sampler;
5484 VkSampler sampler2;
5485 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5486 ASSERT_VK_SUCCESS(err);
5487 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5488 ASSERT_VK_SUCCESS(err);
5489 // Update descriptor with image and sampler
5490 VkDescriptorImageInfo img_info = {};
5491 img_info.sampler = sampler;
5492 img_info.imageView = view;
5493 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5494
5495 VkWriteDescriptorSet descriptor_write;
5496 memset(&descriptor_write, 0, sizeof(descriptor_write));
5497 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5498 descriptor_write.dstSet = descriptorSet;
5499 descriptor_write.dstBinding = 0;
5500 descriptor_write.descriptorCount = 1;
5501 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5502 descriptor_write.pImageInfo = &img_info;
5503
5504 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5505
5506 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005507 char const *vsSource =
5508 "#version 450\n"
5509 "\n"
5510 "out gl_PerVertex { \n"
5511 " vec4 gl_Position;\n"
5512 "};\n"
5513 "void main(){\n"
5514 " gl_Position = vec4(1);\n"
5515 "}\n";
5516 char const *fsSource =
5517 "#version 450\n"
5518 "\n"
5519 "layout(set=0, binding=0) uniform sampler2D s;\n"
5520 "layout(location=0) out vec4 x;\n"
5521 "void main(){\n"
5522 " x = texture(s, vec2(1));\n"
5523 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005524 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5525 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5526 VkPipelineObj pipe(m_device);
5527 pipe.AddShader(&vs);
5528 pipe.AddShader(&fs);
5529 pipe.AddColorAttachment();
5530 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5531
5532 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted sampler ");
Tony Barbour552f6c02016-12-21 14:34:07 -07005534 m_commandBuffer->BeginCommandBuffer();
5535 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005536 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5537 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5538 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005539 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5540 VkRect2D scissor = {{0, 0}, {16, 16}};
5541 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5542 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005543 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005544 m_commandBuffer->EndRenderPass();
5545 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005546 // Destroy sampler invalidates the cmd buffer, causing error on submit
5547 vkDestroySampler(m_device->device(), sampler, NULL);
5548 // Attempt to submit cmd buffer
5549 VkSubmitInfo submit_info = {};
5550 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5551 submit_info.commandBufferCount = 1;
5552 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5553 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5554 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005555
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005556 // Now re-update descriptor with valid sampler and delete image
5557 img_info.sampler = sampler2;
5558 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005559
5560 VkCommandBufferBeginInfo info = {};
5561 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5562 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5563
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005564 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005565 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005566 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005567 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5568 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5569 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005570 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5571 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005572 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005573 m_commandBuffer->EndRenderPass();
5574 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005575 // Destroy image invalidates the cmd buffer, causing error on submit
5576 vkDestroyImage(m_device->device(), image, NULL);
5577 // Attempt to submit cmd buffer
5578 submit_info = {};
5579 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5580 submit_info.commandBufferCount = 1;
5581 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5582 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5583 m_errorMonitor->VerifyFound();
5584 // Now update descriptor to be valid, but then free descriptor
5585 img_info.imageView = view2;
5586 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005587 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005588 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005589 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5590 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5591 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005592 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5593 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005594 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005595 m_commandBuffer->EndRenderPass();
5596 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07005597 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07005598
5599 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005601 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06005602 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07005603
5604 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07005605 // 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 -07005606 vkQueueWaitIdle(m_device->m_queue);
5607 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
5608
5609 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005610 submit_info = {};
5611 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5612 submit_info.commandBufferCount = 1;
5613 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07005614 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005615 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5616 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07005617
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005618 // Cleanup
5619 vkFreeMemory(m_device->device(), image_memory, NULL);
5620 vkDestroySampler(m_device->device(), sampler2, NULL);
5621 vkDestroyImage(m_device->device(), image2, NULL);
5622 vkDestroyImageView(m_device->device(), view, NULL);
5623 vkDestroyImageView(m_device->device(), view2, NULL);
5624 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5625 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5626 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5627}
5628
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005629TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
5630 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
5631 ASSERT_NO_FATAL_FAILURE(InitState());
5632 ASSERT_NO_FATAL_FAILURE(InitViewport());
5633 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5634
5635 VkDescriptorPoolSize ds_type_count = {};
5636 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5637 ds_type_count.descriptorCount = 1;
5638
5639 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5640 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5641 ds_pool_ci.pNext = NULL;
5642 ds_pool_ci.maxSets = 1;
5643 ds_pool_ci.poolSizeCount = 1;
5644 ds_pool_ci.pPoolSizes = &ds_type_count;
5645
5646 VkDescriptorPool ds_pool;
5647 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5648 ASSERT_VK_SUCCESS(err);
5649
5650 VkDescriptorSetLayoutBinding dsl_binding = {};
5651 dsl_binding.binding = 0;
5652 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5653 dsl_binding.descriptorCount = 1;
5654 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5655 dsl_binding.pImmutableSamplers = NULL;
5656
5657 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5658 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5659 ds_layout_ci.pNext = NULL;
5660 ds_layout_ci.bindingCount = 1;
5661 ds_layout_ci.pBindings = &dsl_binding;
5662 VkDescriptorSetLayout ds_layout;
5663 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
5664 ASSERT_VK_SUCCESS(err);
5665
5666 VkDescriptorSet descriptor_set;
5667 VkDescriptorSetAllocateInfo alloc_info = {};
5668 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5669 alloc_info.descriptorSetCount = 1;
5670 alloc_info.descriptorPool = ds_pool;
5671 alloc_info.pSetLayouts = &ds_layout;
5672 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
5673 ASSERT_VK_SUCCESS(err);
5674
5675 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5676 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5677 pipeline_layout_ci.pNext = NULL;
5678 pipeline_layout_ci.setLayoutCount = 1;
5679 pipeline_layout_ci.pSetLayouts = &ds_layout;
5680
5681 VkPipelineLayout pipeline_layout;
5682 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5683 ASSERT_VK_SUCCESS(err);
5684
5685 // Create image to update the descriptor with
5686 VkImageObj image(m_device);
5687 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5688 ASSERT_TRUE(image.initialized());
5689
5690 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5691 // Create Sampler
5692 VkSamplerCreateInfo sampler_ci = {};
5693 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5694 sampler_ci.pNext = NULL;
5695 sampler_ci.magFilter = VK_FILTER_NEAREST;
5696 sampler_ci.minFilter = VK_FILTER_NEAREST;
5697 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5698 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5699 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5700 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5701 sampler_ci.mipLodBias = 1.0;
5702 sampler_ci.anisotropyEnable = VK_FALSE;
5703 sampler_ci.maxAnisotropy = 1;
5704 sampler_ci.compareEnable = VK_FALSE;
5705 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5706 sampler_ci.minLod = 1.0;
5707 sampler_ci.maxLod = 1.0;
5708 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5709 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5710 VkSampler sampler;
5711 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5712 ASSERT_VK_SUCCESS(err);
5713 // Update descriptor with image and sampler
5714 VkDescriptorImageInfo img_info = {};
5715 img_info.sampler = sampler;
5716 img_info.imageView = view;
5717 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5718
5719 VkWriteDescriptorSet descriptor_write;
5720 memset(&descriptor_write, 0, sizeof(descriptor_write));
5721 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5722 descriptor_write.dstSet = descriptor_set;
5723 descriptor_write.dstBinding = 0;
5724 descriptor_write.descriptorCount = 1;
5725 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5726 descriptor_write.pImageInfo = &img_info;
5727
5728 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5729
5730 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005731 char const *vsSource =
5732 "#version 450\n"
5733 "\n"
5734 "out gl_PerVertex { \n"
5735 " vec4 gl_Position;\n"
5736 "};\n"
5737 "void main(){\n"
5738 " gl_Position = vec4(1);\n"
5739 "}\n";
5740 char const *fsSource =
5741 "#version 450\n"
5742 "\n"
5743 "layout(set=0, binding=0) uniform sampler2D s;\n"
5744 "layout(location=0) out vec4 x;\n"
5745 "void main(){\n"
5746 " x = texture(s, vec2(1));\n"
5747 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005748 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5749 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5750 VkPipelineObj pipe(m_device);
5751 pipe.AddShader(&vs);
5752 pipe.AddShader(&fs);
5753 pipe.AddColorAttachment();
5754 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5755
Tony Barbour552f6c02016-12-21 14:34:07 -07005756 m_commandBuffer->BeginCommandBuffer();
5757 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005758 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5759 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5760 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07005761
5762 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5763 VkRect2D scissor = {{0, 0}, {16, 16}};
5764 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5765 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
5766
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005767 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005768 m_commandBuffer->EndRenderPass();
5769 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005770 // Submit cmd buffer to put pool in-flight
5771 VkSubmitInfo submit_info = {};
5772 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5773 submit_info.commandBufferCount = 1;
5774 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5775 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5776 // Destroy pool while in-flight, causing error
5777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
5778 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5779 m_errorMonitor->VerifyFound();
5780 vkQueueWaitIdle(m_device->m_queue);
5781 // Cleanup
5782 vkDestroySampler(m_device->device(), sampler, NULL);
5783 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5784 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5785 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07005786 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005787}
5788
Tobin Ehlis50a095d2016-09-21 17:32:49 -06005789TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
5790 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
5791 ASSERT_NO_FATAL_FAILURE(InitState());
5792 ASSERT_NO_FATAL_FAILURE(InitViewport());
5793 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5794
5795 VkDescriptorPoolSize ds_type_count = {};
5796 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5797 ds_type_count.descriptorCount = 1;
5798
5799 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5800 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5801 ds_pool_ci.pNext = NULL;
5802 ds_pool_ci.maxSets = 1;
5803 ds_pool_ci.poolSizeCount = 1;
5804 ds_pool_ci.pPoolSizes = &ds_type_count;
5805
5806 VkDescriptorPool ds_pool;
5807 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5808 ASSERT_VK_SUCCESS(err);
5809
5810 VkDescriptorSetLayoutBinding dsl_binding = {};
5811 dsl_binding.binding = 0;
5812 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5813 dsl_binding.descriptorCount = 1;
5814 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5815 dsl_binding.pImmutableSamplers = NULL;
5816
5817 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5818 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5819 ds_layout_ci.pNext = NULL;
5820 ds_layout_ci.bindingCount = 1;
5821 ds_layout_ci.pBindings = &dsl_binding;
5822 VkDescriptorSetLayout ds_layout;
5823 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
5824 ASSERT_VK_SUCCESS(err);
5825
5826 VkDescriptorSet descriptorSet;
5827 VkDescriptorSetAllocateInfo alloc_info = {};
5828 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5829 alloc_info.descriptorSetCount = 1;
5830 alloc_info.descriptorPool = ds_pool;
5831 alloc_info.pSetLayouts = &ds_layout;
5832 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
5833 ASSERT_VK_SUCCESS(err);
5834
5835 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5836 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5837 pipeline_layout_ci.pNext = NULL;
5838 pipeline_layout_ci.setLayoutCount = 1;
5839 pipeline_layout_ci.pSetLayouts = &ds_layout;
5840
5841 VkPipelineLayout pipeline_layout;
5842 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5843 ASSERT_VK_SUCCESS(err);
5844
5845 // Create images to update the descriptor with
5846 VkImage image;
5847 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5848 const int32_t tex_width = 32;
5849 const int32_t tex_height = 32;
5850 VkImageCreateInfo image_create_info = {};
5851 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5852 image_create_info.pNext = NULL;
5853 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5854 image_create_info.format = tex_format;
5855 image_create_info.extent.width = tex_width;
5856 image_create_info.extent.height = tex_height;
5857 image_create_info.extent.depth = 1;
5858 image_create_info.mipLevels = 1;
5859 image_create_info.arrayLayers = 1;
5860 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5861 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5862 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5863 image_create_info.flags = 0;
5864 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5865 ASSERT_VK_SUCCESS(err);
5866 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
5867 VkMemoryRequirements memory_reqs;
5868 VkDeviceMemory image_memory;
5869 bool pass;
5870 VkMemoryAllocateInfo memory_info = {};
5871 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5872 memory_info.pNext = NULL;
5873 memory_info.allocationSize = 0;
5874 memory_info.memoryTypeIndex = 0;
5875 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5876 // Allocate enough memory for image
5877 memory_info.allocationSize = memory_reqs.size;
5878 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5879 ASSERT_TRUE(pass);
5880 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5881 ASSERT_VK_SUCCESS(err);
5882 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5883 ASSERT_VK_SUCCESS(err);
5884
5885 VkImageViewCreateInfo image_view_create_info = {};
5886 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5887 image_view_create_info.image = image;
5888 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5889 image_view_create_info.format = tex_format;
5890 image_view_create_info.subresourceRange.layerCount = 1;
5891 image_view_create_info.subresourceRange.baseMipLevel = 0;
5892 image_view_create_info.subresourceRange.levelCount = 1;
5893 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5894
5895 VkImageView view;
5896 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
5897 ASSERT_VK_SUCCESS(err);
5898 // Create Samplers
5899 VkSamplerCreateInfo sampler_ci = {};
5900 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5901 sampler_ci.pNext = NULL;
5902 sampler_ci.magFilter = VK_FILTER_NEAREST;
5903 sampler_ci.minFilter = VK_FILTER_NEAREST;
5904 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5905 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5906 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5907 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5908 sampler_ci.mipLodBias = 1.0;
5909 sampler_ci.anisotropyEnable = VK_FALSE;
5910 sampler_ci.maxAnisotropy = 1;
5911 sampler_ci.compareEnable = VK_FALSE;
5912 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5913 sampler_ci.minLod = 1.0;
5914 sampler_ci.maxLod = 1.0;
5915 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5916 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5917 VkSampler sampler;
5918 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5919 ASSERT_VK_SUCCESS(err);
5920 // Update descriptor with image and sampler
5921 VkDescriptorImageInfo img_info = {};
5922 img_info.sampler = sampler;
5923 img_info.imageView = view;
5924 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5925
5926 VkWriteDescriptorSet descriptor_write;
5927 memset(&descriptor_write, 0, sizeof(descriptor_write));
5928 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5929 descriptor_write.dstSet = descriptorSet;
5930 descriptor_write.dstBinding = 0;
5931 descriptor_write.descriptorCount = 1;
5932 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5933 descriptor_write.pImageInfo = &img_info;
5934 // Break memory binding and attempt update
5935 vkFreeMemory(m_device->device(), image_memory, nullptr);
5936 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005937 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06005938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5939 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
5940 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5941 m_errorMonitor->VerifyFound();
5942 // Cleanup
5943 vkDestroyImage(m_device->device(), image, NULL);
5944 vkDestroySampler(m_device->device(), sampler, NULL);
5945 vkDestroyImageView(m_device->device(), view, NULL);
5946 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5947 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5948 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5949}
5950
Karl Schultz6addd812016-02-02 17:17:23 -07005951TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06005952 // Attempt to bind an invalid Pipeline to a valid Command Buffer
5953 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005954 // Create a valid cmd buffer
5955 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06005956 uint64_t fake_pipeline_handle = 0xbaad6001;
5957 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06005958 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005959 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5960
Karl Schultzf78bcdd2016-11-30 12:36:01 -07005961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07005962 m_commandBuffer->BeginCommandBuffer();
5963 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005964 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06005965 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005966
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005967 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005968 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 -06005969 Draw(1, 0, 0, 0);
5970 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005971
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005972 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005973 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 -07005974 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005975 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
5976 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005977}
5978
Karl Schultz6addd812016-02-02 17:17:23 -07005979TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06005980 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07005981 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005982
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005984
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005985 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06005986 ASSERT_NO_FATAL_FAILURE(InitViewport());
5987 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005988 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005989 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5990 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005991
5992 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005993 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5994 ds_pool_ci.pNext = NULL;
5995 ds_pool_ci.maxSets = 1;
5996 ds_pool_ci.poolSizeCount = 1;
5997 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06005998
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005999 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006000 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006001 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006002
Tony Barboureb254902015-07-15 12:50:33 -06006003 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006004 dsl_binding.binding = 0;
6005 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6006 dsl_binding.descriptorCount = 1;
6007 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6008 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006009
Tony Barboureb254902015-07-15 12:50:33 -06006010 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006011 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6012 ds_layout_ci.pNext = NULL;
6013 ds_layout_ci.bindingCount = 1;
6014 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006015 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006016 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006017 ASSERT_VK_SUCCESS(err);
6018
6019 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006020 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006021 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006022 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006023 alloc_info.descriptorPool = ds_pool;
6024 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006025 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006026 ASSERT_VK_SUCCESS(err);
6027
Tony Barboureb254902015-07-15 12:50:33 -06006028 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006029 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6030 pipeline_layout_ci.pNext = NULL;
6031 pipeline_layout_ci.setLayoutCount = 1;
6032 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006033
6034 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006035 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006036 ASSERT_VK_SUCCESS(err);
6037
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006038 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006039 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006040 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006041 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006042
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006043 VkPipelineObj pipe(m_device);
6044 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006045 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006046 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006047 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006048
Tony Barbour552f6c02016-12-21 14:34:07 -07006049 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006050 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6051 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6052 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006053
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006054 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006055
Chia-I Wuf7458c52015-10-26 21:10:41 +08006056 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6057 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6058 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006059}
6060
Karl Schultz6addd812016-02-02 17:17:23 -07006061TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006062 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006063 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006064
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006066
6067 ASSERT_NO_FATAL_FAILURE(InitState());
6068 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006069 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6070 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006071
6072 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006073 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6074 ds_pool_ci.pNext = NULL;
6075 ds_pool_ci.maxSets = 1;
6076 ds_pool_ci.poolSizeCount = 1;
6077 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006078
6079 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006080 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006081 ASSERT_VK_SUCCESS(err);
6082
6083 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006084 dsl_binding.binding = 0;
6085 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6086 dsl_binding.descriptorCount = 1;
6087 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6088 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006089
6090 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006091 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6092 ds_layout_ci.pNext = NULL;
6093 ds_layout_ci.bindingCount = 1;
6094 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006095 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006096 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006097 ASSERT_VK_SUCCESS(err);
6098
6099 VkDescriptorSet descriptorSet;
6100 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006101 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006102 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006103 alloc_info.descriptorPool = ds_pool;
6104 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006105 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006106 ASSERT_VK_SUCCESS(err);
6107
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006108 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006109 VkWriteDescriptorSet descriptor_write;
6110 memset(&descriptor_write, 0, sizeof(descriptor_write));
6111 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6112 descriptor_write.dstSet = descriptorSet;
6113 descriptor_write.dstBinding = 0;
6114 descriptor_write.descriptorCount = 1;
6115 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6116 descriptor_write.pTexelBufferView = &view;
6117
6118 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6119
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006120 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006121
6122 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6123 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6124}
6125
Mark Youngd339ba32016-05-30 13:28:35 -06006126TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006127 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 -06006128
6129 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006131 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006132
6133 ASSERT_NO_FATAL_FAILURE(InitState());
6134
6135 // Create a buffer with no bound memory and then attempt to create
6136 // a buffer view.
6137 VkBufferCreateInfo buff_ci = {};
6138 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006139 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006140 buff_ci.size = 256;
6141 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6142 VkBuffer buffer;
6143 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6144 ASSERT_VK_SUCCESS(err);
6145
6146 VkBufferViewCreateInfo buff_view_ci = {};
6147 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6148 buff_view_ci.buffer = buffer;
6149 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6150 buff_view_ci.range = VK_WHOLE_SIZE;
6151 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006152 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006153
6154 m_errorMonitor->VerifyFound();
6155 vkDestroyBuffer(m_device->device(), buffer, NULL);
6156 // If last error is success, it still created the view, so delete it.
6157 if (err == VK_SUCCESS) {
6158 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6159 }
6160}
6161
Karl Schultz6addd812016-02-02 17:17:23 -07006162TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6163 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6164 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006165 // 1. No dynamicOffset supplied
6166 // 2. Too many dynamicOffsets supplied
6167 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006168 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006169 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6170 " requires 1 dynamicOffsets, but only "
6171 "0 dynamicOffsets are left in "
6172 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006173
6174 ASSERT_NO_FATAL_FAILURE(InitState());
6175 ASSERT_NO_FATAL_FAILURE(InitViewport());
6176 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6177
6178 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006179 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6180 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006181
6182 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006183 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6184 ds_pool_ci.pNext = NULL;
6185 ds_pool_ci.maxSets = 1;
6186 ds_pool_ci.poolSizeCount = 1;
6187 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006188
6189 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006190 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006191 ASSERT_VK_SUCCESS(err);
6192
6193 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006194 dsl_binding.binding = 0;
6195 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6196 dsl_binding.descriptorCount = 1;
6197 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6198 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006199
6200 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006201 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6202 ds_layout_ci.pNext = NULL;
6203 ds_layout_ci.bindingCount = 1;
6204 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006205 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006206 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006207 ASSERT_VK_SUCCESS(err);
6208
6209 VkDescriptorSet descriptorSet;
6210 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006211 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006212 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006213 alloc_info.descriptorPool = ds_pool;
6214 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006215 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006216 ASSERT_VK_SUCCESS(err);
6217
6218 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006219 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6220 pipeline_layout_ci.pNext = NULL;
6221 pipeline_layout_ci.setLayoutCount = 1;
6222 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006223
6224 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006225 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006226 ASSERT_VK_SUCCESS(err);
6227
6228 // Create a buffer to update the descriptor with
6229 uint32_t qfi = 0;
6230 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006231 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6232 buffCI.size = 1024;
6233 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6234 buffCI.queueFamilyIndexCount = 1;
6235 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006236
6237 VkBuffer dyub;
6238 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6239 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006240 // Allocate memory and bind to buffer so we can make it to the appropriate
6241 // error
6242 VkMemoryAllocateInfo mem_alloc = {};
6243 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6244 mem_alloc.pNext = NULL;
6245 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006246 mem_alloc.memoryTypeIndex = 0;
6247
6248 VkMemoryRequirements memReqs;
6249 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006250 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006251 if (!pass) {
6252 vkDestroyBuffer(m_device->device(), dyub, NULL);
6253 return;
6254 }
6255
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006256 VkDeviceMemory mem;
6257 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6258 ASSERT_VK_SUCCESS(err);
6259 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6260 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006261 // Correctly update descriptor to avoid "NOT_UPDATED" error
6262 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006263 buffInfo.buffer = dyub;
6264 buffInfo.offset = 0;
6265 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006266
6267 VkWriteDescriptorSet descriptor_write;
6268 memset(&descriptor_write, 0, sizeof(descriptor_write));
6269 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6270 descriptor_write.dstSet = descriptorSet;
6271 descriptor_write.dstBinding = 0;
6272 descriptor_write.descriptorCount = 1;
6273 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6274 descriptor_write.pBufferInfo = &buffInfo;
6275
6276 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6277
Tony Barbour552f6c02016-12-21 14:34:07 -07006278 m_commandBuffer->BeginCommandBuffer();
6279 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006280 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6281 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006282 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006283 uint32_t pDynOff[2] = {512, 756};
6284 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6286 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6287 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6288 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006289 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006290 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6292 " dynamic offset 512 combined with "
6293 "offset 0 and range 1024 that "
6294 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006295 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006296 char const *vsSource =
6297 "#version 450\n"
6298 "\n"
6299 "out gl_PerVertex { \n"
6300 " vec4 gl_Position;\n"
6301 "};\n"
6302 "void main(){\n"
6303 " gl_Position = vec4(1);\n"
6304 "}\n";
6305 char const *fsSource =
6306 "#version 450\n"
6307 "\n"
6308 "layout(location=0) out vec4 x;\n"
6309 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6310 "void main(){\n"
6311 " x = vec4(bar.y);\n"
6312 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006313 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6314 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6315 VkPipelineObj pipe(m_device);
6316 pipe.AddShader(&vs);
6317 pipe.AddShader(&fs);
6318 pipe.AddColorAttachment();
6319 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6320
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006321 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6322 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6323 VkRect2D scissor = {{0, 0}, {16, 16}};
6324 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6325
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006326 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006327 // This update should succeed, but offset size of 512 will overstep buffer
6328 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006329 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6330 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006331 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006332 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006333
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006334 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006335 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006336
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006337 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006338 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006339 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6340}
6341
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006342TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006343 TEST_DESCRIPTION(
6344 "Attempt to update a descriptor with a non-sparse buffer "
6345 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006346 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006347 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006348 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006349 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6350 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006351
6352 ASSERT_NO_FATAL_FAILURE(InitState());
6353 ASSERT_NO_FATAL_FAILURE(InitViewport());
6354 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6355
6356 VkDescriptorPoolSize ds_type_count = {};
6357 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6358 ds_type_count.descriptorCount = 1;
6359
6360 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6361 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6362 ds_pool_ci.pNext = NULL;
6363 ds_pool_ci.maxSets = 1;
6364 ds_pool_ci.poolSizeCount = 1;
6365 ds_pool_ci.pPoolSizes = &ds_type_count;
6366
6367 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006368 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006369 ASSERT_VK_SUCCESS(err);
6370
6371 VkDescriptorSetLayoutBinding dsl_binding = {};
6372 dsl_binding.binding = 0;
6373 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6374 dsl_binding.descriptorCount = 1;
6375 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6376 dsl_binding.pImmutableSamplers = NULL;
6377
6378 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6379 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6380 ds_layout_ci.pNext = NULL;
6381 ds_layout_ci.bindingCount = 1;
6382 ds_layout_ci.pBindings = &dsl_binding;
6383 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006384 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006385 ASSERT_VK_SUCCESS(err);
6386
6387 VkDescriptorSet descriptorSet;
6388 VkDescriptorSetAllocateInfo alloc_info = {};
6389 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6390 alloc_info.descriptorSetCount = 1;
6391 alloc_info.descriptorPool = ds_pool;
6392 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006393 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006394 ASSERT_VK_SUCCESS(err);
6395
6396 // Create a buffer to update the descriptor with
6397 uint32_t qfi = 0;
6398 VkBufferCreateInfo buffCI = {};
6399 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6400 buffCI.size = 1024;
6401 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6402 buffCI.queueFamilyIndexCount = 1;
6403 buffCI.pQueueFamilyIndices = &qfi;
6404
6405 VkBuffer dyub;
6406 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6407 ASSERT_VK_SUCCESS(err);
6408
6409 // Attempt to update descriptor without binding memory to it
6410 VkDescriptorBufferInfo buffInfo = {};
6411 buffInfo.buffer = dyub;
6412 buffInfo.offset = 0;
6413 buffInfo.range = 1024;
6414
6415 VkWriteDescriptorSet descriptor_write;
6416 memset(&descriptor_write, 0, sizeof(descriptor_write));
6417 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6418 descriptor_write.dstSet = descriptorSet;
6419 descriptor_write.dstBinding = 0;
6420 descriptor_write.descriptorCount = 1;
6421 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6422 descriptor_write.pBufferInfo = &buffInfo;
6423
6424 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6425 m_errorMonitor->VerifyFound();
6426
6427 vkDestroyBuffer(m_device->device(), dyub, NULL);
6428 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6429 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6430}
6431
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006432TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006433 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006434 ASSERT_NO_FATAL_FAILURE(InitState());
6435 ASSERT_NO_FATAL_FAILURE(InitViewport());
6436 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6437
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006438 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006439 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006440 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6441 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6442 pipeline_layout_ci.pushConstantRangeCount = 1;
6443 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6444
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006445 //
6446 // Check for invalid push constant ranges in pipeline layouts.
6447 //
6448 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006449 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006450 char const *msg;
6451 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006452
Karl Schultzc81037d2016-05-12 08:11:23 -06006453 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6454 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6455 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6456 "vkCreatePipelineLayout() call has push constants index 0 with "
6457 "size 0."},
6458 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6459 "vkCreatePipelineLayout() call has push constants index 0 with "
6460 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006461 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006462 "vkCreatePipelineLayout() call has push constants index 0 with "
6463 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006464 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006465 "vkCreatePipelineLayout() call has push constants index 0 with "
6466 "size 0."},
6467 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6468 "vkCreatePipelineLayout() call has push constants index 0 with "
6469 "offset 1. Offset must"},
6470 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6471 "vkCreatePipelineLayout() call has push constants index 0 "
6472 "with offset "},
6473 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6474 "vkCreatePipelineLayout() call has push constants "
6475 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006476 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006477 "vkCreatePipelineLayout() call has push constants index 0 "
6478 "with offset "},
6479 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6480 "vkCreatePipelineLayout() call has push "
6481 "constants index 0 with offset "},
6482 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6483 "vkCreatePipelineLayout() call has push "
6484 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006485 }};
6486
6487 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006488 for (const auto &iter : range_tests) {
6489 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6491 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006492 m_errorMonitor->VerifyFound();
6493 if (VK_SUCCESS == err) {
6494 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6495 }
6496 }
6497
6498 // Check for invalid stage flag
6499 pc_range.offset = 0;
6500 pc_range.size = 16;
6501 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006502 m_errorMonitor->SetDesiredFailureMsg(
6503 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6504 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006505 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006506 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006507 if (VK_SUCCESS == err) {
6508 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6509 }
6510
6511 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06006512 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006513 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006514 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006515 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006516 };
6517
Karl Schultzc81037d2016-05-12 08:11:23 -06006518 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006519 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6520 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6521 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6522 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6523 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006524 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[0, 4), 1:[0, 4)",
6525 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[0, 4), 2:[0, 4)",
6526 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[0, 4), 3:[0, 4)",
6527 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[0, 4), 4:[0, 4)",
6528 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 1:[0, 4), 2:[0, 4)",
6529 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 1:[0, 4), 3:[0, 4)",
6530 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 1:[0, 4), 4:[0, 4)",
6531 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 2:[0, 4), 3:[0, 4)",
6532 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 2:[0, 4), 4:[0, 4)",
6533 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 3:[0, 4), 4:[0, 4)"}},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006534 {
6535 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6536 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6537 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6538 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6539 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006540 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 3:[12, 20), 4:[16, 20)"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006541 },
6542 {
6543 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6544 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6545 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6546 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6547 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006548 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 1:[12, 20)"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006549 },
6550 {
6551 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6552 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6553 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6554 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6555 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006556 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 3:[12, 20)"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006557 },
6558 {
6559 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6560 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
6561 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
6562 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
6563 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006564 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 2:[4, 100)",
6565 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 1:[32, 36), 2:[4, 100)",
6566 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 2:[4, 100), 3:[40, 48)",
6567 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 2:[4, 100), 4:[52, 56)"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006568 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006569
Karl Schultzc81037d2016-05-12 08:11:23 -06006570 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006571 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006572 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006573 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006574 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006575 m_errorMonitor->VerifyFound();
6576 if (VK_SUCCESS == err) {
6577 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6578 }
6579 }
6580
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006581 //
6582 // CmdPushConstants tests
6583 //
Karl Schultzc81037d2016-05-12 08:11:23 -06006584 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006585
6586 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006587 const std::array<PipelineLayoutTestCase, 11> cmd_range_tests = {{
6588 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "vkCmdPushConstants: parameter size must be greater than 0"},
Karl Schultzc81037d2016-05-12 08:11:23 -06006589 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
Dave Houlton197211a2016-12-23 15:26:29 -07006590 "vkCmdPushConstants() call has push constants index 0 with size 1. "
6591 "Size must be a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006592 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Dave Houlton197211a2016-12-23 15:26:29 -07006593 "vkCmdPushConstants() call has push constants index 0 with size 1. "
6594 "Size must be a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006595 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006596 "vkCmdPushConstants() call has push constants with offset 1. "
6597 "Offset must be a multiple of 4."},
6598 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6599 "vkCmdPushConstants() call has push constants with offset 1. "
6600 "Offset must be a multiple of 4."},
6601 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
6602 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
6603 "0x1 not within flag-matching ranges in pipeline layout"},
6604 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
6605 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
6606 "0x1 not within flag-matching ranges in pipeline layout"},
6607 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
6608 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
6609 "0x1 not within flag-matching ranges in pipeline layout"},
6610 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
6611 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
6612 "0x1 not within flag-matching ranges in pipeline layout"},
6613 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6614 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
6615 "any of the ranges in pipeline layout"},
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006616 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06006617 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
6618 "any of the ranges in pipeline layout"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006619 }};
6620
Tony Barbour552f6c02016-12-21 14:34:07 -07006621 m_commandBuffer->BeginCommandBuffer();
6622 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006623
6624 // Setup ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06006625 const VkPushConstantRange pc_range2[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006626 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006627 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006628 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006629 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006630 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006631 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06006632 for (const auto &iter : cmd_range_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6634 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06006635 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006636 m_errorMonitor->VerifyFound();
6637 }
6638
6639 // Check for invalid stage flag
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006640 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006641 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006642 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06006643 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006644
Karl Schultzc81037d2016-05-12 08:11:23 -06006645 // overlapping range tests with cmd
6646 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
6647 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
6648 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
6649 "0x1 not within flag-matching ranges in pipeline layout"},
6650 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6651 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
6652 "0x1 not within flag-matching ranges in pipeline layout"},
6653 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
6654 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
6655 "0x1 not within flag-matching ranges in pipeline layout"},
6656 }};
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006657 // Setup ranges: [0,16), [20,36), [36,44), [44,52), [80,92)
Karl Schultzc81037d2016-05-12 08:11:23 -06006658 const VkPushConstantRange pc_range3[] = {
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006659 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
6660 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12}, {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
Karl Schultzc81037d2016-05-12 08:11:23 -06006661 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006662 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range3) / sizeof(VkPushConstantRange);
Karl Schultzc81037d2016-05-12 08:11:23 -06006663 pipeline_layout_ci.pPushConstantRanges = pc_range3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006664 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzc81037d2016-05-12 08:11:23 -06006665 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06006666 for (const auto &iter : cmd_overlap_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);
6670 m_errorMonitor->VerifyFound();
6671 }
Karl Schultzc81037d2016-05-12 08:11:23 -06006672 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6673
Tony Barbour552f6c02016-12-21 14:34:07 -07006674 m_commandBuffer->EndRenderPass();
6675 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006676}
6677
Karl Schultz6addd812016-02-02 17:17:23 -07006678TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07006679 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07006680 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006681
6682 ASSERT_NO_FATAL_FAILURE(InitState());
6683 ASSERT_NO_FATAL_FAILURE(InitViewport());
6684 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6685
6686 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
6687 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006688 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6689 ds_type_count[0].descriptorCount = 10;
6690 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6691 ds_type_count[1].descriptorCount = 2;
6692 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
6693 ds_type_count[2].descriptorCount = 2;
6694 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
6695 ds_type_count[3].descriptorCount = 5;
6696 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
6697 // type
6698 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6699 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
6700 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006701
6702 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006703 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6704 ds_pool_ci.pNext = NULL;
6705 ds_pool_ci.maxSets = 5;
6706 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
6707 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006708
6709 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006710 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006711 ASSERT_VK_SUCCESS(err);
6712
6713 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
6714 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006715 dsl_binding[0].binding = 0;
6716 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6717 dsl_binding[0].descriptorCount = 5;
6718 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6719 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006720
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006721 // Create layout identical to set0 layout but w/ different stageFlags
6722 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006723 dsl_fs_stage_only.binding = 0;
6724 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6725 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006726 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
6727 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07006728 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006729 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006730 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6731 ds_layout_ci.pNext = NULL;
6732 ds_layout_ci.bindingCount = 1;
6733 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006734 static const uint32_t NUM_LAYOUTS = 4;
6735 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006736 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006737 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
6738 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006739 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006740 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006741 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006742 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006743 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006744 dsl_binding[0].binding = 0;
6745 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006746 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006747 dsl_binding[1].binding = 1;
6748 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
6749 dsl_binding[1].descriptorCount = 2;
6750 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
6751 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006752 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006753 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006754 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006755 ASSERT_VK_SUCCESS(err);
6756 dsl_binding[0].binding = 0;
6757 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006758 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006759 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006760 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006761 ASSERT_VK_SUCCESS(err);
6762 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006763 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006764 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006765 ASSERT_VK_SUCCESS(err);
6766
6767 static const uint32_t NUM_SETS = 4;
6768 VkDescriptorSet descriptorSet[NUM_SETS] = {};
6769 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006770 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006771 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006772 alloc_info.descriptorPool = ds_pool;
6773 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006774 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006775 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006776 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07006777 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006778 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006779 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006780 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006781
6782 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006783 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6784 pipeline_layout_ci.pNext = NULL;
6785 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
6786 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006787
6788 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006789 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006790 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006791 // Create pipelineLayout with only one setLayout
6792 pipeline_layout_ci.setLayoutCount = 1;
6793 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006794 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006795 ASSERT_VK_SUCCESS(err);
6796 // Create pipelineLayout with 2 descriptor setLayout at index 0
6797 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
6798 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006799 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006800 ASSERT_VK_SUCCESS(err);
6801 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
6802 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
6803 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006804 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006805 ASSERT_VK_SUCCESS(err);
6806 // Create pipelineLayout with UB type, but stageFlags for FS only
6807 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
6808 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006809 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006810 ASSERT_VK_SUCCESS(err);
6811 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
6812 VkDescriptorSetLayout pl_bad_s0[2] = {};
6813 pl_bad_s0[0] = ds_layout_fs_only;
6814 pl_bad_s0[1] = ds_layout[1];
6815 pipeline_layout_ci.setLayoutCount = 2;
6816 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
6817 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006818 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006819 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006820
Tobin Ehlis88452832015-12-03 09:40:56 -07006821 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006822 char const *vsSource =
6823 "#version 450\n"
6824 "\n"
6825 "out gl_PerVertex {\n"
6826 " vec4 gl_Position;\n"
6827 "};\n"
6828 "void main(){\n"
6829 " gl_Position = vec4(1);\n"
6830 "}\n";
6831 char const *fsSource =
6832 "#version 450\n"
6833 "\n"
6834 "layout(location=0) out vec4 x;\n"
6835 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6836 "void main(){\n"
6837 " x = vec4(bar.y);\n"
6838 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07006839 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6840 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006841 VkPipelineObj pipe(m_device);
6842 pipe.AddShader(&vs);
6843 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07006844 pipe.AddColorAttachment();
6845 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07006846
Tony Barbour552f6c02016-12-21 14:34:07 -07006847 m_commandBuffer->BeginCommandBuffer();
6848 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07006849
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006850 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006851 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
6852 // of PSO
6853 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
6854 // cmd_pipeline.c
6855 // due to the fact that cmd_alloc_dset_data() has not been called in
6856 // cmd_bind_graphics_pipeline()
6857 // TODO : Want to cause various binding incompatibility issues here to test
6858 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07006859 // First cause various verify_layout_compatibility() fails
6860 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006861 // verify_set_layout_compatibility fail cases:
6862 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006864 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
6865 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006866 m_errorMonitor->VerifyFound();
6867
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006868 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
6870 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
6871 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006872 m_errorMonitor->VerifyFound();
6873
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006874 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07006875 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
6876 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
6878 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
6879 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006880 m_errorMonitor->VerifyFound();
6881
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006882 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
6883 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
6885 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
6886 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006887 m_errorMonitor->VerifyFound();
6888
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006889 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
6890 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6892 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
6893 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
6894 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006895 m_errorMonitor->VerifyFound();
6896
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006897 // Cause INFO messages due to disturbing previously bound Sets
6898 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006899 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6900 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006901 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
6903 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
6904 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006905 m_errorMonitor->VerifyFound();
6906
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006907 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6908 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006909 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006910 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6911 " newly bound as set #0 so set #1 and "
6912 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006913 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
6914 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006915 m_errorMonitor->VerifyFound();
6916
Tobin Ehlis10fad692016-07-07 12:00:36 -06006917 // Now that we're done actively using the pipelineLayout that gfx pipeline
6918 // was created with, we should be able to delete it. Do that now to verify
6919 // that validation obeys pipelineLayout lifetime
6920 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
6921
Tobin Ehlis88452832015-12-03 09:40:56 -07006922 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07006923 // 1. Error due to not binding required set (we actually use same code as
6924 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006925 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6926 &descriptorSet[0], 0, NULL);
6927 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
6928 &descriptorSet[1], 0, NULL);
6929 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 -07006930
6931 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6932 VkRect2D scissor = {{0, 0}, {16, 16}};
6933 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6934 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6935
Tobin Ehlis88452832015-12-03 09:40:56 -07006936 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006937 m_errorMonitor->VerifyFound();
6938
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006939 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07006940 // 2. Error due to bound set not being compatible with PSO's
6941 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006942 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6943 &descriptorSet[0], 0, NULL);
6944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07006945 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006946 m_errorMonitor->VerifyFound();
6947
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006948 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07006949 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006950 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
6951 }
6952 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006953 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6954 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6955}
Tobin Ehlis559c6382015-11-05 09:52:49 -07006956
Karl Schultz6addd812016-02-02 17:17:23 -07006957TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006958 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6959 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006960
6961 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006962 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006963 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006964 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006965
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006966 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006967}
6968
Karl Schultz6addd812016-02-02 17:17:23 -07006969TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
6970 VkResult err;
6971 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006972
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006974
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006975 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006976
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006977 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006978 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06006979 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006980 cmd.commandPool = m_commandPool;
6981 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006982 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06006983
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006984 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06006985 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006986
6987 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07006988 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07006989 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
6990
6991 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006992 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06006993 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006994 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 -07006995 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006996
6997 // The error should be caught by validation of the BeginCommandBuffer call
6998 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
6999
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007000 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007001 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007002}
7003
Karl Schultz6addd812016-02-02 17:17:23 -07007004TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007005 // Cause error due to Begin while recording CB
7006 // Then cause 2 errors for attempting to reset CB w/o having
7007 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7008 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007009 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007010
7011 ASSERT_NO_FATAL_FAILURE(InitState());
7012
7013 // Calls AllocateCommandBuffers
7014 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7015
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007016 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007017 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007018 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7019 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007020 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7021 cmd_buf_info.pNext = NULL;
7022 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007023 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007024
7025 // Begin CB to transition to recording state
7026 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7027 // Can't re-begin. This should trigger error
7028 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007029 m_errorMonitor->VerifyFound();
7030
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007032 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007033 // Reset attempt will trigger error due to incorrect CommandPool state
7034 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007035 m_errorMonitor->VerifyFound();
7036
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007037 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007038 // Transition CB to RECORDED state
7039 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7040 // Now attempting to Begin will implicitly reset, which triggers error
7041 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007042 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007043}
7044
Karl Schultz6addd812016-02-02 17:17:23 -07007045TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007046 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007047 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007048
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007049 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7050 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007051
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007052 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007053 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007054
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007055 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007056 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7057 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007058
7059 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007060 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7061 ds_pool_ci.pNext = NULL;
7062 ds_pool_ci.maxSets = 1;
7063 ds_pool_ci.poolSizeCount = 1;
7064 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007065
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007066 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007067 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007068 ASSERT_VK_SUCCESS(err);
7069
Tony Barboureb254902015-07-15 12:50:33 -06007070 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007071 dsl_binding.binding = 0;
7072 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7073 dsl_binding.descriptorCount = 1;
7074 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7075 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007076
Tony Barboureb254902015-07-15 12:50:33 -06007077 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007078 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7079 ds_layout_ci.pNext = NULL;
7080 ds_layout_ci.bindingCount = 1;
7081 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007082
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007083 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007084 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007085 ASSERT_VK_SUCCESS(err);
7086
7087 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007088 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007089 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007090 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007091 alloc_info.descriptorPool = ds_pool;
7092 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007093 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007094 ASSERT_VK_SUCCESS(err);
7095
Tony Barboureb254902015-07-15 12:50:33 -06007096 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007097 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7098 pipeline_layout_ci.setLayoutCount = 1;
7099 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007100
7101 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007102 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007103 ASSERT_VK_SUCCESS(err);
7104
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007105 VkViewport vp = {}; // Just need dummy vp to point to
7106 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007107
7108 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007109 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7110 vp_state_ci.scissorCount = 1;
7111 vp_state_ci.pScissors = &sc;
7112 vp_state_ci.viewportCount = 1;
7113 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007114
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007115 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7116 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7117 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7118 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7119 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7120 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007121 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007122 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007123 rs_state_ci.lineWidth = 1.0f;
7124
7125 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7126 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7127 vi_ci.pNext = nullptr;
7128 vi_ci.vertexBindingDescriptionCount = 0;
7129 vi_ci.pVertexBindingDescriptions = nullptr;
7130 vi_ci.vertexAttributeDescriptionCount = 0;
7131 vi_ci.pVertexAttributeDescriptions = nullptr;
7132
7133 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7134 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7135 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7136
7137 VkPipelineShaderStageCreateInfo shaderStages[2];
7138 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7139
7140 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7141 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7142 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
7143 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007144
Tony Barboureb254902015-07-15 12:50:33 -06007145 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007146 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7147 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007148 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007149 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7150 gp_ci.layout = pipeline_layout;
7151 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007152 gp_ci.pVertexInputState = &vi_ci;
7153 gp_ci.pInputAssemblyState = &ia_ci;
7154
7155 gp_ci.stageCount = 1;
7156 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007157
7158 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007159 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7160 pc_ci.initialDataSize = 0;
7161 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007162
7163 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007164 VkPipelineCache pipelineCache;
7165
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007166 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007167 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007168 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007169 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007170
Chia-I Wuf7458c52015-10-26 21:10:41 +08007171 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7172 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7173 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7174 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007175}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007176
Tobin Ehlis912df022015-09-17 08:46:18 -06007177/*// TODO : This test should be good, but needs Tess support in compiler to run
7178TEST_F(VkLayerTest, InvalidPatchControlPoints)
7179{
7180 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007181 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007182
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007184 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7185primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007186
Tobin Ehlis912df022015-09-17 08:46:18 -06007187 ASSERT_NO_FATAL_FAILURE(InitState());
7188 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007189
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007190 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007191 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007192 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007193
7194 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7195 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7196 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007197 ds_pool_ci.poolSizeCount = 1;
7198 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007199
7200 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007201 err = vkCreateDescriptorPool(m_device->device(),
7202VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007203 ASSERT_VK_SUCCESS(err);
7204
7205 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007206 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007207 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007208 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007209 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7210 dsl_binding.pImmutableSamplers = NULL;
7211
7212 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007213 ds_layout_ci.sType =
7214VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007215 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007216 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007217 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007218
7219 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007220 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7221&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007222 ASSERT_VK_SUCCESS(err);
7223
7224 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007225 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7226VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007227 ASSERT_VK_SUCCESS(err);
7228
7229 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007230 pipeline_layout_ci.sType =
7231VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007232 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007233 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007234 pipeline_layout_ci.pSetLayouts = &ds_layout;
7235
7236 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007237 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7238&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007239 ASSERT_VK_SUCCESS(err);
7240
7241 VkPipelineShaderStageCreateInfo shaderStages[3];
7242 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7243
Karl Schultz6addd812016-02-02 17:17:23 -07007244 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7245this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007246 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007247 VkShaderObj
7248tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7249this);
7250 VkShaderObj
7251te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7252this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007253
Karl Schultz6addd812016-02-02 17:17:23 -07007254 shaderStages[0].sType =
7255VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007256 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007257 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007258 shaderStages[1].sType =
7259VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007260 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007261 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007262 shaderStages[2].sType =
7263VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007264 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007265 shaderStages[2].shader = te.handle();
7266
7267 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007268 iaCI.sType =
7269VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007270 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007271
7272 VkPipelineTessellationStateCreateInfo tsCI = {};
7273 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7274 tsCI.patchControlPoints = 0; // This will cause an error
7275
7276 VkGraphicsPipelineCreateInfo gp_ci = {};
7277 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7278 gp_ci.pNext = NULL;
7279 gp_ci.stageCount = 3;
7280 gp_ci.pStages = shaderStages;
7281 gp_ci.pVertexInputState = NULL;
7282 gp_ci.pInputAssemblyState = &iaCI;
7283 gp_ci.pTessellationState = &tsCI;
7284 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007285 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007286 gp_ci.pMultisampleState = NULL;
7287 gp_ci.pDepthStencilState = NULL;
7288 gp_ci.pColorBlendState = NULL;
7289 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7290 gp_ci.layout = pipeline_layout;
7291 gp_ci.renderPass = renderPass();
7292
7293 VkPipelineCacheCreateInfo pc_ci = {};
7294 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7295 pc_ci.pNext = NULL;
7296 pc_ci.initialSize = 0;
7297 pc_ci.initialData = 0;
7298 pc_ci.maxSize = 0;
7299
7300 VkPipeline pipeline;
7301 VkPipelineCache pipelineCache;
7302
Karl Schultz6addd812016-02-02 17:17:23 -07007303 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7304&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007305 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007306 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7307&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007308
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007309 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007310
Chia-I Wuf7458c52015-10-26 21:10:41 +08007311 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7312 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7313 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7314 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007315}
7316*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007317
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007318TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007319 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007320
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007321 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007322
Tobin Ehlise68360f2015-10-01 11:15:13 -06007323 ASSERT_NO_FATAL_FAILURE(InitState());
7324 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007325
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007326 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007327 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7328 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007329
7330 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007331 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7332 ds_pool_ci.maxSets = 1;
7333 ds_pool_ci.poolSizeCount = 1;
7334 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007335
7336 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007337 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007338 ASSERT_VK_SUCCESS(err);
7339
7340 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007341 dsl_binding.binding = 0;
7342 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7343 dsl_binding.descriptorCount = 1;
7344 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007345
7346 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007347 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7348 ds_layout_ci.bindingCount = 1;
7349 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007350
7351 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007352 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007353 ASSERT_VK_SUCCESS(err);
7354
7355 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007356 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007357 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007358 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007359 alloc_info.descriptorPool = ds_pool;
7360 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007361 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007362 ASSERT_VK_SUCCESS(err);
7363
7364 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007365 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7366 pipeline_layout_ci.setLayoutCount = 1;
7367 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007368
7369 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007370 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007371 ASSERT_VK_SUCCESS(err);
7372
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007373 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007374 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007375 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007376 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007377 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007378 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007379
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007380 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7381 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7382 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7383 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7384 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7385 rs_state_ci.depthClampEnable = VK_FALSE;
7386 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7387 rs_state_ci.depthBiasEnable = VK_FALSE;
7388
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007389 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7390 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7391 vi_ci.pNext = nullptr;
7392 vi_ci.vertexBindingDescriptionCount = 0;
7393 vi_ci.pVertexBindingDescriptions = nullptr;
7394 vi_ci.vertexAttributeDescriptionCount = 0;
7395 vi_ci.pVertexAttributeDescriptions = nullptr;
7396
7397 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7398 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7399 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7400
7401 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7402 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7403 pipe_ms_state_ci.pNext = NULL;
7404 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7405 pipe_ms_state_ci.sampleShadingEnable = 0;
7406 pipe_ms_state_ci.minSampleShading = 1.0;
7407 pipe_ms_state_ci.pSampleMask = NULL;
7408
Cody Northropeb3a6c12015-10-05 14:44:45 -06007409 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007410 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007411
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007412 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007413 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007414 shaderStages[0] = vs.GetStageCreateInfo();
7415 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007416
7417 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007418 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7419 gp_ci.stageCount = 2;
7420 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007421 gp_ci.pVertexInputState = &vi_ci;
7422 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007423 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007424 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007425 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007426 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7427 gp_ci.layout = pipeline_layout;
7428 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007429
7430 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007431 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007432
7433 VkPipeline pipeline;
7434 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007435 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007436 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007437
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007438 if (!m_device->phy().features().multiViewport) {
7439 printf("MultiViewport feature is disabled -- skipping enabled-state checks.\n");
7440
7441 // Check case where multiViewport is disabled and viewport count is not 1
7442 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7445 vp_state_ci.scissorCount = 0;
7446 vp_state_ci.viewportCount = 0;
7447 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7448 m_errorMonitor->VerifyFound();
7449 } else {
7450 if (m_device->props.limits.maxViewports == 1) {
7451 printf("Device limit maxViewports is 1, skipping tests that require higher limits.\n");
7452 } else {
7453 printf("MultiViewport feature is enabled -- skipping disabled-state checks.\n");
7454
7455 // Check is that viewportcount and scissorcount match
7456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7457 vp_state_ci.scissorCount = 1;
7458 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
7459 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7460 m_errorMonitor->VerifyFound();
7461
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007462 // Check case where multiViewport is enabled and viewport count is greater than max
7463 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
7465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
7466 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
7467 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
7468 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7469 m_errorMonitor->VerifyFound();
7470 }
7471 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06007472
Chia-I Wuf7458c52015-10-26 21:10:41 +08007473 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7474 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7475 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7476 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007477}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007478
7479// 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
7480// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007481TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07007482 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007483
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007484 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
7485
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007487
Tobin Ehlise68360f2015-10-01 11:15:13 -06007488 ASSERT_NO_FATAL_FAILURE(InitState());
7489 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007490
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007491 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007492 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7493 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007494
7495 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007496 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7497 ds_pool_ci.maxSets = 1;
7498 ds_pool_ci.poolSizeCount = 1;
7499 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007500
7501 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007502 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007503 ASSERT_VK_SUCCESS(err);
7504
7505 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007506 dsl_binding.binding = 0;
7507 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7508 dsl_binding.descriptorCount = 1;
7509 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007510
7511 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007512 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7513 ds_layout_ci.bindingCount = 1;
7514 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007515
7516 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007517 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007518 ASSERT_VK_SUCCESS(err);
7519
7520 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007521 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007522 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007523 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007524 alloc_info.descriptorPool = ds_pool;
7525 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007526 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007527 ASSERT_VK_SUCCESS(err);
7528
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007529 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7530 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7531 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7532
7533 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7534 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7535 vi_ci.pNext = nullptr;
7536 vi_ci.vertexBindingDescriptionCount = 0;
7537 vi_ci.pVertexBindingDescriptions = nullptr;
7538 vi_ci.vertexAttributeDescriptionCount = 0;
7539 vi_ci.pVertexAttributeDescriptions = nullptr;
7540
7541 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7542 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7543 pipe_ms_state_ci.pNext = NULL;
7544 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7545 pipe_ms_state_ci.sampleShadingEnable = 0;
7546 pipe_ms_state_ci.minSampleShading = 1.0;
7547 pipe_ms_state_ci.pSampleMask = NULL;
7548
Tobin Ehlise68360f2015-10-01 11:15:13 -06007549 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007550 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7551 pipeline_layout_ci.setLayoutCount = 1;
7552 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007553
7554 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007555 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007556 ASSERT_VK_SUCCESS(err);
7557
7558 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7559 // Set scissor as dynamic to avoid second error
7560 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007561 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7562 dyn_state_ci.dynamicStateCount = 1;
7563 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007564
Cody Northropeb3a6c12015-10-05 14:44:45 -06007565 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007566 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007567
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007568 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007569 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7570 // 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 +08007571 shaderStages[0] = vs.GetStageCreateInfo();
7572 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007573
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007574 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7575 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7576 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7577 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7578 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7579 rs_state_ci.depthClampEnable = VK_FALSE;
7580 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7581 rs_state_ci.depthBiasEnable = VK_FALSE;
7582
Tobin Ehlise68360f2015-10-01 11:15:13 -06007583 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007584 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7585 gp_ci.stageCount = 2;
7586 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007587 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007588 // Not setting VP state w/o dynamic vp state should cause validation error
7589 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007590 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007591 gp_ci.pVertexInputState = &vi_ci;
7592 gp_ci.pInputAssemblyState = &ia_ci;
7593 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007594 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7595 gp_ci.layout = pipeline_layout;
7596 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007597
7598 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007599 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007600
7601 VkPipeline pipeline;
7602 VkPipelineCache pipelineCache;
7603
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007604 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007605 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007606 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007607
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007608 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007609
Chia-I Wuf7458c52015-10-26 21:10:41 +08007610 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7611 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7612 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7613 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007614}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007615
7616// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
7617// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07007618TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7619 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007620
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007622
Tobin Ehlise68360f2015-10-01 11:15:13 -06007623 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007624
7625 if (!m_device->phy().features().multiViewport) {
7626 printf("Device does not support multiple viewports/scissors; skipped.\n");
7627 return;
7628 }
7629
Tobin Ehlise68360f2015-10-01 11:15:13 -06007630 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007631
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007632 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007633 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7634 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007635
7636 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007637 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7638 ds_pool_ci.maxSets = 1;
7639 ds_pool_ci.poolSizeCount = 1;
7640 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007641
7642 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007643 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007644 ASSERT_VK_SUCCESS(err);
7645
7646 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007647 dsl_binding.binding = 0;
7648 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7649 dsl_binding.descriptorCount = 1;
7650 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007651
7652 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007653 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7654 ds_layout_ci.bindingCount = 1;
7655 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007656
7657 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007658 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007659 ASSERT_VK_SUCCESS(err);
7660
7661 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007662 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007663 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007664 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007665 alloc_info.descriptorPool = ds_pool;
7666 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007667 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007668 ASSERT_VK_SUCCESS(err);
7669
7670 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007671 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7672 pipeline_layout_ci.setLayoutCount = 1;
7673 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007674
7675 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007676 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007677 ASSERT_VK_SUCCESS(err);
7678
7679 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007680 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7681 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007682 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07007683 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007684 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06007685
7686 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7687 // Set scissor as dynamic to avoid that error
7688 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007689 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7690 dyn_state_ci.dynamicStateCount = 1;
7691 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007692
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007693 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7694 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7695 pipe_ms_state_ci.pNext = NULL;
7696 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7697 pipe_ms_state_ci.sampleShadingEnable = 0;
7698 pipe_ms_state_ci.minSampleShading = 1.0;
7699 pipe_ms_state_ci.pSampleMask = NULL;
7700
Cody Northropeb3a6c12015-10-05 14:44:45 -06007701 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007702 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007703
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007704 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007705 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7706 // 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 +08007707 shaderStages[0] = vs.GetStageCreateInfo();
7708 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007709
Cody Northropf6622dc2015-10-06 10:33:21 -06007710 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7711 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7712 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007713 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007714 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007715 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007716 vi_ci.pVertexAttributeDescriptions = nullptr;
7717
7718 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7719 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7720 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7721
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007722 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007723 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007724 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06007725 rs_ci.pNext = nullptr;
7726
Mark Youngc89c6312016-03-31 16:03:20 -06007727 VkPipelineColorBlendAttachmentState att = {};
7728 att.blendEnable = VK_FALSE;
7729 att.colorWriteMask = 0xf;
7730
Cody Northropf6622dc2015-10-06 10:33:21 -06007731 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7732 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7733 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06007734 cb_ci.attachmentCount = 1;
7735 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06007736
Tobin Ehlise68360f2015-10-01 11:15:13 -06007737 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007738 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7739 gp_ci.stageCount = 2;
7740 gp_ci.pStages = shaderStages;
7741 gp_ci.pVertexInputState = &vi_ci;
7742 gp_ci.pInputAssemblyState = &ia_ci;
7743 gp_ci.pViewportState = &vp_state_ci;
7744 gp_ci.pRasterizationState = &rs_ci;
7745 gp_ci.pColorBlendState = &cb_ci;
7746 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007747 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007748 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7749 gp_ci.layout = pipeline_layout;
7750 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007751
7752 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007753 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007754
7755 VkPipeline pipeline;
7756 VkPipelineCache pipelineCache;
7757
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007758 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007759 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007760 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007761
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007762 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007763
Tobin Ehlisd332f282015-10-02 11:00:56 -06007764 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07007765 // First need to successfully create the PSO from above by setting
7766 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06007767 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 -07007768
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007769 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07007770 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007771 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07007772 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07007773 m_commandBuffer->BeginCommandBuffer();
7774 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007775 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007776 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07007777 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007778 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07007779 Draw(1, 0, 0, 0);
7780
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007781 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07007782
7783 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7784 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7785 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7786 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007787 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007788}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007789
7790// 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 -07007791// viewportCount
7792TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
7793 VkResult err;
7794
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07007796
7797 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007798
7799 if (!m_device->phy().features().multiViewport) {
7800 printf("Device does not support multiple viewports/scissors; skipped.\n");
7801 return;
7802 }
7803
Karl Schultz6addd812016-02-02 17:17:23 -07007804 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7805
7806 VkDescriptorPoolSize ds_type_count = {};
7807 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7808 ds_type_count.descriptorCount = 1;
7809
7810 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7811 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7812 ds_pool_ci.maxSets = 1;
7813 ds_pool_ci.poolSizeCount = 1;
7814 ds_pool_ci.pPoolSizes = &ds_type_count;
7815
7816 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007817 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07007818 ASSERT_VK_SUCCESS(err);
7819
7820 VkDescriptorSetLayoutBinding dsl_binding = {};
7821 dsl_binding.binding = 0;
7822 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7823 dsl_binding.descriptorCount = 1;
7824 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7825
7826 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7827 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7828 ds_layout_ci.bindingCount = 1;
7829 ds_layout_ci.pBindings = &dsl_binding;
7830
7831 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007832 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07007833 ASSERT_VK_SUCCESS(err);
7834
7835 VkDescriptorSet descriptorSet;
7836 VkDescriptorSetAllocateInfo alloc_info = {};
7837 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7838 alloc_info.descriptorSetCount = 1;
7839 alloc_info.descriptorPool = ds_pool;
7840 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007841 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07007842 ASSERT_VK_SUCCESS(err);
7843
7844 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7845 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7846 pipeline_layout_ci.setLayoutCount = 1;
7847 pipeline_layout_ci.pSetLayouts = &ds_layout;
7848
7849 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007850 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07007851 ASSERT_VK_SUCCESS(err);
7852
7853 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7854 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7855 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007856 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07007857 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007858 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07007859
7860 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
7861 // Set scissor as dynamic to avoid that error
7862 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7863 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7864 dyn_state_ci.dynamicStateCount = 1;
7865 dyn_state_ci.pDynamicStates = &vp_state;
7866
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007867 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7868 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7869 pipe_ms_state_ci.pNext = NULL;
7870 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7871 pipe_ms_state_ci.sampleShadingEnable = 0;
7872 pipe_ms_state_ci.minSampleShading = 1.0;
7873 pipe_ms_state_ci.pSampleMask = NULL;
7874
Karl Schultz6addd812016-02-02 17:17:23 -07007875 VkPipelineShaderStageCreateInfo shaderStages[2];
7876 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7877
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007878 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007879 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7880 // 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 -07007881 shaderStages[0] = vs.GetStageCreateInfo();
7882 shaderStages[1] = fs.GetStageCreateInfo();
7883
7884 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7885 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7886 vi_ci.pNext = nullptr;
7887 vi_ci.vertexBindingDescriptionCount = 0;
7888 vi_ci.pVertexBindingDescriptions = nullptr;
7889 vi_ci.vertexAttributeDescriptionCount = 0;
7890 vi_ci.pVertexAttributeDescriptions = nullptr;
7891
7892 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7893 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7894 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7895
7896 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7897 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007898 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07007899 rs_ci.pNext = nullptr;
7900
Mark Youngc89c6312016-03-31 16:03:20 -06007901 VkPipelineColorBlendAttachmentState att = {};
7902 att.blendEnable = VK_FALSE;
7903 att.colorWriteMask = 0xf;
7904
Karl Schultz6addd812016-02-02 17:17:23 -07007905 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7906 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7907 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06007908 cb_ci.attachmentCount = 1;
7909 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07007910
7911 VkGraphicsPipelineCreateInfo gp_ci = {};
7912 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7913 gp_ci.stageCount = 2;
7914 gp_ci.pStages = shaderStages;
7915 gp_ci.pVertexInputState = &vi_ci;
7916 gp_ci.pInputAssemblyState = &ia_ci;
7917 gp_ci.pViewportState = &vp_state_ci;
7918 gp_ci.pRasterizationState = &rs_ci;
7919 gp_ci.pColorBlendState = &cb_ci;
7920 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007921 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007922 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7923 gp_ci.layout = pipeline_layout;
7924 gp_ci.renderPass = renderPass();
7925
7926 VkPipelineCacheCreateInfo pc_ci = {};
7927 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7928
7929 VkPipeline pipeline;
7930 VkPipelineCache pipelineCache;
7931
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007932 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07007933 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007934 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07007935
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007936 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07007937
7938 // Now hit second fail case where we set scissor w/ different count than PSO
7939 // First need to successfully create the PSO from above by setting
7940 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7942 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007943
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007944 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06007945 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007946 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007947 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07007948 m_commandBuffer->BeginCommandBuffer();
7949 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007950 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007951 VkViewport viewports[1] = {};
7952 viewports[0].width = 8;
7953 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06007954 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007955 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007956 Draw(1, 0, 0, 0);
7957
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007958 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007959
Chia-I Wuf7458c52015-10-26 21:10:41 +08007960 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7961 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7962 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7963 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007964 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007965}
7966
Mark Young7394fdd2016-03-31 14:56:43 -06007967TEST_F(VkLayerTest, PSOLineWidthInvalid) {
7968 VkResult err;
7969
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06007971
7972 ASSERT_NO_FATAL_FAILURE(InitState());
7973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7974
7975 VkDescriptorPoolSize ds_type_count = {};
7976 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7977 ds_type_count.descriptorCount = 1;
7978
7979 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7980 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7981 ds_pool_ci.maxSets = 1;
7982 ds_pool_ci.poolSizeCount = 1;
7983 ds_pool_ci.pPoolSizes = &ds_type_count;
7984
7985 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007986 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06007987 ASSERT_VK_SUCCESS(err);
7988
7989 VkDescriptorSetLayoutBinding dsl_binding = {};
7990 dsl_binding.binding = 0;
7991 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7992 dsl_binding.descriptorCount = 1;
7993 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7994
7995 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7996 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7997 ds_layout_ci.bindingCount = 1;
7998 ds_layout_ci.pBindings = &dsl_binding;
7999
8000 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008001 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008002 ASSERT_VK_SUCCESS(err);
8003
8004 VkDescriptorSet descriptorSet;
8005 VkDescriptorSetAllocateInfo alloc_info = {};
8006 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8007 alloc_info.descriptorSetCount = 1;
8008 alloc_info.descriptorPool = ds_pool;
8009 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008010 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008011 ASSERT_VK_SUCCESS(err);
8012
8013 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8014 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8015 pipeline_layout_ci.setLayoutCount = 1;
8016 pipeline_layout_ci.pSetLayouts = &ds_layout;
8017
8018 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008019 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008020 ASSERT_VK_SUCCESS(err);
8021
8022 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8023 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8024 vp_state_ci.scissorCount = 1;
8025 vp_state_ci.pScissors = NULL;
8026 vp_state_ci.viewportCount = 1;
8027 vp_state_ci.pViewports = NULL;
8028
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008029 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008030 // Set scissor as dynamic to avoid that error
8031 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8032 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8033 dyn_state_ci.dynamicStateCount = 2;
8034 dyn_state_ci.pDynamicStates = dynamic_states;
8035
8036 VkPipelineShaderStageCreateInfo shaderStages[2];
8037 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8038
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008039 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8040 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008041 this); // TODO - We shouldn't need a fragment shader
8042 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008043 shaderStages[0] = vs.GetStageCreateInfo();
8044 shaderStages[1] = fs.GetStageCreateInfo();
8045
8046 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8047 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8048 vi_ci.pNext = nullptr;
8049 vi_ci.vertexBindingDescriptionCount = 0;
8050 vi_ci.pVertexBindingDescriptions = nullptr;
8051 vi_ci.vertexAttributeDescriptionCount = 0;
8052 vi_ci.pVertexAttributeDescriptions = nullptr;
8053
8054 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8055 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8056 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8057
8058 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8059 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8060 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008061 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008062
Mark Young47107952016-05-02 15:59:55 -06008063 // Check too low (line width of -1.0f).
8064 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008065
8066 VkPipelineColorBlendAttachmentState att = {};
8067 att.blendEnable = VK_FALSE;
8068 att.colorWriteMask = 0xf;
8069
8070 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8071 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8072 cb_ci.pNext = nullptr;
8073 cb_ci.attachmentCount = 1;
8074 cb_ci.pAttachments = &att;
8075
8076 VkGraphicsPipelineCreateInfo gp_ci = {};
8077 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8078 gp_ci.stageCount = 2;
8079 gp_ci.pStages = shaderStages;
8080 gp_ci.pVertexInputState = &vi_ci;
8081 gp_ci.pInputAssemblyState = &ia_ci;
8082 gp_ci.pViewportState = &vp_state_ci;
8083 gp_ci.pRasterizationState = &rs_ci;
8084 gp_ci.pColorBlendState = &cb_ci;
8085 gp_ci.pDynamicState = &dyn_state_ci;
8086 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8087 gp_ci.layout = pipeline_layout;
8088 gp_ci.renderPass = renderPass();
8089
8090 VkPipelineCacheCreateInfo pc_ci = {};
8091 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8092
8093 VkPipeline pipeline;
8094 VkPipelineCache pipelineCache;
8095
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008096 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008097 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008098 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008099
8100 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008101 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008102
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008104
8105 // Check too high (line width of 65536.0f).
8106 rs_ci.lineWidth = 65536.0f;
8107
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008108 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008109 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008110 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008111
8112 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008113 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008114
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008115 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008116
8117 dyn_state_ci.dynamicStateCount = 3;
8118
8119 rs_ci.lineWidth = 1.0f;
8120
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008121 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008122 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008123 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008124 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008125 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008126
8127 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008128 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008129 m_errorMonitor->VerifyFound();
8130
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008132
8133 // Check too high with dynamic setting.
8134 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8135 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008136 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008137
8138 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8139 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8140 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8141 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008142 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008143}
8144
Karl Schultz6addd812016-02-02 17:17:23 -07008145TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008146 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008147 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008148 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008149
8150 ASSERT_NO_FATAL_FAILURE(InitState());
8151 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008152
Tony Barbour552f6c02016-12-21 14:34:07 -07008153 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008154 // Don't care about RenderPass handle b/c error should be flagged before
8155 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008156 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008157
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008158 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008159}
8160
Karl Schultz6addd812016-02-02 17:17:23 -07008161TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008162 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8164 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008165
8166 ASSERT_NO_FATAL_FAILURE(InitState());
8167 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008168
Tony Barbour552f6c02016-12-21 14:34:07 -07008169 m_commandBuffer->BeginCommandBuffer();
8170 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008171 // Just create a dummy Renderpass that's non-NULL so we can get to the
8172 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008173 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008174
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008175 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008176}
8177
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008178TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008179 TEST_DESCRIPTION(
8180 "Begin a renderPass where clearValueCount is less than"
8181 "the number of renderPass attachments that use loadOp"
8182 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008183
8184 ASSERT_NO_FATAL_FAILURE(InitState());
8185 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8186
8187 // Create a renderPass with a single attachment that uses loadOp CLEAR
8188 VkAttachmentReference attach = {};
8189 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8190 VkSubpassDescription subpass = {};
8191 subpass.inputAttachmentCount = 1;
8192 subpass.pInputAttachments = &attach;
8193 VkRenderPassCreateInfo rpci = {};
8194 rpci.subpassCount = 1;
8195 rpci.pSubpasses = &subpass;
8196 rpci.attachmentCount = 1;
8197 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008198 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008199 // Set loadOp to CLEAR
8200 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8201 rpci.pAttachments = &attach_desc;
8202 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8203 VkRenderPass rp;
8204 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8205
8206 VkCommandBufferInheritanceInfo hinfo = {};
8207 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8208 hinfo.renderPass = VK_NULL_HANDLE;
8209 hinfo.subpass = 0;
8210 hinfo.framebuffer = VK_NULL_HANDLE;
8211 hinfo.occlusionQueryEnable = VK_FALSE;
8212 hinfo.queryFlags = 0;
8213 hinfo.pipelineStatistics = 0;
8214 VkCommandBufferBeginInfo info = {};
8215 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8216 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8217 info.pInheritanceInfo = &hinfo;
8218
8219 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8220 VkRenderPassBeginInfo rp_begin = {};
8221 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8222 rp_begin.pNext = NULL;
8223 rp_begin.renderPass = renderPass();
8224 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008225 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008226
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008228
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008229 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008230
8231 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008232
8233 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008234}
8235
Slawomir Cygan0808f392016-11-28 17:53:23 +01008236TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008237 TEST_DESCRIPTION(
8238 "Begin a renderPass where clearValueCount is greater than"
8239 "the number of renderPass attachments that use loadOp"
8240 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008241
8242 ASSERT_NO_FATAL_FAILURE(InitState());
8243 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8244
8245 // Create a renderPass with a single attachment that uses loadOp CLEAR
8246 VkAttachmentReference attach = {};
8247 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8248 VkSubpassDescription subpass = {};
8249 subpass.inputAttachmentCount = 1;
8250 subpass.pInputAttachments = &attach;
8251 VkRenderPassCreateInfo rpci = {};
8252 rpci.subpassCount = 1;
8253 rpci.pSubpasses = &subpass;
8254 rpci.attachmentCount = 1;
8255 VkAttachmentDescription attach_desc = {};
8256 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8257 // Set loadOp to CLEAR
8258 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8259 rpci.pAttachments = &attach_desc;
8260 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8261 VkRenderPass rp;
8262 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8263
8264 VkCommandBufferBeginInfo info = {};
8265 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8266 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8267
8268 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8269 VkRenderPassBeginInfo rp_begin = {};
8270 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8271 rp_begin.pNext = NULL;
8272 rp_begin.renderPass = renderPass();
8273 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008274 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008275
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008276 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8277 " has a clearValueCount of"
8278 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008279
8280 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8281
8282 m_errorMonitor->VerifyFound();
8283
8284 vkDestroyRenderPass(m_device->device(), rp, NULL);
8285}
8286
Cody Northrop3bb4d962016-05-09 16:15:57 -06008287TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008288 TEST_DESCRIPTION("End a command buffer with an active render pass");
8289
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008290 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8291 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008292
8293 ASSERT_NO_FATAL_FAILURE(InitState());
8294 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8295
Tony Barbour552f6c02016-12-21 14:34:07 -07008296 m_commandBuffer->BeginCommandBuffer();
8297 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8298 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008299
8300 m_errorMonitor->VerifyFound();
8301
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008302 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8303 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008304}
8305
Karl Schultz6addd812016-02-02 17:17:23 -07008306TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008307 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008308 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8309 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008310
8311 ASSERT_NO_FATAL_FAILURE(InitState());
8312 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008313
Tony Barbour552f6c02016-12-21 14:34:07 -07008314 m_commandBuffer->BeginCommandBuffer();
8315 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008316
8317 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008318 vk_testing::Buffer dstBuffer;
8319 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008320
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008321 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008322
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008323 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008324}
8325
Karl Schultz6addd812016-02-02 17:17:23 -07008326TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008327 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8329 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008330
8331 ASSERT_NO_FATAL_FAILURE(InitState());
8332 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008333
Tony Barbour552f6c02016-12-21 14:34:07 -07008334 m_commandBuffer->BeginCommandBuffer();
8335 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008336
8337 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008338 vk_testing::Buffer dstBuffer;
8339 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008340
Karl Schultz6addd812016-02-02 17:17:23 -07008341 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008342 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8343 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8344 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008345
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008346 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008347}
8348
Karl Schultz6addd812016-02-02 17:17:23 -07008349TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008350 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008351 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8352 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008353
8354 ASSERT_NO_FATAL_FAILURE(InitState());
8355 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008356
Tony Barbour552f6c02016-12-21 14:34:07 -07008357 m_commandBuffer->BeginCommandBuffer();
8358 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008359
Michael Lentine0a369f62016-02-03 16:51:46 -06008360 VkClearColorValue clear_color;
8361 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008362 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8363 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8364 const int32_t tex_width = 32;
8365 const int32_t tex_height = 32;
8366 VkImageCreateInfo image_create_info = {};
8367 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8368 image_create_info.pNext = NULL;
8369 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8370 image_create_info.format = tex_format;
8371 image_create_info.extent.width = tex_width;
8372 image_create_info.extent.height = tex_height;
8373 image_create_info.extent.depth = 1;
8374 image_create_info.mipLevels = 1;
8375 image_create_info.arrayLayers = 1;
8376 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8377 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8378 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008379
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008380 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008381 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008382
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008383 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008384
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008385 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008386
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008387 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008388}
8389
Karl Schultz6addd812016-02-02 17:17:23 -07008390TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008391 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008392 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8393 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008394
8395 ASSERT_NO_FATAL_FAILURE(InitState());
8396 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008397
Tony Barbour552f6c02016-12-21 14:34:07 -07008398 m_commandBuffer->BeginCommandBuffer();
8399 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008400
8401 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008402 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008403 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8404 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8405 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8406 image_create_info.extent.width = 64;
8407 image_create_info.extent.height = 64;
8408 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8409 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008410
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008411 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008412 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008413
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008414 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008415
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008416 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
8417 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008418
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008419 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008420}
8421
Karl Schultz6addd812016-02-02 17:17:23 -07008422TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008423 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008424 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008425
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8427 "vkCmdClearAttachments(): This call "
8428 "must be issued inside an active "
8429 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008430
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008431 ASSERT_NO_FATAL_FAILURE(InitState());
8432 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008433
8434 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008435 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008436 ASSERT_VK_SUCCESS(err);
8437
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008438 VkClearAttachment color_attachment;
8439 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8440 color_attachment.clearValue.color.float32[0] = 0;
8441 color_attachment.clearValue.color.float32[1] = 0;
8442 color_attachment.clearValue.color.float32[2] = 0;
8443 color_attachment.clearValue.color.float32[3] = 0;
8444 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008445 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008446 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008447
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008448 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008449}
8450
Chris Forbes3b97e932016-09-07 11:29:24 +12008451TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008452 TEST_DESCRIPTION(
8453 "Test that an error is produced when CmdNextSubpass is "
8454 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12008455
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8457 "vkCmdNextSubpass(): Attempted to advance "
8458 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008459
8460 ASSERT_NO_FATAL_FAILURE(InitState());
8461 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8462
Tony Barbour552f6c02016-12-21 14:34:07 -07008463 m_commandBuffer->BeginCommandBuffer();
8464 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12008465
8466 // error here.
8467 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8468 m_errorMonitor->VerifyFound();
8469
Tony Barbour552f6c02016-12-21 14:34:07 -07008470 m_commandBuffer->EndRenderPass();
8471 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12008472}
8473
Chris Forbes6d624702016-09-07 13:57:05 +12008474TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008475 TEST_DESCRIPTION(
8476 "Test that an error is produced when CmdEndRenderPass is "
8477 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12008478
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8480 "vkCmdEndRenderPass(): Called before reaching "
8481 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008482
8483 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008484 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8485 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008486
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008487 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008488
8489 VkRenderPass rp;
8490 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8491 ASSERT_VK_SUCCESS(err);
8492
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008493 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008494
8495 VkFramebuffer fb;
8496 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8497 ASSERT_VK_SUCCESS(err);
8498
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008499 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008500
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008501 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 +12008502
8503 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8504
8505 // Error here.
8506 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8507 m_errorMonitor->VerifyFound();
8508
8509 // Clean up.
8510 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8511 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8512}
8513
Karl Schultz9e66a292016-04-21 15:57:51 -06008514TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8515 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008516 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8517 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008518
8519 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour552f6c02016-12-21 14:34:07 -07008520 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06008521
8522 VkBufferMemoryBarrier buf_barrier = {};
8523 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8524 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8525 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8526 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8527 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8528 buf_barrier.buffer = VK_NULL_HANDLE;
8529 buf_barrier.offset = 0;
8530 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008531 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8532 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008533
8534 m_errorMonitor->VerifyFound();
8535}
8536
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008537TEST_F(VkLayerTest, InvalidBarriers) {
8538 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8539
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008540 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008541
8542 ASSERT_NO_FATAL_FAILURE(InitState());
8543 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8544
8545 VkMemoryBarrier mem_barrier = {};
8546 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8547 mem_barrier.pNext = NULL;
8548 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8549 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07008550 m_commandBuffer->BeginCommandBuffer();
8551 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008552 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008553 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008554 &mem_barrier, 0, nullptr, 0, nullptr);
8555 m_errorMonitor->VerifyFound();
8556
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008557 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008558 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008559 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 -06008560 ASSERT_TRUE(image.initialized());
8561 VkImageMemoryBarrier img_barrier = {};
8562 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8563 img_barrier.pNext = NULL;
8564 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8565 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8566 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8567 // New layout can't be UNDEFINED
8568 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8569 img_barrier.image = image.handle();
8570 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8571 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8572 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8573 img_barrier.subresourceRange.baseArrayLayer = 0;
8574 img_barrier.subresourceRange.baseMipLevel = 0;
8575 img_barrier.subresourceRange.layerCount = 1;
8576 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008577 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8578 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008579 m_errorMonitor->VerifyFound();
8580 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8581
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008582 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8583 "Subresource must have the sum of the "
8584 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008585 // baseArrayLayer + layerCount must be <= image's arrayLayers
8586 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008587 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8588 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008589 m_errorMonitor->VerifyFound();
8590 img_barrier.subresourceRange.baseArrayLayer = 0;
8591
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008593 // baseMipLevel + levelCount must be <= image's mipLevels
8594 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008595 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8596 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008597 m_errorMonitor->VerifyFound();
8598 img_barrier.subresourceRange.baseMipLevel = 0;
8599
Mike Weiblen7053aa32017-01-25 15:21:10 -07008600 // levelCount must be non-zero.
8601 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
8602 img_barrier.subresourceRange.levelCount = 0;
8603 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8604 nullptr, 0, nullptr, 1, &img_barrier);
8605 m_errorMonitor->VerifyFound();
8606 img_barrier.subresourceRange.levelCount = 1;
8607
8608 // layerCount must be non-zero.
8609 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
8610 img_barrier.subresourceRange.layerCount = 0;
8611 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8612 nullptr, 0, nullptr, 1, &img_barrier);
8613 m_errorMonitor->VerifyFound();
8614 img_barrier.subresourceRange.layerCount = 1;
8615
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008616 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 -06008617 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008618 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8619 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008620 VkBufferMemoryBarrier buf_barrier = {};
8621 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8622 buf_barrier.pNext = NULL;
8623 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8624 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8625 buf_barrier.buffer = buffer.handle();
8626 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8627 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8628 buf_barrier.offset = 0;
8629 buf_barrier.size = VK_WHOLE_SIZE;
8630 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008631 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8632 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008633 m_errorMonitor->VerifyFound();
8634 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8635
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008637 buf_barrier.offset = 257;
8638 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008639 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8640 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008641 m_errorMonitor->VerifyFound();
8642 buf_barrier.offset = 0;
8643
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008644 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008645 buf_barrier.size = 257;
8646 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008647 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8648 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008649 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008650
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008651 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008652 m_errorMonitor->SetDesiredFailureMsg(
8653 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008654 "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 -06008655 VkDepthStencilObj ds_image(m_device);
8656 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
8657 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06008658 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
8659 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008660 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07008661
8662 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07008663 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008664 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8665 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008666 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07008667
8668 // Having anything other than DEPTH or STENCIL is an error
8669 m_errorMonitor->SetDesiredFailureMsg(
8670 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8671 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
8672 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
8673 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8674 nullptr, 0, nullptr, 1, &img_barrier);
8675 m_errorMonitor->VerifyFound();
8676
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008677 // Now test depth-only
8678 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008679 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
8680 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008681 VkDepthStencilObj d_image(m_device);
8682 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
8683 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008684 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06008685 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008686 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07008687
8688 // DEPTH bit must be set
8689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8690 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07008691 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07008692 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8693 0, nullptr, 0, nullptr, 1, &img_barrier);
8694 m_errorMonitor->VerifyFound();
8695
8696 // No bits other than DEPTH may be set
8697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8698 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
8699 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008700 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8701 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008702 m_errorMonitor->VerifyFound();
8703 }
Dave Houltonfbf52152017-01-06 12:55:29 -07008704
8705 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008706 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
8707 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8709 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008710 VkDepthStencilObj s_image(m_device);
8711 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
8712 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008713 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06008714 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008715 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06008716 // Use of COLOR aspect on depth image is error
8717 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008718 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8719 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008720 m_errorMonitor->VerifyFound();
8721 }
Dave Houltonfbf52152017-01-06 12:55:29 -07008722
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008723 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008724 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008725 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 -06008726 ASSERT_TRUE(c_image.initialized());
8727 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8728 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
8729 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07008730
8731 // COLOR bit must be set
8732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8733 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07008734 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07008735 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8736 nullptr, 0, nullptr, 1, &img_barrier);
8737 m_errorMonitor->VerifyFound();
8738
8739 // No bits other than COLOR may be set
8740 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8741 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
8742 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008743 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8744 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008745 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008746
8747 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
8748
8749 // Create command pool with incompatible queueflags
8750 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
8751 uint32_t queue_family_index = UINT32_MAX;
8752 for (uint32_t i = 0; i < queue_props.size(); i++) {
8753 if ((queue_props[i].queueFlags & VK_QUEUE_COMPUTE_BIT) == 0) {
8754 queue_family_index = i;
8755 break;
8756 }
8757 }
8758 if (queue_family_index == UINT32_MAX) {
8759 printf("No non-compute queue found; skipped.\n");
8760 return;
8761 }
8762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
8763
8764 VkCommandPool command_pool;
8765 VkCommandPoolCreateInfo pool_create_info{};
8766 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
8767 pool_create_info.queueFamilyIndex = queue_family_index;
8768 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
8769 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
8770
8771 // Allocate a command buffer
8772 VkCommandBuffer bad_command_buffer;
8773 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
8774 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
8775 command_buffer_allocate_info.commandPool = command_pool;
8776 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
8777 command_buffer_allocate_info.commandBufferCount = 1;
8778 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
8779
8780 VkCommandBufferBeginInfo cbbi = {};
8781 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8782 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
8783 buf_barrier.offset = 0;
8784 buf_barrier.size = VK_WHOLE_SIZE;
8785 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
8786 &buf_barrier, 0, nullptr);
8787 m_errorMonitor->VerifyFound();
8788
8789 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
8790 vkEndCommandBuffer(bad_command_buffer);
8791 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
8792 printf("The non-compute queue does not support graphics; skipped.\n");
8793 return;
8794 }
8795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
8796 VkEvent event;
8797 VkEventCreateInfo event_create_info{};
8798 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
8799 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
8800 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
8801 nullptr, 0, nullptr);
8802 m_errorMonitor->VerifyFound();
8803
8804 vkEndCommandBuffer(bad_command_buffer);
8805 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008806}
8807
Tony Barbour18ba25c2016-09-29 13:42:40 -06008808TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
8809 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
8810
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour18ba25c2016-09-29 13:42:40 -06008812 ASSERT_NO_FATAL_FAILURE(InitState());
8813 VkImageObj image(m_device);
Tony Barbour256c80a2016-10-05 13:23:46 -06008814 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 -06008815 ASSERT_TRUE(image.initialized());
8816
8817 VkImageMemoryBarrier barrier = {};
8818 VkImageSubresourceRange range;
8819 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8820 barrier.srcAccessMask = 0;
8821 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
8822 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
8823 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8824 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
8825 barrier.image = image.handle();
8826 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8827 range.baseMipLevel = 0;
8828 range.levelCount = 1;
8829 range.baseArrayLayer = 0;
8830 range.layerCount = 1;
8831 barrier.subresourceRange = range;
8832 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
8833 cmdbuf.BeginCommandBuffer();
8834 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
8835 &barrier);
8836 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
8837 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
8838 barrier.srcAccessMask = 0;
8839 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
8840 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
8841 &barrier);
8842
8843 m_errorMonitor->VerifyFound();
8844}
8845
Karl Schultz6addd812016-02-02 17:17:23 -07008846TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008847 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008848 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008849
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008851
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008852 ASSERT_NO_FATAL_FAILURE(InitState());
8853 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008854 uint32_t qfi = 0;
8855 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008856 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8857 buffCI.size = 1024;
8858 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
8859 buffCI.queueFamilyIndexCount = 1;
8860 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008861
8862 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008863 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008864 ASSERT_VK_SUCCESS(err);
8865
Tony Barbour552f6c02016-12-21 14:34:07 -07008866 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008867 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008868 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8869 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008870 // Should error before calling to driver so don't care about actual data
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008871 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7, VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008872
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008873 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008874
Chia-I Wuf7458c52015-10-26 21:10:41 +08008875 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008876}
8877
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008878TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
8879 // Create an out-of-range queueFamilyIndex
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8881 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
8882 "of the indices specified when the device was created, via the "
8883 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008884
8885 ASSERT_NO_FATAL_FAILURE(InitState());
8886 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8887 VkBufferCreateInfo buffCI = {};
8888 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8889 buffCI.size = 1024;
8890 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
8891 buffCI.queueFamilyIndexCount = 1;
8892 // Introduce failure by specifying invalid queue_family_index
8893 uint32_t qfi = 777;
8894 buffCI.pQueueFamilyIndices = &qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008895 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008896
8897 VkBuffer ib;
8898 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
8899
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008900 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008901 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008902}
8903
Karl Schultz6addd812016-02-02 17:17:23 -07008904TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008905 TEST_DESCRIPTION(
8906 "Attempt vkCmdExecuteCommands with a primary command buffer"
8907 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008908
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008909 ASSERT_NO_FATAL_FAILURE(InitState());
8910 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008911
Chris Forbesf29a84f2016-10-06 18:39:28 +13008912 // An empty primary command buffer
8913 VkCommandBufferObj cb(m_device, m_commandPool);
8914 cb.BeginCommandBuffer();
8915 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06008916
Chris Forbesf29a84f2016-10-06 18:39:28 +13008917 m_commandBuffer->BeginCommandBuffer();
8918 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
8919 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008920
Chris Forbesf29a84f2016-10-06 18:39:28 +13008921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
8922 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008923 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008924}
8925
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008926TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008927 TEST_DESCRIPTION(
8928 "Attempt to update descriptor sets for images and buffers "
8929 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008930 VkResult err;
8931
8932 ASSERT_NO_FATAL_FAILURE(InitState());
8933 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
8934 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8935 ds_type_count[i].type = VkDescriptorType(i);
8936 ds_type_count[i].descriptorCount = 1;
8937 }
8938 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8939 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8940 ds_pool_ci.pNext = NULL;
8941 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8942 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8943 ds_pool_ci.pPoolSizes = ds_type_count;
8944
8945 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008946 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008947 ASSERT_VK_SUCCESS(err);
8948
8949 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008950 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008951 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8952 dsl_binding[i].binding = 0;
8953 dsl_binding[i].descriptorType = VkDescriptorType(i);
8954 dsl_binding[i].descriptorCount = 1;
8955 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
8956 dsl_binding[i].pImmutableSamplers = NULL;
8957 }
8958
8959 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8960 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8961 ds_layout_ci.pNext = NULL;
8962 ds_layout_ci.bindingCount = 1;
8963 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
8964 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8965 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008966 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008967 ASSERT_VK_SUCCESS(err);
8968 }
8969 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
8970 VkDescriptorSetAllocateInfo alloc_info = {};
8971 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8972 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8973 alloc_info.descriptorPool = ds_pool;
8974 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008975 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008976 ASSERT_VK_SUCCESS(err);
8977
8978 // Create a buffer & bufferView to be used for invalid updates
8979 VkBufferCreateInfo buff_ci = {};
8980 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07008981 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008982 buff_ci.size = 256;
8983 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07008984 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008985 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
8986 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07008987
8988 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
8989 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
8990 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
8991 ASSERT_VK_SUCCESS(err);
8992
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07008993 VkMemoryRequirements mem_reqs;
8994 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
8995 VkMemoryAllocateInfo mem_alloc_info = {};
8996 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8997 mem_alloc_info.pNext = NULL;
8998 mem_alloc_info.memoryTypeIndex = 0;
8999 mem_alloc_info.allocationSize = mem_reqs.size;
9000 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9001 if (!pass) {
9002 vkDestroyBuffer(m_device->device(), buffer, NULL);
9003 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9004 return;
9005 }
9006 VkDeviceMemory mem;
9007 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9008 ASSERT_VK_SUCCESS(err);
9009 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9010 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009011
9012 VkBufferViewCreateInfo buff_view_ci = {};
9013 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9014 buff_view_ci.buffer = buffer;
9015 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9016 buff_view_ci.range = VK_WHOLE_SIZE;
9017 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009018 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009019 ASSERT_VK_SUCCESS(err);
9020
Tony Barbour415497c2017-01-24 10:06:09 -07009021 // Now get resources / view for storage_texel_buffer
9022 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9023 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9024 if (!pass) {
9025 vkDestroyBuffer(m_device->device(), buffer, NULL);
9026 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9027 vkFreeMemory(m_device->device(), mem, NULL);
9028 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9029 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9030 return;
9031 }
9032 VkDeviceMemory storage_texel_buffer_mem;
9033 VkBufferView storage_texel_buffer_view;
9034 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9035 ASSERT_VK_SUCCESS(err);
9036 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9037 ASSERT_VK_SUCCESS(err);
9038 buff_view_ci.buffer = storage_texel_buffer;
9039 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9040 ASSERT_VK_SUCCESS(err);
9041
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009042 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009043 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009044 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009045 image_ci.format = VK_FORMAT_UNDEFINED;
9046 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9047 VkFormat format = static_cast<VkFormat>(f);
9048 VkFormatProperties fProps = m_device->format_properties(format);
9049 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9050 image_ci.format = format;
9051 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9052 break;
9053 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9054 image_ci.format = format;
9055 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9056 break;
9057 }
9058 }
9059 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9060 return;
9061 }
9062
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009063 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9064 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009065 image_ci.extent.width = 64;
9066 image_ci.extent.height = 64;
9067 image_ci.extent.depth = 1;
9068 image_ci.mipLevels = 1;
9069 image_ci.arrayLayers = 1;
9070 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009071 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009072 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009073 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9074 VkImage image;
9075 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9076 ASSERT_VK_SUCCESS(err);
9077 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009078 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009079
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009080 VkMemoryAllocateInfo mem_alloc = {};
9081 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9082 mem_alloc.pNext = NULL;
9083 mem_alloc.allocationSize = 0;
9084 mem_alloc.memoryTypeIndex = 0;
9085 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9086 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009087 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009088 ASSERT_TRUE(pass);
9089 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9090 ASSERT_VK_SUCCESS(err);
9091 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9092 ASSERT_VK_SUCCESS(err);
9093 // Now create view for image
9094 VkImageViewCreateInfo image_view_ci = {};
9095 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9096 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009097 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009098 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9099 image_view_ci.subresourceRange.layerCount = 1;
9100 image_view_ci.subresourceRange.baseArrayLayer = 0;
9101 image_view_ci.subresourceRange.levelCount = 1;
9102 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9103 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009104 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009105 ASSERT_VK_SUCCESS(err);
9106
9107 VkDescriptorBufferInfo buff_info = {};
9108 buff_info.buffer = buffer;
9109 VkDescriptorImageInfo img_info = {};
9110 img_info.imageView = image_view;
9111 VkWriteDescriptorSet descriptor_write = {};
9112 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9113 descriptor_write.dstBinding = 0;
9114 descriptor_write.descriptorCount = 1;
9115 descriptor_write.pTexelBufferView = &buff_view;
9116 descriptor_write.pBufferInfo = &buff_info;
9117 descriptor_write.pImageInfo = &img_info;
9118
9119 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009120 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009121 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9122 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9123 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9124 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9125 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9126 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9127 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9128 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9129 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9130 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9131 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009132 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009133 // Start loop at 1 as SAMPLER desc type has no usage bit error
9134 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009135 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9136 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9137 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9138 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009139 descriptor_write.descriptorType = VkDescriptorType(i);
9140 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009141 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009142
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009143 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009144
9145 m_errorMonitor->VerifyFound();
9146 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009147 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9148 descriptor_write.pTexelBufferView = &buff_view;
9149 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009150 }
Tony Barbour415497c2017-01-24 10:06:09 -07009151
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009152 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9153 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009154 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009155 vkDestroyImageView(m_device->device(), image_view, NULL);
9156 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009157 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009158 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009159 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009160 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009161 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009162 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9163}
9164
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009165TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009166 TEST_DESCRIPTION(
9167 "Attempt to update buffer descriptor set that has incorrect "
9168 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
9169 "1. offset value greater than buffer size\n"
9170 "2. range value of 0\n"
9171 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009172 VkResult err;
9173
9174 ASSERT_NO_FATAL_FAILURE(InitState());
9175 VkDescriptorPoolSize ds_type_count = {};
9176 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9177 ds_type_count.descriptorCount = 1;
9178
9179 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9180 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9181 ds_pool_ci.pNext = NULL;
9182 ds_pool_ci.maxSets = 1;
9183 ds_pool_ci.poolSizeCount = 1;
9184 ds_pool_ci.pPoolSizes = &ds_type_count;
9185
9186 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009187 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009188 ASSERT_VK_SUCCESS(err);
9189
9190 // Create layout with single uniform buffer descriptor
9191 VkDescriptorSetLayoutBinding dsl_binding = {};
9192 dsl_binding.binding = 0;
9193 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9194 dsl_binding.descriptorCount = 1;
9195 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9196 dsl_binding.pImmutableSamplers = NULL;
9197
9198 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9199 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9200 ds_layout_ci.pNext = NULL;
9201 ds_layout_ci.bindingCount = 1;
9202 ds_layout_ci.pBindings = &dsl_binding;
9203 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009204 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009205 ASSERT_VK_SUCCESS(err);
9206
9207 VkDescriptorSet descriptor_set = {};
9208 VkDescriptorSetAllocateInfo alloc_info = {};
9209 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9210 alloc_info.descriptorSetCount = 1;
9211 alloc_info.descriptorPool = ds_pool;
9212 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009213 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009214 ASSERT_VK_SUCCESS(err);
9215
9216 // Create a buffer to be used for invalid updates
9217 VkBufferCreateInfo buff_ci = {};
9218 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9219 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9220 buff_ci.size = 256;
9221 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9222 VkBuffer buffer;
9223 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9224 ASSERT_VK_SUCCESS(err);
9225 // Have to bind memory to buffer before descriptor update
9226 VkMemoryAllocateInfo mem_alloc = {};
9227 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9228 mem_alloc.pNext = NULL;
9229 mem_alloc.allocationSize = 256;
9230 mem_alloc.memoryTypeIndex = 0;
9231
9232 VkMemoryRequirements mem_reqs;
9233 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009234 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009235 if (!pass) {
9236 vkDestroyBuffer(m_device->device(), buffer, NULL);
9237 return;
9238 }
9239
9240 VkDeviceMemory mem;
9241 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9242 ASSERT_VK_SUCCESS(err);
9243 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9244 ASSERT_VK_SUCCESS(err);
9245
9246 VkDescriptorBufferInfo buff_info = {};
9247 buff_info.buffer = buffer;
9248 // First make offset 1 larger than buffer size
9249 buff_info.offset = 257;
9250 buff_info.range = VK_WHOLE_SIZE;
9251 VkWriteDescriptorSet descriptor_write = {};
9252 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9253 descriptor_write.dstBinding = 0;
9254 descriptor_write.descriptorCount = 1;
9255 descriptor_write.pTexelBufferView = nullptr;
9256 descriptor_write.pBufferInfo = &buff_info;
9257 descriptor_write.pImageInfo = nullptr;
9258
9259 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9260 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009261 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009262
9263 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9264
9265 m_errorMonitor->VerifyFound();
9266 // Now cause error due to range of 0
9267 buff_info.offset = 0;
9268 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009269 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009270
9271 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9272
9273 m_errorMonitor->VerifyFound();
9274 // Now cause error due to range exceeding buffer size - offset
9275 buff_info.offset = 128;
9276 buff_info.range = 200;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009278
9279 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9280
9281 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009282 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009283 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9284 vkDestroyBuffer(m_device->device(), buffer, NULL);
9285 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9286 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9287}
9288
Tobin Ehlis845887e2017-02-02 19:01:44 -07009289TEST_F(VkLayerTest, DSBufferLimitErrors) {
9290 TEST_DESCRIPTION(
9291 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
9292 "Test cases include:\n"
9293 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
9294 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
9295 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
9296 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
9297 VkResult err;
9298
9299 ASSERT_NO_FATAL_FAILURE(InitState());
9300 VkDescriptorPoolSize ds_type_count[2] = {};
9301 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9302 ds_type_count[0].descriptorCount = 1;
9303 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9304 ds_type_count[1].descriptorCount = 1;
9305
9306 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9307 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9308 ds_pool_ci.pNext = NULL;
9309 ds_pool_ci.maxSets = 1;
9310 ds_pool_ci.poolSizeCount = 2;
9311 ds_pool_ci.pPoolSizes = ds_type_count;
9312
9313 VkDescriptorPool ds_pool;
9314 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9315 ASSERT_VK_SUCCESS(err);
9316
9317 // Create layout with single uniform buffer & single storage buffer descriptor
9318 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
9319 dsl_binding[0].binding = 0;
9320 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9321 dsl_binding[0].descriptorCount = 1;
9322 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9323 dsl_binding[0].pImmutableSamplers = NULL;
9324 dsl_binding[1].binding = 1;
9325 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9326 dsl_binding[1].descriptorCount = 1;
9327 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9328 dsl_binding[1].pImmutableSamplers = NULL;
9329
9330 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9331 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9332 ds_layout_ci.pNext = NULL;
9333 ds_layout_ci.bindingCount = 2;
9334 ds_layout_ci.pBindings = dsl_binding;
9335 VkDescriptorSetLayout ds_layout;
9336 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9337 ASSERT_VK_SUCCESS(err);
9338
9339 VkDescriptorSet descriptor_set = {};
9340 VkDescriptorSetAllocateInfo alloc_info = {};
9341 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9342 alloc_info.descriptorSetCount = 1;
9343 alloc_info.descriptorPool = ds_pool;
9344 alloc_info.pSetLayouts = &ds_layout;
9345 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9346 ASSERT_VK_SUCCESS(err);
9347
9348 // Create a buffer to be used for invalid updates
9349 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
9350 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
9351 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
9352 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
9353 VkBufferCreateInfo ub_ci = {};
9354 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9355 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9356 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
9357 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9358 VkBuffer uniform_buffer;
9359 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
9360 ASSERT_VK_SUCCESS(err);
9361 VkBufferCreateInfo sb_ci = {};
9362 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9363 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
9364 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
9365 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9366 VkBuffer storage_buffer;
9367 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
9368 ASSERT_VK_SUCCESS(err);
9369 // Have to bind memory to buffer before descriptor update
9370 VkMemoryAllocateInfo mem_alloc = {};
9371 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9372 mem_alloc.pNext = NULL;
9373 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
9374 mem_alloc.memoryTypeIndex = 0;
9375
9376 VkMemoryRequirements mem_reqs;
9377 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &mem_reqs);
9378 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9379 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &mem_reqs);
9380 pass &= m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9381 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -07009382 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009383 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009384 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9385 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009386 return;
9387 }
9388
9389 VkDeviceMemory mem;
9390 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009391 if (VK_SUCCESS != err) {
9392 printf("Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
9393 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9394 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9395 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9396 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9397 return;
9398 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009399 ASSERT_VK_SUCCESS(err);
9400 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
9401 ASSERT_VK_SUCCESS(err);
9402 auto sb_offset = ub_ci.size + 1024;
9403 // Verify offset alignment, I know there's a bit trick to do this but it escapes me
9404 sb_offset = (sb_offset % mem_reqs.alignment) ? sb_offset - (sb_offset % mem_reqs.alignment) : sb_offset;
9405 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
9406 ASSERT_VK_SUCCESS(err);
9407
9408 VkDescriptorBufferInfo buff_info = {};
9409 buff_info.buffer = uniform_buffer;
9410 buff_info.range = ub_ci.size; // This will exceed limit
9411 VkWriteDescriptorSet descriptor_write = {};
9412 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9413 descriptor_write.dstBinding = 0;
9414 descriptor_write.descriptorCount = 1;
9415 descriptor_write.pTexelBufferView = nullptr;
9416 descriptor_write.pBufferInfo = &buff_info;
9417 descriptor_write.pImageInfo = nullptr;
9418
9419 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9420 descriptor_write.dstSet = descriptor_set;
9421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
9422 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9423 m_errorMonitor->VerifyFound();
9424
9425 // Reduce size of range to acceptable limit & cause offset error
9426 buff_info.range = max_ub_range;
9427 buff_info.offset = min_ub_align - 1;
9428 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
9429 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9430 m_errorMonitor->VerifyFound();
9431
9432 // Now break storage updates
9433 buff_info.buffer = storage_buffer;
9434 buff_info.range = sb_ci.size; // This will exceed limit
9435 buff_info.offset = 0; // Reset offset for this update
9436
9437 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9438 descriptor_write.dstBinding = 1;
9439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
9440 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9441 m_errorMonitor->VerifyFound();
9442
9443 // Reduce size of range to acceptable limit & cause offset error
9444 buff_info.range = max_sb_range;
9445 buff_info.offset = min_sb_align - 1;
9446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
9447 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9448 m_errorMonitor->VerifyFound();
9449
9450 vkFreeMemory(m_device->device(), mem, NULL);
9451 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9452 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9453 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9454 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9455}
9456
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009457TEST_F(VkLayerTest, DSAspectBitsErrors) {
9458 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9459 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009460 TEST_DESCRIPTION(
9461 "Attempt to update descriptor sets for images "
9462 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009463 VkResult err;
9464
9465 ASSERT_NO_FATAL_FAILURE(InitState());
9466 VkDescriptorPoolSize ds_type_count = {};
9467 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9468 ds_type_count.descriptorCount = 1;
9469
9470 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9471 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9472 ds_pool_ci.pNext = NULL;
9473 ds_pool_ci.maxSets = 5;
9474 ds_pool_ci.poolSizeCount = 1;
9475 ds_pool_ci.pPoolSizes = &ds_type_count;
9476
9477 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009478 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009479 ASSERT_VK_SUCCESS(err);
9480
9481 VkDescriptorSetLayoutBinding dsl_binding = {};
9482 dsl_binding.binding = 0;
9483 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9484 dsl_binding.descriptorCount = 1;
9485 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9486 dsl_binding.pImmutableSamplers = NULL;
9487
9488 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9489 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9490 ds_layout_ci.pNext = NULL;
9491 ds_layout_ci.bindingCount = 1;
9492 ds_layout_ci.pBindings = &dsl_binding;
9493 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009494 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009495 ASSERT_VK_SUCCESS(err);
9496
9497 VkDescriptorSet descriptor_set = {};
9498 VkDescriptorSetAllocateInfo alloc_info = {};
9499 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9500 alloc_info.descriptorSetCount = 1;
9501 alloc_info.descriptorPool = ds_pool;
9502 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009503 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009504 ASSERT_VK_SUCCESS(err);
9505
9506 // Create an image to be used for invalid updates
9507 VkImageCreateInfo image_ci = {};
9508 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9509 image_ci.imageType = VK_IMAGE_TYPE_2D;
9510 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9511 image_ci.extent.width = 64;
9512 image_ci.extent.height = 64;
9513 image_ci.extent.depth = 1;
9514 image_ci.mipLevels = 1;
9515 image_ci.arrayLayers = 1;
9516 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
9517 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9518 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9519 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9520 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9521 VkImage image;
9522 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9523 ASSERT_VK_SUCCESS(err);
9524 // Bind memory to image
9525 VkMemoryRequirements mem_reqs;
9526 VkDeviceMemory image_mem;
9527 bool pass;
9528 VkMemoryAllocateInfo mem_alloc = {};
9529 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9530 mem_alloc.pNext = NULL;
9531 mem_alloc.allocationSize = 0;
9532 mem_alloc.memoryTypeIndex = 0;
9533 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9534 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009535 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009536 ASSERT_TRUE(pass);
9537 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9538 ASSERT_VK_SUCCESS(err);
9539 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9540 ASSERT_VK_SUCCESS(err);
9541 // Now create view for image
9542 VkImageViewCreateInfo image_view_ci = {};
9543 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9544 image_view_ci.image = image;
9545 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9546 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9547 image_view_ci.subresourceRange.layerCount = 1;
9548 image_view_ci.subresourceRange.baseArrayLayer = 0;
9549 image_view_ci.subresourceRange.levelCount = 1;
9550 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009551 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009552
9553 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009554 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009555 ASSERT_VK_SUCCESS(err);
9556
9557 VkDescriptorImageInfo img_info = {};
9558 img_info.imageView = image_view;
9559 VkWriteDescriptorSet descriptor_write = {};
9560 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9561 descriptor_write.dstBinding = 0;
9562 descriptor_write.descriptorCount = 1;
9563 descriptor_write.pTexelBufferView = NULL;
9564 descriptor_write.pBufferInfo = NULL;
9565 descriptor_write.pImageInfo = &img_info;
9566 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9567 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009568 const char *error_msg =
9569 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
9570 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009572
9573 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9574
9575 m_errorMonitor->VerifyFound();
9576 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9577 vkDestroyImage(m_device->device(), image, NULL);
9578 vkFreeMemory(m_device->device(), image_mem, NULL);
9579 vkDestroyImageView(m_device->device(), image_view, NULL);
9580 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9581 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9582}
9583
Karl Schultz6addd812016-02-02 17:17:23 -07009584TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009585 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07009586 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009587
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9589 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
9590 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009591
Tobin Ehlis3b780662015-05-28 12:11:26 -06009592 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009593 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009594 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009595 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9596 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009597
9598 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009599 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9600 ds_pool_ci.pNext = NULL;
9601 ds_pool_ci.maxSets = 1;
9602 ds_pool_ci.poolSizeCount = 1;
9603 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009604
Tobin Ehlis3b780662015-05-28 12:11:26 -06009605 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009606 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009607 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009608 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009609 dsl_binding.binding = 0;
9610 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9611 dsl_binding.descriptorCount = 1;
9612 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9613 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009614
Tony Barboureb254902015-07-15 12:50:33 -06009615 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009616 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9617 ds_layout_ci.pNext = NULL;
9618 ds_layout_ci.bindingCount = 1;
9619 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009620
Tobin Ehlis3b780662015-05-28 12:11:26 -06009621 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009622 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009623 ASSERT_VK_SUCCESS(err);
9624
9625 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009626 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009627 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009628 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009629 alloc_info.descriptorPool = ds_pool;
9630 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009631 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009632 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009633
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009634 VkSamplerCreateInfo sampler_ci = {};
9635 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9636 sampler_ci.pNext = NULL;
9637 sampler_ci.magFilter = VK_FILTER_NEAREST;
9638 sampler_ci.minFilter = VK_FILTER_NEAREST;
9639 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9640 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9641 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9642 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9643 sampler_ci.mipLodBias = 1.0;
9644 sampler_ci.anisotropyEnable = VK_FALSE;
9645 sampler_ci.maxAnisotropy = 1;
9646 sampler_ci.compareEnable = VK_FALSE;
9647 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9648 sampler_ci.minLod = 1.0;
9649 sampler_ci.maxLod = 1.0;
9650 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9651 sampler_ci.unnormalizedCoordinates = VK_FALSE;
9652 VkSampler sampler;
9653 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
9654 ASSERT_VK_SUCCESS(err);
9655
9656 VkDescriptorImageInfo info = {};
9657 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009658
9659 VkWriteDescriptorSet descriptor_write;
9660 memset(&descriptor_write, 0, sizeof(descriptor_write));
9661 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009662 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009663 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009664 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009665 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009666 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009667
9668 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9669
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009670 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009671
Chia-I Wuf7458c52015-10-26 21:10:41 +08009672 vkDestroySampler(m_device->device(), sampler, NULL);
9673 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9674 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009675}
9676
Karl Schultz6addd812016-02-02 17:17:23 -07009677TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009678 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07009679 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009680
Tobin Ehlisf922ef82016-11-30 10:19:14 -07009681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009682
Tobin Ehlis3b780662015-05-28 12:11:26 -06009683 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009684 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009685 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009686 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9687 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009688
9689 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009690 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9691 ds_pool_ci.pNext = NULL;
9692 ds_pool_ci.maxSets = 1;
9693 ds_pool_ci.poolSizeCount = 1;
9694 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009695
Tobin Ehlis3b780662015-05-28 12:11:26 -06009696 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009697 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009698 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009699
Tony Barboureb254902015-07-15 12:50:33 -06009700 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009701 dsl_binding.binding = 0;
9702 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9703 dsl_binding.descriptorCount = 1;
9704 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9705 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06009706
9707 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009708 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9709 ds_layout_ci.pNext = NULL;
9710 ds_layout_ci.bindingCount = 1;
9711 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009712
Tobin Ehlis3b780662015-05-28 12:11:26 -06009713 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009714 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009715 ASSERT_VK_SUCCESS(err);
9716
9717 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009718 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009719 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009720 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009721 alloc_info.descriptorPool = ds_pool;
9722 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009723 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009724 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009725
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009726 // Correctly update descriptor to avoid "NOT_UPDATED" error
9727 VkDescriptorBufferInfo buff_info = {};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009728 buff_info.buffer = VkBuffer(0); // Don't care about buffer handle for this test
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009729 buff_info.offset = 0;
9730 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009731
9732 VkWriteDescriptorSet descriptor_write;
9733 memset(&descriptor_write, 0, sizeof(descriptor_write));
9734 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009735 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009736 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08009737 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06009738 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9739 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009740
9741 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9742
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009743 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009744
Chia-I Wuf7458c52015-10-26 21:10:41 +08009745 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9746 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009747}
9748
Karl Schultz6addd812016-02-02 17:17:23 -07009749TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -07009750 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -07009751 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009752
Tobin Ehlisc8d352d2016-11-21 10:33:40 -07009753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009754
Tobin Ehlis3b780662015-05-28 12:11:26 -06009755 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009756 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009757 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009758 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9759 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009760
9761 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009762 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9763 ds_pool_ci.pNext = NULL;
9764 ds_pool_ci.maxSets = 1;
9765 ds_pool_ci.poolSizeCount = 1;
9766 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009767
Tobin Ehlis3b780662015-05-28 12:11:26 -06009768 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009769 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009770 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009771
Tony Barboureb254902015-07-15 12:50:33 -06009772 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009773 dsl_binding.binding = 0;
9774 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9775 dsl_binding.descriptorCount = 1;
9776 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9777 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06009778
9779 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009780 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9781 ds_layout_ci.pNext = NULL;
9782 ds_layout_ci.bindingCount = 1;
9783 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009784 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009785 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009786 ASSERT_VK_SUCCESS(err);
9787
9788 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009789 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009790 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009791 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009792 alloc_info.descriptorPool = ds_pool;
9793 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009794 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009795 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009796
Tony Barboureb254902015-07-15 12:50:33 -06009797 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009798 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9799 sampler_ci.pNext = NULL;
9800 sampler_ci.magFilter = VK_FILTER_NEAREST;
9801 sampler_ci.minFilter = VK_FILTER_NEAREST;
9802 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9803 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9804 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9805 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9806 sampler_ci.mipLodBias = 1.0;
9807 sampler_ci.anisotropyEnable = VK_FALSE;
9808 sampler_ci.maxAnisotropy = 1;
9809 sampler_ci.compareEnable = VK_FALSE;
9810 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9811 sampler_ci.minLod = 1.0;
9812 sampler_ci.maxLod = 1.0;
9813 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9814 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06009815
Tobin Ehlis3b780662015-05-28 12:11:26 -06009816 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009817 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009818 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009819
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009820 VkDescriptorImageInfo info = {};
9821 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009822
9823 VkWriteDescriptorSet descriptor_write;
9824 memset(&descriptor_write, 0, sizeof(descriptor_write));
9825 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009826 descriptor_write.dstSet = descriptorSet;
9827 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009828 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009829 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009830 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009831 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009832
9833 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9834
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009835 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009836
Chia-I Wuf7458c52015-10-26 21:10:41 +08009837 vkDestroySampler(m_device->device(), sampler, NULL);
9838 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9839 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009840}
9841
Tobin Ehlise202b2d2016-11-21 10:36:16 -07009842TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
9843 // Create layout w/ empty binding and attempt to update it
9844 VkResult err;
9845
9846 ASSERT_NO_FATAL_FAILURE(InitState());
9847
9848 VkDescriptorPoolSize ds_type_count = {};
9849 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
9850 ds_type_count.descriptorCount = 1;
9851
9852 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9853 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9854 ds_pool_ci.pNext = NULL;
9855 ds_pool_ci.maxSets = 1;
9856 ds_pool_ci.poolSizeCount = 1;
9857 ds_pool_ci.pPoolSizes = &ds_type_count;
9858
9859 VkDescriptorPool ds_pool;
9860 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9861 ASSERT_VK_SUCCESS(err);
9862
9863 VkDescriptorSetLayoutBinding dsl_binding = {};
9864 dsl_binding.binding = 0;
9865 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9866 dsl_binding.descriptorCount = 0;
9867 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9868 dsl_binding.pImmutableSamplers = NULL;
9869
9870 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9871 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9872 ds_layout_ci.pNext = NULL;
9873 ds_layout_ci.bindingCount = 1;
9874 ds_layout_ci.pBindings = &dsl_binding;
9875 VkDescriptorSetLayout ds_layout;
9876 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9877 ASSERT_VK_SUCCESS(err);
9878
9879 VkDescriptorSet descriptor_set;
9880 VkDescriptorSetAllocateInfo alloc_info = {};
9881 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9882 alloc_info.descriptorSetCount = 1;
9883 alloc_info.descriptorPool = ds_pool;
9884 alloc_info.pSetLayouts = &ds_layout;
9885 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9886 ASSERT_VK_SUCCESS(err);
9887
9888 VkSamplerCreateInfo sampler_ci = {};
9889 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9890 sampler_ci.magFilter = VK_FILTER_NEAREST;
9891 sampler_ci.minFilter = VK_FILTER_NEAREST;
9892 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9893 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9894 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9895 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9896 sampler_ci.mipLodBias = 1.0;
9897 sampler_ci.maxAnisotropy = 1;
9898 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9899 sampler_ci.minLod = 1.0;
9900 sampler_ci.maxLod = 1.0;
9901 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9902
9903 VkSampler sampler;
9904 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
9905 ASSERT_VK_SUCCESS(err);
9906
9907 VkDescriptorImageInfo info = {};
9908 info.sampler = sampler;
9909
9910 VkWriteDescriptorSet descriptor_write;
9911 memset(&descriptor_write, 0, sizeof(descriptor_write));
9912 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9913 descriptor_write.dstSet = descriptor_set;
9914 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009915 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -07009916 // This is the wrong type, but empty binding error will be flagged first
9917 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9918 descriptor_write.pImageInfo = &info;
9919
9920 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
9921 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9922 m_errorMonitor->VerifyFound();
9923
9924 vkDestroySampler(m_device->device(), sampler, NULL);
9925 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9926 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9927}
9928
Karl Schultz6addd812016-02-02 17:17:23 -07009929TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
9930 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
9931 // types
9932 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009933
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009934 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 -06009935
Tobin Ehlis3b780662015-05-28 12:11:26 -06009936 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009937
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009938 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009939 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9940 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009941
9942 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009943 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9944 ds_pool_ci.pNext = NULL;
9945 ds_pool_ci.maxSets = 1;
9946 ds_pool_ci.poolSizeCount = 1;
9947 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009948
Tobin Ehlis3b780662015-05-28 12:11:26 -06009949 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009950 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009951 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009952 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009953 dsl_binding.binding = 0;
9954 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9955 dsl_binding.descriptorCount = 1;
9956 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9957 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009958
Tony Barboureb254902015-07-15 12:50:33 -06009959 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009960 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9961 ds_layout_ci.pNext = NULL;
9962 ds_layout_ci.bindingCount = 1;
9963 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009964
Tobin Ehlis3b780662015-05-28 12:11:26 -06009965 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009966 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009967 ASSERT_VK_SUCCESS(err);
9968
9969 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009970 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009971 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009972 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009973 alloc_info.descriptorPool = ds_pool;
9974 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009975 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009976 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009977
Tony Barboureb254902015-07-15 12:50:33 -06009978 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009979 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9980 sampler_ci.pNext = NULL;
9981 sampler_ci.magFilter = VK_FILTER_NEAREST;
9982 sampler_ci.minFilter = VK_FILTER_NEAREST;
9983 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9984 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9985 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9986 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9987 sampler_ci.mipLodBias = 1.0;
9988 sampler_ci.anisotropyEnable = VK_FALSE;
9989 sampler_ci.maxAnisotropy = 1;
9990 sampler_ci.compareEnable = VK_FALSE;
9991 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9992 sampler_ci.minLod = 1.0;
9993 sampler_ci.maxLod = 1.0;
9994 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9995 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009996 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009997 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009998 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009999
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010000 VkDescriptorImageInfo info = {};
10001 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010002
10003 VkWriteDescriptorSet descriptor_write;
10004 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010005 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010006 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010007 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010008 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010009 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010010 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010011
10012 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10013
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010014 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010015
Chia-I Wuf7458c52015-10-26 21:10:41 +080010016 vkDestroySampler(m_device->device(), sampler, NULL);
10017 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10018 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010019}
10020
Karl Schultz6addd812016-02-02 17:17:23 -070010021TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010022 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010023 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010024
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010025 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010026
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010027 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010028 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10029 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010030 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010031 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10032 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010033
10034 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010035 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10036 ds_pool_ci.pNext = NULL;
10037 ds_pool_ci.maxSets = 1;
10038 ds_pool_ci.poolSizeCount = 1;
10039 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010040
10041 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010042 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010043 ASSERT_VK_SUCCESS(err);
10044
10045 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010046 dsl_binding.binding = 0;
10047 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10048 dsl_binding.descriptorCount = 1;
10049 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10050 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010051
10052 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010053 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10054 ds_layout_ci.pNext = NULL;
10055 ds_layout_ci.bindingCount = 1;
10056 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010057 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010058 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010059 ASSERT_VK_SUCCESS(err);
10060
10061 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010062 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010063 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010064 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010065 alloc_info.descriptorPool = ds_pool;
10066 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010067 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010068 ASSERT_VK_SUCCESS(err);
10069
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010070 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010071
10072 VkDescriptorImageInfo descriptor_info;
10073 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10074 descriptor_info.sampler = sampler;
10075
10076 VkWriteDescriptorSet descriptor_write;
10077 memset(&descriptor_write, 0, sizeof(descriptor_write));
10078 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010079 descriptor_write.dstSet = descriptorSet;
10080 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010081 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010082 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10083 descriptor_write.pImageInfo = &descriptor_info;
10084
10085 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10086
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010087 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010088
Chia-I Wuf7458c52015-10-26 21:10:41 +080010089 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10090 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010091}
10092
Karl Schultz6addd812016-02-02 17:17:23 -070010093TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10094 // Create a single combined Image/Sampler descriptor and send it an invalid
10095 // imageView
10096 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010097
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010099
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010100 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010101 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010102 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10103 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010104
10105 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010106 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10107 ds_pool_ci.pNext = NULL;
10108 ds_pool_ci.maxSets = 1;
10109 ds_pool_ci.poolSizeCount = 1;
10110 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010111
10112 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010113 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010114 ASSERT_VK_SUCCESS(err);
10115
10116 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010117 dsl_binding.binding = 0;
10118 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10119 dsl_binding.descriptorCount = 1;
10120 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10121 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010122
10123 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010124 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10125 ds_layout_ci.pNext = NULL;
10126 ds_layout_ci.bindingCount = 1;
10127 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010128 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010129 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010130 ASSERT_VK_SUCCESS(err);
10131
10132 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010133 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010134 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010135 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010136 alloc_info.descriptorPool = ds_pool;
10137 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010138 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010139 ASSERT_VK_SUCCESS(err);
10140
10141 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010142 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10143 sampler_ci.pNext = NULL;
10144 sampler_ci.magFilter = VK_FILTER_NEAREST;
10145 sampler_ci.minFilter = VK_FILTER_NEAREST;
10146 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10147 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10148 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10149 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10150 sampler_ci.mipLodBias = 1.0;
10151 sampler_ci.anisotropyEnable = VK_FALSE;
10152 sampler_ci.maxAnisotropy = 1;
10153 sampler_ci.compareEnable = VK_FALSE;
10154 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10155 sampler_ci.minLod = 1.0;
10156 sampler_ci.maxLod = 1.0;
10157 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10158 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010159
10160 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010161 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010162 ASSERT_VK_SUCCESS(err);
10163
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010164 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010165
10166 VkDescriptorImageInfo descriptor_info;
10167 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10168 descriptor_info.sampler = sampler;
10169 descriptor_info.imageView = view;
10170
10171 VkWriteDescriptorSet descriptor_write;
10172 memset(&descriptor_write, 0, sizeof(descriptor_write));
10173 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010174 descriptor_write.dstSet = descriptorSet;
10175 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010176 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010177 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10178 descriptor_write.pImageInfo = &descriptor_info;
10179
10180 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10181
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010182 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010183
Chia-I Wuf7458c52015-10-26 21:10:41 +080010184 vkDestroySampler(m_device->device(), sampler, NULL);
10185 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10186 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010187}
10188
Karl Schultz6addd812016-02-02 17:17:23 -070010189TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10190 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10191 // into the other
10192 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010193
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010194 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10195 " binding #1 with type "
10196 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10197 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010198
Tobin Ehlis04356f92015-10-27 16:35:27 -060010199 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010200 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010201 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010202 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10203 ds_type_count[0].descriptorCount = 1;
10204 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10205 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010206
10207 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010208 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10209 ds_pool_ci.pNext = NULL;
10210 ds_pool_ci.maxSets = 1;
10211 ds_pool_ci.poolSizeCount = 2;
10212 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010213
10214 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010215 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010216 ASSERT_VK_SUCCESS(err);
10217 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010218 dsl_binding[0].binding = 0;
10219 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10220 dsl_binding[0].descriptorCount = 1;
10221 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10222 dsl_binding[0].pImmutableSamplers = NULL;
10223 dsl_binding[1].binding = 1;
10224 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10225 dsl_binding[1].descriptorCount = 1;
10226 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10227 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010228
10229 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010230 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10231 ds_layout_ci.pNext = NULL;
10232 ds_layout_ci.bindingCount = 2;
10233 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010234
10235 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010236 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010237 ASSERT_VK_SUCCESS(err);
10238
10239 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010240 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010241 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010242 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010243 alloc_info.descriptorPool = ds_pool;
10244 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010245 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010246 ASSERT_VK_SUCCESS(err);
10247
10248 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010249 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10250 sampler_ci.pNext = NULL;
10251 sampler_ci.magFilter = VK_FILTER_NEAREST;
10252 sampler_ci.minFilter = VK_FILTER_NEAREST;
10253 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10254 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10255 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10256 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10257 sampler_ci.mipLodBias = 1.0;
10258 sampler_ci.anisotropyEnable = VK_FALSE;
10259 sampler_ci.maxAnisotropy = 1;
10260 sampler_ci.compareEnable = VK_FALSE;
10261 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10262 sampler_ci.minLod = 1.0;
10263 sampler_ci.maxLod = 1.0;
10264 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10265 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010266
10267 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010268 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010269 ASSERT_VK_SUCCESS(err);
10270
10271 VkDescriptorImageInfo info = {};
10272 info.sampler = sampler;
10273
10274 VkWriteDescriptorSet descriptor_write;
10275 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10276 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010277 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010278 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010279 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010280 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10281 descriptor_write.pImageInfo = &info;
10282 // This write update should succeed
10283 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10284 // Now perform a copy update that fails due to type mismatch
10285 VkCopyDescriptorSet copy_ds_update;
10286 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10287 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10288 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010289 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010290 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010291 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
10292 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010293 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10294
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010295 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010296 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010297 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 -060010298 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10299 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10300 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010301 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010302 copy_ds_update.dstSet = descriptorSet;
10303 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010304 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010305 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10306
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010307 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010308
Tobin Ehlis04356f92015-10-27 16:35:27 -060010309 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10311 " binding#1 with offset index of 1 plus "
10312 "update array offset of 0 and update of "
10313 "5 descriptors oversteps total number "
10314 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010315
Tobin Ehlis04356f92015-10-27 16:35:27 -060010316 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10317 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10318 copy_ds_update.srcSet = descriptorSet;
10319 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010320 copy_ds_update.dstSet = descriptorSet;
10321 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010322 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010323 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10324
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010325 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010326
Chia-I Wuf7458c52015-10-26 21:10:41 +080010327 vkDestroySampler(m_device->device(), sampler, NULL);
10328 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10329 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010330}
10331
Karl Schultz6addd812016-02-02 17:17:23 -070010332TEST_F(VkLayerTest, NumSamplesMismatch) {
10333 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10334 // sampleCount
10335 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010336
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010337 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010338
Tobin Ehlis3b780662015-05-28 12:11:26 -060010339 ASSERT_NO_FATAL_FAILURE(InitState());
10340 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010341 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010342 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010343 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010344
10345 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010346 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10347 ds_pool_ci.pNext = NULL;
10348 ds_pool_ci.maxSets = 1;
10349 ds_pool_ci.poolSizeCount = 1;
10350 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010351
Tobin Ehlis3b780662015-05-28 12:11:26 -060010352 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010353 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010354 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010355
Tony Barboureb254902015-07-15 12:50:33 -060010356 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010357 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010358 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010359 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010360 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10361 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010362
Tony Barboureb254902015-07-15 12:50:33 -060010363 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10364 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10365 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010366 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010367 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010368
Tobin Ehlis3b780662015-05-28 12:11:26 -060010369 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010370 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010371 ASSERT_VK_SUCCESS(err);
10372
10373 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010374 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010375 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010376 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010377 alloc_info.descriptorPool = ds_pool;
10378 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010379 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010380 ASSERT_VK_SUCCESS(err);
10381
Tony Barboureb254902015-07-15 12:50:33 -060010382 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010383 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010384 pipe_ms_state_ci.pNext = NULL;
10385 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10386 pipe_ms_state_ci.sampleShadingEnable = 0;
10387 pipe_ms_state_ci.minSampleShading = 1.0;
10388 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010389
Tony Barboureb254902015-07-15 12:50:33 -060010390 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010391 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10392 pipeline_layout_ci.pNext = NULL;
10393 pipeline_layout_ci.setLayoutCount = 1;
10394 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010395
10396 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010397 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010398 ASSERT_VK_SUCCESS(err);
10399
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010400 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010401 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 -060010402 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010403 VkPipelineObj pipe(m_device);
10404 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010405 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010406 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010407 pipe.SetMSAA(&pipe_ms_state_ci);
10408 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010409
Tony Barbour552f6c02016-12-21 14:34:07 -070010410 m_commandBuffer->BeginCommandBuffer();
10411 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010412 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010413
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070010414 VkViewport viewport = {0, 0, 16, 16, 0, 1};
10415 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
10416 VkRect2D scissor = {{0, 0}, {16, 16}};
10417 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
10418
Mark Young29927482016-05-04 14:38:51 -060010419 // Render triangle (the error should trigger on the attempt to draw).
10420 Draw(3, 1, 0, 0);
10421
10422 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010423 m_commandBuffer->EndRenderPass();
10424 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060010425
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010426 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010427
Chia-I Wuf7458c52015-10-26 21:10:41 +080010428 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10429 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10430 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010431}
Mark Young29927482016-05-04 14:38:51 -060010432
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010433TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010434 TEST_DESCRIPTION(
10435 "Hit RenderPass incompatible cases. "
10436 "Initial case is drawing with an active renderpass that's "
10437 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010438 VkResult err;
10439
10440 ASSERT_NO_FATAL_FAILURE(InitState());
10441 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10442
10443 VkDescriptorSetLayoutBinding dsl_binding = {};
10444 dsl_binding.binding = 0;
10445 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10446 dsl_binding.descriptorCount = 1;
10447 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10448 dsl_binding.pImmutableSamplers = NULL;
10449
10450 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10451 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10452 ds_layout_ci.pNext = NULL;
10453 ds_layout_ci.bindingCount = 1;
10454 ds_layout_ci.pBindings = &dsl_binding;
10455
10456 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010457 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010458 ASSERT_VK_SUCCESS(err);
10459
10460 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10461 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10462 pipeline_layout_ci.pNext = NULL;
10463 pipeline_layout_ci.setLayoutCount = 1;
10464 pipeline_layout_ci.pSetLayouts = &ds_layout;
10465
10466 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010467 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010468 ASSERT_VK_SUCCESS(err);
10469
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010470 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010471 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 -060010472 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010473 // Create a renderpass that will be incompatible with default renderpass
10474 VkAttachmentReference attach = {};
10475 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
10476 VkAttachmentReference color_att = {};
10477 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10478 VkSubpassDescription subpass = {};
10479 subpass.inputAttachmentCount = 1;
10480 subpass.pInputAttachments = &attach;
10481 subpass.colorAttachmentCount = 1;
10482 subpass.pColorAttachments = &color_att;
10483 VkRenderPassCreateInfo rpci = {};
10484 rpci.subpassCount = 1;
10485 rpci.pSubpasses = &subpass;
10486 rpci.attachmentCount = 1;
10487 VkAttachmentDescription attach_desc = {};
10488 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060010489 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
10490 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010491 rpci.pAttachments = &attach_desc;
10492 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
10493 VkRenderPass rp;
10494 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10495 VkPipelineObj pipe(m_device);
10496 pipe.AddShader(&vs);
10497 pipe.AddShader(&fs);
10498 pipe.AddColorAttachment();
10499 VkViewport view_port = {};
10500 m_viewports.push_back(view_port);
10501 pipe.SetViewport(m_viewports);
10502 VkRect2D rect = {};
10503 m_scissors.push_back(rect);
10504 pipe.SetScissor(m_scissors);
10505 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10506
10507 VkCommandBufferInheritanceInfo cbii = {};
10508 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
10509 cbii.renderPass = rp;
10510 cbii.subpass = 0;
10511 VkCommandBufferBeginInfo cbbi = {};
10512 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
10513 cbbi.pInheritanceInfo = &cbii;
10514 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
10515 VkRenderPassBeginInfo rpbi = {};
10516 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
10517 rpbi.framebuffer = m_framebuffer;
10518 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010519 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
10520 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010521
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010523 // Render triangle (the error should trigger on the attempt to draw).
10524 Draw(3, 1, 0, 0);
10525
10526 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010527 m_commandBuffer->EndRenderPass();
10528 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010529
10530 m_errorMonitor->VerifyFound();
10531
10532 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10533 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10534 vkDestroyRenderPass(m_device->device(), rp, NULL);
10535}
10536
Mark Youngc89c6312016-03-31 16:03:20 -060010537TEST_F(VkLayerTest, NumBlendAttachMismatch) {
10538 // Create Pipeline where the number of blend attachments doesn't match the
10539 // number of color attachments. In this case, we don't add any color
10540 // blend attachments even though we have a color attachment.
10541 VkResult err;
10542
Tobin Ehlis974c0d92017-02-01 13:31:22 -070010543 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060010544
10545 ASSERT_NO_FATAL_FAILURE(InitState());
10546 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10547 VkDescriptorPoolSize ds_type_count = {};
10548 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10549 ds_type_count.descriptorCount = 1;
10550
10551 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10552 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10553 ds_pool_ci.pNext = NULL;
10554 ds_pool_ci.maxSets = 1;
10555 ds_pool_ci.poolSizeCount = 1;
10556 ds_pool_ci.pPoolSizes = &ds_type_count;
10557
10558 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010559 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060010560 ASSERT_VK_SUCCESS(err);
10561
10562 VkDescriptorSetLayoutBinding dsl_binding = {};
10563 dsl_binding.binding = 0;
10564 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10565 dsl_binding.descriptorCount = 1;
10566 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10567 dsl_binding.pImmutableSamplers = NULL;
10568
10569 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10570 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10571 ds_layout_ci.pNext = NULL;
10572 ds_layout_ci.bindingCount = 1;
10573 ds_layout_ci.pBindings = &dsl_binding;
10574
10575 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010576 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060010577 ASSERT_VK_SUCCESS(err);
10578
10579 VkDescriptorSet descriptorSet;
10580 VkDescriptorSetAllocateInfo alloc_info = {};
10581 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10582 alloc_info.descriptorSetCount = 1;
10583 alloc_info.descriptorPool = ds_pool;
10584 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010585 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060010586 ASSERT_VK_SUCCESS(err);
10587
10588 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010589 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060010590 pipe_ms_state_ci.pNext = NULL;
10591 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10592 pipe_ms_state_ci.sampleShadingEnable = 0;
10593 pipe_ms_state_ci.minSampleShading = 1.0;
10594 pipe_ms_state_ci.pSampleMask = NULL;
10595
10596 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10597 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10598 pipeline_layout_ci.pNext = NULL;
10599 pipeline_layout_ci.setLayoutCount = 1;
10600 pipeline_layout_ci.pSetLayouts = &ds_layout;
10601
10602 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010603 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060010604 ASSERT_VK_SUCCESS(err);
10605
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010606 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010607 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 -060010608 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060010609 VkPipelineObj pipe(m_device);
10610 pipe.AddShader(&vs);
10611 pipe.AddShader(&fs);
10612 pipe.SetMSAA(&pipe_ms_state_ci);
10613 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010614 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060010615
10616 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10617 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10618 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10619}
Mark Young29927482016-05-04 14:38:51 -060010620
Mark Muellerd4914412016-06-13 17:52:06 -060010621TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010622 TEST_DESCRIPTION(
10623 "Points to a wrong colorAttachment index in a VkClearAttachment "
10624 "structure passed to vkCmdClearAttachments");
Cody Northropc31a84f2016-08-22 10:41:47 -060010625 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010626 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060010627
10628 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
10629 m_errorMonitor->VerifyFound();
10630}
10631
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010632TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010633 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
10634 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010635
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010636 ASSERT_NO_FATAL_FAILURE(InitState());
10637 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010638
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010639 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010640 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10641 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010642
10643 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010644 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10645 ds_pool_ci.pNext = NULL;
10646 ds_pool_ci.maxSets = 1;
10647 ds_pool_ci.poolSizeCount = 1;
10648 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010649
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010650 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010651 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010652 ASSERT_VK_SUCCESS(err);
10653
Tony Barboureb254902015-07-15 12:50:33 -060010654 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010655 dsl_binding.binding = 0;
10656 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10657 dsl_binding.descriptorCount = 1;
10658 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10659 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010660
Tony Barboureb254902015-07-15 12:50:33 -060010661 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010662 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10663 ds_layout_ci.pNext = NULL;
10664 ds_layout_ci.bindingCount = 1;
10665 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010666
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010667 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010668 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010669 ASSERT_VK_SUCCESS(err);
10670
10671 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010672 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010673 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010674 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010675 alloc_info.descriptorPool = ds_pool;
10676 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010677 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010678 ASSERT_VK_SUCCESS(err);
10679
Tony Barboureb254902015-07-15 12:50:33 -060010680 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010681 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010682 pipe_ms_state_ci.pNext = NULL;
10683 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10684 pipe_ms_state_ci.sampleShadingEnable = 0;
10685 pipe_ms_state_ci.minSampleShading = 1.0;
10686 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010687
Tony Barboureb254902015-07-15 12:50:33 -060010688 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010689 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10690 pipeline_layout_ci.pNext = NULL;
10691 pipeline_layout_ci.setLayoutCount = 1;
10692 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010693
10694 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010695 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010696 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010697
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010698 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060010699 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070010700 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010701 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010702
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010703 VkPipelineObj pipe(m_device);
10704 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010705 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010706 pipe.SetMSAA(&pipe_ms_state_ci);
10707 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060010708
Tony Barbour552f6c02016-12-21 14:34:07 -070010709 m_commandBuffer->BeginCommandBuffer();
10710 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010711
Karl Schultz6addd812016-02-02 17:17:23 -070010712 // Main thing we care about for this test is that the VkImage obj we're
10713 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010714 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010715 VkClearAttachment color_attachment;
10716 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10717 color_attachment.clearValue.color.float32[0] = 1.0;
10718 color_attachment.clearValue.color.float32[1] = 1.0;
10719 color_attachment.clearValue.color.float32[2] = 1.0;
10720 color_attachment.clearValue.color.float32[3] = 1.0;
10721 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010722 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010723
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010724 // Call for full-sized FB Color attachment prior to issuing a Draw
10725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070010726 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010727 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010728 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010729
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010730 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
10731 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
10732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
10733 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
10734 m_errorMonitor->VerifyFound();
10735
10736 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
10737 clear_rect.layerCount = 2;
10738 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
10739 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010740 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010741
Chia-I Wuf7458c52015-10-26 21:10:41 +080010742 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10743 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10744 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010745}
10746
Karl Schultz6addd812016-02-02 17:17:23 -070010747TEST_F(VkLayerTest, VtxBufferBadIndex) {
10748 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010749
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010750 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10751 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010752
Tobin Ehlis502480b2015-06-24 15:53:07 -060010753 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060010754 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060010755 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010756
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010757 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010758 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10759 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010760
10761 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010762 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10763 ds_pool_ci.pNext = NULL;
10764 ds_pool_ci.maxSets = 1;
10765 ds_pool_ci.poolSizeCount = 1;
10766 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010767
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010768 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010769 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010770 ASSERT_VK_SUCCESS(err);
10771
Tony Barboureb254902015-07-15 12:50:33 -060010772 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010773 dsl_binding.binding = 0;
10774 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10775 dsl_binding.descriptorCount = 1;
10776 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10777 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010778
Tony Barboureb254902015-07-15 12:50:33 -060010779 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010780 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10781 ds_layout_ci.pNext = NULL;
10782 ds_layout_ci.bindingCount = 1;
10783 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010784
Tobin Ehlis502480b2015-06-24 15:53:07 -060010785 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010786 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010787 ASSERT_VK_SUCCESS(err);
10788
10789 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010790 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010791 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010792 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010793 alloc_info.descriptorPool = ds_pool;
10794 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010795 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010796 ASSERT_VK_SUCCESS(err);
10797
Tony Barboureb254902015-07-15 12:50:33 -060010798 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010799 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010800 pipe_ms_state_ci.pNext = NULL;
10801 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10802 pipe_ms_state_ci.sampleShadingEnable = 0;
10803 pipe_ms_state_ci.minSampleShading = 1.0;
10804 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010805
Tony Barboureb254902015-07-15 12:50:33 -060010806 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010807 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10808 pipeline_layout_ci.pNext = NULL;
10809 pipeline_layout_ci.setLayoutCount = 1;
10810 pipeline_layout_ci.pSetLayouts = &ds_layout;
10811 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010812
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010813 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010814 ASSERT_VK_SUCCESS(err);
10815
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010816 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010817 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 -060010818 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010819 VkPipelineObj pipe(m_device);
10820 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010821 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010822 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010823 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060010824 pipe.SetViewport(m_viewports);
10825 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010826 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060010827
Tony Barbour552f6c02016-12-21 14:34:07 -070010828 m_commandBuffer->BeginCommandBuffer();
10829 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010830 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060010831 // Don't care about actual data, just need to get to draw to flag error
10832 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010833 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010834 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060010835 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010836
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010837 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010838
Chia-I Wuf7458c52015-10-26 21:10:41 +080010839 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10840 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10841 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010842}
Mark Muellerdfe37552016-07-07 14:47:42 -060010843
Mark Mueller2ee294f2016-08-04 12:59:48 -060010844TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010845 TEST_DESCRIPTION(
10846 "Use an invalid count in a vkEnumeratePhysicalDevices call."
10847 "Use invalid Queue Family Index in vkCreateDevice");
Cody Northropc31a84f2016-08-22 10:41:47 -060010848 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Mueller2ee294f2016-08-04 12:59:48 -060010849
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010850 const char *invalid_queueFamilyIndex_message =
10851 "Invalid queue create request in vkCreateDevice(). Invalid "
10852 "queueFamilyIndex ";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010853
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010854 const char *unavailable_feature_message = "While calling vkCreateDevice(), requesting feature #";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010855
Mark Mueller880fce52016-08-17 15:23:23 -060010856 // The following test fails with recent NVidia drivers.
10857 // By the time core_validation is reached, the NVidia
10858 // driver has sanitized the invalid condition and core_validation
10859 // is not introduced to the failure condition. This is not the case
10860 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010861 // uint32_t count = static_cast<uint32_t>(~0);
10862 // VkPhysicalDevice physical_device;
10863 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
10864 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060010865
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010866 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queueFamilyIndex_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010867 float queue_priority = 0.0;
10868
10869 VkDeviceQueueCreateInfo queue_create_info = {};
10870 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
10871 queue_create_info.queueCount = 1;
10872 queue_create_info.pQueuePriorities = &queue_priority;
10873 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
10874
10875 VkPhysicalDeviceFeatures features = m_device->phy().features();
10876 VkDevice testDevice;
10877 VkDeviceCreateInfo device_create_info = {};
10878 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
10879 device_create_info.queueCreateInfoCount = 1;
10880 device_create_info.pQueueCreateInfos = &queue_create_info;
10881 device_create_info.pEnabledFeatures = &features;
10882 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
10883 m_errorMonitor->VerifyFound();
10884
10885 queue_create_info.queueFamilyIndex = 1;
10886
10887 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
10888 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
10889 for (unsigned i = 0; i < feature_count; i++) {
10890 if (VK_FALSE == feature_array[i]) {
10891 feature_array[i] = VK_TRUE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, unavailable_feature_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010893 device_create_info.pEnabledFeatures = &features;
10894 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
10895 m_errorMonitor->VerifyFound();
10896 break;
10897 }
10898 }
10899}
10900
Tobin Ehlis16edf082016-11-21 12:33:49 -070010901TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
10902 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
10903
10904 ASSERT_NO_FATAL_FAILURE(InitState());
10905
10906 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
10907 std::vector<VkDeviceQueueCreateInfo> queue_info;
10908 queue_info.reserve(queue_props.size());
10909 std::vector<std::vector<float>> queue_priorities;
10910 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
10911 VkDeviceQueueCreateInfo qi{};
10912 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
10913 qi.queueFamilyIndex = i;
10914 qi.queueCount = queue_props[i].queueCount;
10915 queue_priorities.emplace_back(qi.queueCount, 0.0f);
10916 qi.pQueuePriorities = queue_priorities[i].data();
10917 queue_info.push_back(qi);
10918 }
10919
10920 std::vector<const char *> device_extension_names;
10921
10922 VkDevice local_device;
10923 VkDeviceCreateInfo device_create_info = {};
10924 auto features = m_device->phy().features();
10925 // Intentionally disable pipeline stats
10926 features.pipelineStatisticsQuery = VK_FALSE;
10927 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
10928 device_create_info.pNext = NULL;
10929 device_create_info.queueCreateInfoCount = queue_info.size();
10930 device_create_info.pQueueCreateInfos = queue_info.data();
10931 device_create_info.enabledLayerCount = 0;
10932 device_create_info.ppEnabledLayerNames = NULL;
10933 device_create_info.pEnabledFeatures = &features;
10934 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
10935 ASSERT_VK_SUCCESS(err);
10936
10937 VkQueryPoolCreateInfo qpci{};
10938 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
10939 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
10940 qpci.queryCount = 1;
10941 VkQueryPool query_pool;
10942
10943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
10944 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
10945 m_errorMonitor->VerifyFound();
10946
10947 vkDestroyDevice(local_device, nullptr);
10948}
10949
Mark Mueller2ee294f2016-08-04 12:59:48 -060010950TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010951 TEST_DESCRIPTION(
10952 "Use an invalid queue index in a vkCmdWaitEvents call."
10953 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060010954
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010955 const char *invalid_queue_index =
10956 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
10957 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
10958 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010959
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010960 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010961
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010962 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010963
10964 ASSERT_NO_FATAL_FAILURE(InitState());
10965
10966 VkEvent event;
10967 VkEventCreateInfo event_create_info{};
10968 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
10969 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
10970
Mark Mueller2ee294f2016-08-04 12:59:48 -060010971 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010972 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010973
Tony Barbour552f6c02016-12-21 14:34:07 -070010974 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060010975
10976 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010977 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 -060010978 ASSERT_TRUE(image.initialized());
10979 VkImageMemoryBarrier img_barrier = {};
10980 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10981 img_barrier.pNext = NULL;
10982 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10983 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10984 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10985 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10986 img_barrier.image = image.handle();
10987 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060010988
10989 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
10990 // that layer validation catches the case when it is not.
10991 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060010992 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10993 img_barrier.subresourceRange.baseArrayLayer = 0;
10994 img_barrier.subresourceRange.baseMipLevel = 0;
10995 img_barrier.subresourceRange.layerCount = 1;
10996 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010997 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
10998 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010999 m_errorMonitor->VerifyFound();
11000
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011001 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011002
11003 VkQueryPool query_pool;
11004 VkQueryPoolCreateInfo query_pool_create_info = {};
11005 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11006 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11007 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011008 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011009
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011010 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011011 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11012
11013 vkEndCommandBuffer(m_commandBuffer->handle());
11014 m_errorMonitor->VerifyFound();
11015
11016 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11017 vkDestroyEvent(m_device->device(), event, nullptr);
11018}
11019
Mark Muellerdfe37552016-07-07 14:47:42 -060011020TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011021 TEST_DESCRIPTION(
11022 "Submit a command buffer using deleted vertex buffer, "
11023 "delete a buffer twice, use an invalid offset for each "
11024 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011025
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011026 const char *deleted_buffer_in_command_buffer =
11027 "Cannot submit cmd buffer "
11028 "using deleted buffer ";
11029 const char *invalid_offset_message =
11030 "vkBindBufferMemory(): "
11031 "memoryOffset is 0x";
11032 const char *invalid_storage_buffer_offset_message =
11033 "vkBindBufferMemory(): "
11034 "storage memoryOffset "
11035 "is 0x";
11036 const char *invalid_texel_buffer_offset_message =
11037 "vkBindBufferMemory(): "
11038 "texel memoryOffset "
11039 "is 0x";
11040 const char *invalid_uniform_buffer_offset_message =
11041 "vkBindBufferMemory(): "
11042 "uniform memoryOffset "
11043 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011044
11045 ASSERT_NO_FATAL_FAILURE(InitState());
11046 ASSERT_NO_FATAL_FAILURE(InitViewport());
11047 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11048
11049 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011050 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011051 pipe_ms_state_ci.pNext = NULL;
11052 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11053 pipe_ms_state_ci.sampleShadingEnable = 0;
11054 pipe_ms_state_ci.minSampleShading = 1.0;
11055 pipe_ms_state_ci.pSampleMask = nullptr;
11056
11057 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11058 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11059 VkPipelineLayout pipeline_layout;
11060
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011061 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011062 ASSERT_VK_SUCCESS(err);
11063
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011064 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11065 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011066 VkPipelineObj pipe(m_device);
11067 pipe.AddShader(&vs);
11068 pipe.AddShader(&fs);
11069 pipe.AddColorAttachment();
11070 pipe.SetMSAA(&pipe_ms_state_ci);
11071 pipe.SetViewport(m_viewports);
11072 pipe.SetScissor(m_scissors);
11073 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11074
Tony Barbour552f6c02016-12-21 14:34:07 -070011075 m_commandBuffer->BeginCommandBuffer();
11076 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011077 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011078
11079 {
11080 // Create and bind a vertex buffer in a reduced scope, which will cause
11081 // it to be deleted upon leaving this scope
11082 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011083 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011084 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11085 draw_verticies.AddVertexInputToPipe(pipe);
11086 }
11087
11088 Draw(1, 0, 0, 0);
11089
Tony Barbour552f6c02016-12-21 14:34:07 -070011090 m_commandBuffer->EndRenderPass();
11091 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011092
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011094 QueueCommandBuffer(false);
11095 m_errorMonitor->VerifyFound();
11096
11097 {
11098 // Create and bind a vertex buffer in a reduced scope, and delete it
11099 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011100 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011102 buffer_test.TestDoubleDestroy();
11103 }
11104 m_errorMonitor->VerifyFound();
11105
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011106 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011107 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
11109 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11110 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011111 m_errorMonitor->VerifyFound();
11112 }
11113
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011114 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11115 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011116 // Create and bind a memory buffer with an invalid offset again,
11117 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
11119 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11120 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011121 m_errorMonitor->VerifyFound();
11122 }
11123
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011124 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011125 // Create and bind a memory buffer with an invalid offset again, but
11126 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011127 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
11128 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11129 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011130 m_errorMonitor->VerifyFound();
11131 }
11132
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011133 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011134 // Create and bind a memory buffer with an invalid offset again, but
11135 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
11137 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11138 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011139 m_errorMonitor->VerifyFound();
11140 }
11141
11142 {
11143 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011145 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11146 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011147 m_errorMonitor->VerifyFound();
11148 }
11149
11150 {
11151 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011153 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11154 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011155 }
11156 m_errorMonitor->VerifyFound();
11157
11158 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11159}
11160
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011161// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11162TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011163 TEST_DESCRIPTION(
11164 "Hit all possible validation checks associated with the "
11165 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11166 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011167 // 3 in ValidateCmdBufImageLayouts
11168 // * -1 Attempt to submit cmd buf w/ deleted image
11169 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11170 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011171
11172 ASSERT_NO_FATAL_FAILURE(InitState());
11173 // Create src & dst images to use for copy operations
11174 VkImage src_image;
11175 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011176 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011177
11178 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11179 const int32_t tex_width = 32;
11180 const int32_t tex_height = 32;
11181
11182 VkImageCreateInfo image_create_info = {};
11183 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11184 image_create_info.pNext = NULL;
11185 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11186 image_create_info.format = tex_format;
11187 image_create_info.extent.width = tex_width;
11188 image_create_info.extent.height = tex_height;
11189 image_create_info.extent.depth = 1;
11190 image_create_info.mipLevels = 1;
11191 image_create_info.arrayLayers = 4;
11192 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11193 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11194 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011195 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011196 image_create_info.flags = 0;
11197
11198 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11199 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011200 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011201 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11202 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011203 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11204 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11205 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11206 ASSERT_VK_SUCCESS(err);
11207
11208 // Allocate memory
11209 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011210 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011211 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011212 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11213 mem_alloc.pNext = NULL;
11214 mem_alloc.allocationSize = 0;
11215 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011216
11217 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011218 mem_alloc.allocationSize = img_mem_reqs.size;
11219 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011220 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011221 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011222 ASSERT_VK_SUCCESS(err);
11223
11224 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011225 mem_alloc.allocationSize = img_mem_reqs.size;
11226 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011227 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011228 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080011229 ASSERT_VK_SUCCESS(err);
11230
11231 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011232 mem_alloc.allocationSize = img_mem_reqs.size;
11233 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011234 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011235 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080011236 ASSERT_VK_SUCCESS(err);
11237
11238 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
11239 ASSERT_VK_SUCCESS(err);
11240 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
11241 ASSERT_VK_SUCCESS(err);
11242 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
11243 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011244
Tony Barbour552f6c02016-12-21 14:34:07 -070011245 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080011246 VkImageCopy copy_region;
11247 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11248 copy_region.srcSubresource.mipLevel = 0;
11249 copy_region.srcSubresource.baseArrayLayer = 0;
11250 copy_region.srcSubresource.layerCount = 1;
11251 copy_region.srcOffset.x = 0;
11252 copy_region.srcOffset.y = 0;
11253 copy_region.srcOffset.z = 0;
11254 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11255 copy_region.dstSubresource.mipLevel = 0;
11256 copy_region.dstSubresource.baseArrayLayer = 0;
11257 copy_region.dstSubresource.layerCount = 1;
11258 copy_region.dstOffset.x = 0;
11259 copy_region.dstOffset.y = 0;
11260 copy_region.dstOffset.z = 0;
11261 copy_region.extent.width = 1;
11262 copy_region.extent.height = 1;
11263 copy_region.extent.depth = 1;
11264
11265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11266 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11267 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 -060011268 m_errorMonitor->VerifyFound();
11269 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11271 "Cannot copy from an image whose source layout is "
11272 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
11273 "layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011274 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 -060011275 m_errorMonitor->VerifyFound();
11276 // Final src error is due to bad layout type
11277 m_errorMonitor->SetDesiredFailureMsg(
11278 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11279 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011280 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 -060011281 m_errorMonitor->VerifyFound();
11282 // Now verify same checks for dst
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11284 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011285 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 -060011286 m_errorMonitor->VerifyFound();
11287 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11289 "Cannot copy from an image whose dest layout is "
11290 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
11291 "layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011292 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 -060011293 m_errorMonitor->VerifyFound();
11294 m_errorMonitor->SetDesiredFailureMsg(
11295 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11296 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011297 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 -060011298 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011299
Cort3b021012016-12-07 12:00:57 -080011300 // Convert dst and depth images to TRANSFER_DST for subsequent tests
11301 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
11302 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11303 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11304 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
11305 transfer_dst_image_barrier[0].srcAccessMask = 0;
11306 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
11307 transfer_dst_image_barrier[0].image = dst_image;
11308 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11309 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
11310 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11311 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11312 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11313 transfer_dst_image_barrier[0].image = depth_image;
11314 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
11315 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11316 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11317
11318 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080011319 VkClearColorValue color_clear_value = {};
11320 VkImageSubresourceRange clear_range;
11321 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11322 clear_range.baseMipLevel = 0;
11323 clear_range.baseArrayLayer = 0;
11324 clear_range.layerCount = 1;
11325 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011326
Cort3b021012016-12-07 12:00:57 -080011327 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
11328 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
11330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011331 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011332 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011333 // Fail due to provided layout not matching actual current layout for color clear.
11334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011335 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011336 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011337
Cort530cf382016-12-08 09:59:47 -080011338 VkClearDepthStencilValue depth_clear_value = {};
11339 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080011340
11341 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
11342 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11343 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
11344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011345 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011346 m_errorMonitor->VerifyFound();
11347 // Fail due to provided layout not matching actual current layout for depth clear.
11348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011349 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011350 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011351
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011352 // Now cause error due to bad image layout transition in PipelineBarrier
11353 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080011354 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011355 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080011356 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011357 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080011358 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11359 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011360 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11362 "You cannot transition the layout of aspect 1 from "
11363 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when "
11364 "current layout is VK_IMAGE_LAYOUT_GENERAL.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011365 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11366 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011367 m_errorMonitor->VerifyFound();
11368
11369 // Finally some layout errors at RenderPass create time
11370 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11371 VkAttachmentReference attach = {};
11372 // perf warning for GENERAL layout w/ non-DS input attachment
11373 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11374 VkSubpassDescription subpass = {};
11375 subpass.inputAttachmentCount = 1;
11376 subpass.pInputAttachments = &attach;
11377 VkRenderPassCreateInfo rpci = {};
11378 rpci.subpassCount = 1;
11379 rpci.pSubpasses = &subpass;
11380 rpci.attachmentCount = 1;
11381 VkAttachmentDescription attach_desc = {};
11382 attach_desc.format = VK_FORMAT_UNDEFINED;
11383 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011384 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011385 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11387 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011388 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11389 m_errorMonitor->VerifyFound();
11390 // error w/ non-general layout
11391 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11392
11393 m_errorMonitor->SetDesiredFailureMsg(
11394 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11395 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11396 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11397 m_errorMonitor->VerifyFound();
11398 subpass.inputAttachmentCount = 0;
11399 subpass.colorAttachmentCount = 1;
11400 subpass.pColorAttachments = &attach;
11401 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11402 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11404 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011405 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11406 m_errorMonitor->VerifyFound();
11407 // error w/ non-color opt or GENERAL layout for color attachment
11408 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11409 m_errorMonitor->SetDesiredFailureMsg(
11410 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11411 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11412 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11413 m_errorMonitor->VerifyFound();
11414 subpass.colorAttachmentCount = 0;
11415 subpass.pDepthStencilAttachment = &attach;
11416 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11417 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011418 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11419 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011420 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11421 m_errorMonitor->VerifyFound();
11422 // error w/ non-ds opt or GENERAL layout for color attachment
11423 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11425 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
11426 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011427 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11428 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060011429 // For this error we need a valid renderpass so create default one
11430 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11431 attach.attachment = 0;
11432 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
11433 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
11434 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
11435 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
11436 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
11437 // Can't do a CLEAR load on READ_ONLY initialLayout
11438 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
11439 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11440 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11442 " with invalid first layout "
11443 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
11444 "ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060011445 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11446 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011447
Cort3b021012016-12-07 12:00:57 -080011448 vkFreeMemory(m_device->device(), src_image_mem, NULL);
11449 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
11450 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011451 vkDestroyImage(m_device->device(), src_image, NULL);
11452 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080011453 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011454}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060011455
Tobin Ehlise0936662016-10-11 08:10:51 -060011456TEST_F(VkLayerTest, InvalidStorageImageLayout) {
11457 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
11458 VkResult err;
11459
11460 ASSERT_NO_FATAL_FAILURE(InitState());
11461
11462 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
11463 VkImageTiling tiling;
11464 VkFormatProperties format_properties;
11465 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
11466 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
11467 tiling = VK_IMAGE_TILING_LINEAR;
11468 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
11469 tiling = VK_IMAGE_TILING_OPTIMAL;
11470 } else {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011471 printf(
11472 "Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
11473 "skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060011474 return;
11475 }
11476
11477 VkDescriptorPoolSize ds_type = {};
11478 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
11479 ds_type.descriptorCount = 1;
11480
11481 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11482 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11483 ds_pool_ci.maxSets = 1;
11484 ds_pool_ci.poolSizeCount = 1;
11485 ds_pool_ci.pPoolSizes = &ds_type;
11486 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
11487
11488 VkDescriptorPool ds_pool;
11489 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11490 ASSERT_VK_SUCCESS(err);
11491
11492 VkDescriptorSetLayoutBinding dsl_binding = {};
11493 dsl_binding.binding = 0;
11494 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
11495 dsl_binding.descriptorCount = 1;
11496 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11497 dsl_binding.pImmutableSamplers = NULL;
11498
11499 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11500 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11501 ds_layout_ci.pNext = NULL;
11502 ds_layout_ci.bindingCount = 1;
11503 ds_layout_ci.pBindings = &dsl_binding;
11504
11505 VkDescriptorSetLayout ds_layout;
11506 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11507 ASSERT_VK_SUCCESS(err);
11508
11509 VkDescriptorSetAllocateInfo alloc_info = {};
11510 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11511 alloc_info.descriptorSetCount = 1;
11512 alloc_info.descriptorPool = ds_pool;
11513 alloc_info.pSetLayouts = &ds_layout;
11514 VkDescriptorSet descriptor_set;
11515 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11516 ASSERT_VK_SUCCESS(err);
11517
11518 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11519 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11520 pipeline_layout_ci.pNext = NULL;
11521 pipeline_layout_ci.setLayoutCount = 1;
11522 pipeline_layout_ci.pSetLayouts = &ds_layout;
11523 VkPipelineLayout pipeline_layout;
11524 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
11525 ASSERT_VK_SUCCESS(err);
11526
11527 VkImageObj image(m_device);
11528 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
11529 ASSERT_TRUE(image.initialized());
11530 VkImageView view = image.targetView(tex_format);
11531
11532 VkDescriptorImageInfo image_info = {};
11533 image_info.imageView = view;
11534 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11535
11536 VkWriteDescriptorSet descriptor_write = {};
11537 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11538 descriptor_write.dstSet = descriptor_set;
11539 descriptor_write.dstBinding = 0;
11540 descriptor_write.descriptorCount = 1;
11541 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
11542 descriptor_write.pImageInfo = &image_info;
11543
11544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11545 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
11546 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
11547 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11548 m_errorMonitor->VerifyFound();
11549
11550 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11551 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11552 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
11553 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11554}
11555
Mark Mueller93b938f2016-08-18 10:27:40 -060011556TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011557 TEST_DESCRIPTION(
11558 "Use vkCmdExecuteCommands with invalid state "
11559 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060011560
11561 ASSERT_NO_FATAL_FAILURE(InitState());
11562 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11563
Mike Weiblen95dd0f92016-10-19 12:28:27 -060011564 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011565 const char *simultaneous_use_message2 =
11566 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
11567 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060011568
11569 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011570 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060011571 command_buffer_allocate_info.commandPool = m_commandPool;
11572 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
11573 command_buffer_allocate_info.commandBufferCount = 1;
11574
11575 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011576 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060011577 VkCommandBufferBeginInfo command_buffer_begin_info = {};
11578 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011579 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060011580 command_buffer_inheritance_info.renderPass = m_renderPass;
11581 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070011582
Mark Mueller93b938f2016-08-18 10:27:40 -060011583 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011584 command_buffer_begin_info.flags =
11585 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060011586 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
11587
11588 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
11589 vkEndCommandBuffer(secondary_command_buffer);
11590
Mark Mueller93b938f2016-08-18 10:27:40 -060011591 VkSubmitInfo submit_info = {};
11592 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11593 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011594 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060011595
Mark Mueller4042b652016-09-05 22:52:21 -060011596 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011597 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
11598 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
11599 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070011600 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060011601 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060011602 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11603 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060011604
Dave Houltonfbf52152017-01-06 12:55:29 -070011605 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060011606 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070011607 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060011608
Mark Mueller4042b652016-09-05 22:52:21 -060011609 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060011610 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011611 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060011612
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
11614 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060011615 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060011616 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11617 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070011618
11619 vkQueueWaitIdle(m_device->m_queue);
Mark Mueller93b938f2016-08-18 10:27:40 -060011620}
11621
Tony Barbour626994c2017-02-08 15:29:37 -070011622TEST_F(VkLayerTest, SimultaneousUseOneShot) {
11623 TEST_DESCRIPTION(
11624 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
11625 "errors");
11626 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
11627 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
11628 ASSERT_NO_FATAL_FAILURE(InitState());
11629
11630 VkCommandBuffer cmd_bufs[2];
11631 VkCommandBufferAllocateInfo alloc_info;
11632 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
11633 alloc_info.pNext = NULL;
11634 alloc_info.commandBufferCount = 2;
11635 alloc_info.commandPool = m_commandPool;
11636 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
11637 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
11638
11639 VkCommandBufferBeginInfo cb_binfo;
11640 cb_binfo.pNext = NULL;
11641 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11642 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
11643 cb_binfo.flags = 0;
11644 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
11645 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11646 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
11647 vkEndCommandBuffer(cmd_bufs[0]);
11648 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
11649
11650 VkSubmitInfo submit_info = {};
11651 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11652 submit_info.commandBufferCount = 2;
11653 submit_info.pCommandBuffers = duplicates;
11654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
11655 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11656 m_errorMonitor->VerifyFound();
11657 vkQueueWaitIdle(m_device->m_queue);
11658
11659 // Set one time use and now look for one time submit
11660 duplicates[0] = duplicates[1] = cmd_bufs[1];
11661 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
11662 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
11663 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
11664 vkEndCommandBuffer(cmd_bufs[1]);
11665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
11666 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11667 m_errorMonitor->VerifyFound();
11668 vkQueueWaitIdle(m_device->m_queue);
11669}
11670
Tobin Ehlisb093da82017-01-19 12:05:27 -070011671TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011672 TEST_DESCRIPTION(
11673 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
11674 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070011675
11676 ASSERT_NO_FATAL_FAILURE(InitState());
11677 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11678
11679 std::vector<const char *> device_extension_names;
11680 auto features = m_device->phy().features();
11681 // Make sure gs & ts are disabled
11682 features.geometryShader = false;
11683 features.tessellationShader = false;
11684 // The sacrificial device object
11685 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
11686
11687 VkCommandPoolCreateInfo pool_create_info{};
11688 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
11689 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
11690
11691 VkCommandPool command_pool;
11692 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
11693
11694 VkCommandBufferAllocateInfo cmd = {};
11695 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
11696 cmd.pNext = NULL;
11697 cmd.commandPool = command_pool;
11698 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
11699 cmd.commandBufferCount = 1;
11700
11701 VkCommandBuffer cmd_buffer;
11702 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
11703 ASSERT_VK_SUCCESS(err);
11704
11705 VkEvent event;
11706 VkEventCreateInfo evci = {};
11707 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11708 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
11709 ASSERT_VK_SUCCESS(result);
11710
11711 VkCommandBufferBeginInfo cbbi = {};
11712 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11713 vkBeginCommandBuffer(cmd_buffer, &cbbi);
11714 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
11715 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
11716 m_errorMonitor->VerifyFound();
11717
11718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
11719 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
11720 m_errorMonitor->VerifyFound();
11721
11722 vkDestroyEvent(test_device.handle(), event, NULL);
11723 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
11724}
11725
Mark Mueller917f6bc2016-08-30 10:57:19 -060011726TEST_F(VkLayerTest, InUseDestroyedSignaled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011727 TEST_DESCRIPTION(
11728 "Use vkCmdExecuteCommands with invalid state "
11729 "in primary and secondary command buffers. "
11730 "Delete objects that are inuse. Call VkQueueSubmit "
11731 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060011732
11733 ASSERT_NO_FATAL_FAILURE(InitState());
11734 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11735
Tony Barbour552f6c02016-12-21 14:34:07 -070011736 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060011737
11738 VkEvent event;
11739 VkEventCreateInfo event_create_info = {};
11740 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11741 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011742 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011743
Tony Barbour552f6c02016-12-21 14:34:07 -070011744 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060011745 vkDestroyEvent(m_device->device(), event, nullptr);
11746
11747 VkSubmitInfo submit_info = {};
11748 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11749 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011750 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Jeremy Hayes1b082d72017-01-27 11:34:28 -070011751 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted event 0x");
11752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "You are submitting command buffer 0x");
Mark Muellerc8d441e2016-08-23 17:36:00 -060011753 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11754 m_errorMonitor->VerifyFound();
11755
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011756 m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
Mark Muellerc8d441e2016-08-23 17:36:00 -060011757 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
11758
11759 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11760
Mark Mueller917f6bc2016-08-30 10:57:19 -060011761 VkSemaphoreCreateInfo semaphore_create_info = {};
11762 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
11763 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011764 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011765 VkFenceCreateInfo fence_create_info = {};
11766 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
11767 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011768 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011769
11770 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060011771 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011772 descriptor_pool_type_count.descriptorCount = 1;
11773
11774 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
11775 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11776 descriptor_pool_create_info.maxSets = 1;
11777 descriptor_pool_create_info.poolSizeCount = 1;
11778 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011779 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011780
11781 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011782 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011783
11784 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060011785 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011786 descriptorset_layout_binding.descriptorCount = 1;
11787 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
11788
11789 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011790 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011791 descriptorset_layout_create_info.bindingCount = 1;
11792 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
11793
11794 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011795 ASSERT_VK_SUCCESS(
11796 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011797
11798 VkDescriptorSet descriptorset;
11799 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011800 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011801 descriptorset_allocate_info.descriptorSetCount = 1;
11802 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
11803 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011804 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011805
Mark Mueller4042b652016-09-05 22:52:21 -060011806 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
11807
11808 VkDescriptorBufferInfo buffer_info = {};
11809 buffer_info.buffer = buffer_test.GetBuffer();
11810 buffer_info.offset = 0;
11811 buffer_info.range = 1024;
11812
11813 VkWriteDescriptorSet write_descriptor_set = {};
11814 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11815 write_descriptor_set.dstSet = descriptorset;
11816 write_descriptor_set.descriptorCount = 1;
11817 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11818 write_descriptor_set.pBufferInfo = &buffer_info;
11819
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011820 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060011821
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011822 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11823 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011824
11825 VkPipelineObj pipe(m_device);
11826 pipe.AddColorAttachment();
11827 pipe.AddShader(&vs);
11828 pipe.AddShader(&fs);
11829
11830 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011831 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011832 pipeline_layout_create_info.setLayoutCount = 1;
11833 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
11834
11835 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011836 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011837
11838 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
11839
Tony Barbour552f6c02016-12-21 14:34:07 -070011840 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011841 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060011842
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011843 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11844 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11845 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011846
Tony Barbour552f6c02016-12-21 14:34:07 -070011847 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060011848
Mark Mueller917f6bc2016-08-30 10:57:19 -060011849 submit_info.signalSemaphoreCount = 1;
11850 submit_info.pSignalSemaphores = &semaphore;
11851 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011852 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060011853
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011855 vkDestroyEvent(m_device->device(), event, nullptr);
11856 m_errorMonitor->VerifyFound();
11857
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011858 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011859 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11860 m_errorMonitor->VerifyFound();
11861
Jeremy Hayes08369882017-02-02 10:31:06 -070011862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060011863 vkDestroyFence(m_device->device(), fence, nullptr);
11864 m_errorMonitor->VerifyFound();
11865
Tobin Ehlis122207b2016-09-01 08:50:06 -070011866 vkQueueWaitIdle(m_device->m_queue);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011867 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11868 vkDestroyFence(m_device->device(), fence, nullptr);
11869 vkDestroyEvent(m_device->device(), event, nullptr);
11870 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011871 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011872 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
11873}
11874
Tobin Ehlis2adda372016-09-01 08:51:06 -070011875TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
11876 TEST_DESCRIPTION("Delete in-use query pool.");
11877
11878 ASSERT_NO_FATAL_FAILURE(InitState());
11879 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11880
11881 VkQueryPool query_pool;
11882 VkQueryPoolCreateInfo query_pool_ci{};
11883 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11884 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
11885 query_pool_ci.queryCount = 1;
11886 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070011887 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070011888 // Reset query pool to create binding with cmd buffer
11889 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
11890
Tony Barbour552f6c02016-12-21 14:34:07 -070011891 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070011892
11893 VkSubmitInfo submit_info = {};
11894 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11895 submit_info.commandBufferCount = 1;
11896 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11897 // Submit cmd buffer and then destroy query pool while in-flight
11898 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11899
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070011901 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
11902 m_errorMonitor->VerifyFound();
11903
11904 vkQueueWaitIdle(m_device->m_queue);
11905 // Now that cmd buffer done we can safely destroy query_pool
11906 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
11907}
11908
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011909TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
11910 TEST_DESCRIPTION("Delete in-use pipeline.");
11911
11912 ASSERT_NO_FATAL_FAILURE(InitState());
11913 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11914
11915 // Empty pipeline layout used for binding PSO
11916 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11917 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11918 pipeline_layout_ci.setLayoutCount = 0;
11919 pipeline_layout_ci.pSetLayouts = NULL;
11920
11921 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011922 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011923 ASSERT_VK_SUCCESS(err);
11924
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011926 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011927 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11928 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011929 // Store pipeline handle so we can actually delete it before test finishes
11930 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011931 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011932 VkPipelineObj pipe(m_device);
11933 pipe.AddShader(&vs);
11934 pipe.AddShader(&fs);
11935 pipe.AddColorAttachment();
11936 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11937 delete_this_pipeline = pipe.handle();
11938
Tony Barbour552f6c02016-12-21 14:34:07 -070011939 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011940 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011941 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011942
Tony Barbour552f6c02016-12-21 14:34:07 -070011943 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011944
11945 VkSubmitInfo submit_info = {};
11946 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11947 submit_info.commandBufferCount = 1;
11948 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11949 // Submit cmd buffer and then pipeline destroyed while in-flight
11950 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011951 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011952 m_errorMonitor->VerifyFound();
11953 // Make sure queue finished and then actually delete pipeline
11954 vkQueueWaitIdle(m_device->m_queue);
11955 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
11956 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
11957}
11958
Tobin Ehlis7d965da2016-09-19 16:15:45 -060011959TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
11960 TEST_DESCRIPTION("Delete in-use imageView.");
11961
11962 ASSERT_NO_FATAL_FAILURE(InitState());
11963 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11964
11965 VkDescriptorPoolSize ds_type_count;
11966 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11967 ds_type_count.descriptorCount = 1;
11968
11969 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11970 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11971 ds_pool_ci.maxSets = 1;
11972 ds_pool_ci.poolSizeCount = 1;
11973 ds_pool_ci.pPoolSizes = &ds_type_count;
11974
11975 VkDescriptorPool ds_pool;
11976 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11977 ASSERT_VK_SUCCESS(err);
11978
11979 VkSamplerCreateInfo sampler_ci = {};
11980 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11981 sampler_ci.pNext = NULL;
11982 sampler_ci.magFilter = VK_FILTER_NEAREST;
11983 sampler_ci.minFilter = VK_FILTER_NEAREST;
11984 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11985 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11986 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11987 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11988 sampler_ci.mipLodBias = 1.0;
11989 sampler_ci.anisotropyEnable = VK_FALSE;
11990 sampler_ci.maxAnisotropy = 1;
11991 sampler_ci.compareEnable = VK_FALSE;
11992 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11993 sampler_ci.minLod = 1.0;
11994 sampler_ci.maxLod = 1.0;
11995 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11996 sampler_ci.unnormalizedCoordinates = VK_FALSE;
11997 VkSampler sampler;
11998
11999 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12000 ASSERT_VK_SUCCESS(err);
12001
12002 VkDescriptorSetLayoutBinding layout_binding;
12003 layout_binding.binding = 0;
12004 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12005 layout_binding.descriptorCount = 1;
12006 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12007 layout_binding.pImmutableSamplers = NULL;
12008
12009 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12010 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12011 ds_layout_ci.bindingCount = 1;
12012 ds_layout_ci.pBindings = &layout_binding;
12013 VkDescriptorSetLayout ds_layout;
12014 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12015 ASSERT_VK_SUCCESS(err);
12016
12017 VkDescriptorSetAllocateInfo alloc_info = {};
12018 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12019 alloc_info.descriptorSetCount = 1;
12020 alloc_info.descriptorPool = ds_pool;
12021 alloc_info.pSetLayouts = &ds_layout;
12022 VkDescriptorSet descriptor_set;
12023 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12024 ASSERT_VK_SUCCESS(err);
12025
12026 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12027 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12028 pipeline_layout_ci.pNext = NULL;
12029 pipeline_layout_ci.setLayoutCount = 1;
12030 pipeline_layout_ci.pSetLayouts = &ds_layout;
12031
12032 VkPipelineLayout pipeline_layout;
12033 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12034 ASSERT_VK_SUCCESS(err);
12035
12036 VkImageObj image(m_device);
12037 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12038 ASSERT_TRUE(image.initialized());
12039
12040 VkImageView view;
12041 VkImageViewCreateInfo ivci = {};
12042 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12043 ivci.image = image.handle();
12044 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12045 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12046 ivci.subresourceRange.layerCount = 1;
12047 ivci.subresourceRange.baseMipLevel = 0;
12048 ivci.subresourceRange.levelCount = 1;
12049 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12050
12051 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12052 ASSERT_VK_SUCCESS(err);
12053
12054 VkDescriptorImageInfo image_info{};
12055 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12056 image_info.imageView = view;
12057 image_info.sampler = sampler;
12058
12059 VkWriteDescriptorSet descriptor_write = {};
12060 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12061 descriptor_write.dstSet = descriptor_set;
12062 descriptor_write.dstBinding = 0;
12063 descriptor_write.descriptorCount = 1;
12064 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12065 descriptor_write.pImageInfo = &image_info;
12066
12067 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12068
12069 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012070 char const *vsSource =
12071 "#version 450\n"
12072 "\n"
12073 "out gl_PerVertex { \n"
12074 " vec4 gl_Position;\n"
12075 "};\n"
12076 "void main(){\n"
12077 " gl_Position = vec4(1);\n"
12078 "}\n";
12079 char const *fsSource =
12080 "#version 450\n"
12081 "\n"
12082 "layout(set=0, binding=0) uniform sampler2D s;\n"
12083 "layout(location=0) out vec4 x;\n"
12084 "void main(){\n"
12085 " x = texture(s, vec2(1));\n"
12086 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012087 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12088 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12089 VkPipelineObj pipe(m_device);
12090 pipe.AddShader(&vs);
12091 pipe.AddShader(&fs);
12092 pipe.AddColorAttachment();
12093 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12094
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012096
Tony Barbour552f6c02016-12-21 14:34:07 -070012097 m_commandBuffer->BeginCommandBuffer();
12098 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012099 // Bind pipeline to cmd buffer
12100 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12101 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12102 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012103
12104 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12105 VkRect2D scissor = {{0, 0}, {16, 16}};
12106 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12107 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12108
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012109 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012110 m_commandBuffer->EndRenderPass();
12111 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012112 // Submit cmd buffer then destroy sampler
12113 VkSubmitInfo submit_info = {};
12114 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12115 submit_info.commandBufferCount = 1;
12116 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12117 // Submit cmd buffer and then destroy imageView while in-flight
12118 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12119
12120 vkDestroyImageView(m_device->device(), view, nullptr);
12121 m_errorMonitor->VerifyFound();
12122 vkQueueWaitIdle(m_device->m_queue);
12123 // Now we can actually destroy imageView
12124 vkDestroyImageView(m_device->device(), view, NULL);
12125 vkDestroySampler(m_device->device(), sampler, nullptr);
12126 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12127 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12128 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12129}
12130
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012131TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12132 TEST_DESCRIPTION("Delete in-use bufferView.");
12133
12134 ASSERT_NO_FATAL_FAILURE(InitState());
12135 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12136
12137 VkDescriptorPoolSize ds_type_count;
12138 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12139 ds_type_count.descriptorCount = 1;
12140
12141 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12142 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12143 ds_pool_ci.maxSets = 1;
12144 ds_pool_ci.poolSizeCount = 1;
12145 ds_pool_ci.pPoolSizes = &ds_type_count;
12146
12147 VkDescriptorPool ds_pool;
12148 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12149 ASSERT_VK_SUCCESS(err);
12150
12151 VkDescriptorSetLayoutBinding layout_binding;
12152 layout_binding.binding = 0;
12153 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12154 layout_binding.descriptorCount = 1;
12155 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12156 layout_binding.pImmutableSamplers = NULL;
12157
12158 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12159 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12160 ds_layout_ci.bindingCount = 1;
12161 ds_layout_ci.pBindings = &layout_binding;
12162 VkDescriptorSetLayout ds_layout;
12163 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12164 ASSERT_VK_SUCCESS(err);
12165
12166 VkDescriptorSetAllocateInfo alloc_info = {};
12167 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12168 alloc_info.descriptorSetCount = 1;
12169 alloc_info.descriptorPool = ds_pool;
12170 alloc_info.pSetLayouts = &ds_layout;
12171 VkDescriptorSet descriptor_set;
12172 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12173 ASSERT_VK_SUCCESS(err);
12174
12175 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12176 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12177 pipeline_layout_ci.pNext = NULL;
12178 pipeline_layout_ci.setLayoutCount = 1;
12179 pipeline_layout_ci.pSetLayouts = &ds_layout;
12180
12181 VkPipelineLayout pipeline_layout;
12182 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12183 ASSERT_VK_SUCCESS(err);
12184
12185 VkBuffer buffer;
12186 uint32_t queue_family_index = 0;
12187 VkBufferCreateInfo buffer_create_info = {};
12188 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12189 buffer_create_info.size = 1024;
12190 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
12191 buffer_create_info.queueFamilyIndexCount = 1;
12192 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
12193
12194 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
12195 ASSERT_VK_SUCCESS(err);
12196
12197 VkMemoryRequirements memory_reqs;
12198 VkDeviceMemory buffer_memory;
12199
12200 VkMemoryAllocateInfo memory_info = {};
12201 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12202 memory_info.allocationSize = 0;
12203 memory_info.memoryTypeIndex = 0;
12204
12205 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
12206 memory_info.allocationSize = memory_reqs.size;
12207 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
12208 ASSERT_TRUE(pass);
12209
12210 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
12211 ASSERT_VK_SUCCESS(err);
12212 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
12213 ASSERT_VK_SUCCESS(err);
12214
12215 VkBufferView view;
12216 VkBufferViewCreateInfo bvci = {};
12217 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
12218 bvci.buffer = buffer;
12219 bvci.format = VK_FORMAT_R8_UNORM;
12220 bvci.range = VK_WHOLE_SIZE;
12221
12222 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
12223 ASSERT_VK_SUCCESS(err);
12224
12225 VkWriteDescriptorSet descriptor_write = {};
12226 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12227 descriptor_write.dstSet = descriptor_set;
12228 descriptor_write.dstBinding = 0;
12229 descriptor_write.descriptorCount = 1;
12230 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12231 descriptor_write.pTexelBufferView = &view;
12232
12233 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12234
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012235 char const *vsSource =
12236 "#version 450\n"
12237 "\n"
12238 "out gl_PerVertex { \n"
12239 " vec4 gl_Position;\n"
12240 "};\n"
12241 "void main(){\n"
12242 " gl_Position = vec4(1);\n"
12243 "}\n";
12244 char const *fsSource =
12245 "#version 450\n"
12246 "\n"
12247 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
12248 "layout(location=0) out vec4 x;\n"
12249 "void main(){\n"
12250 " x = imageLoad(s, 0);\n"
12251 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012252 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12253 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12254 VkPipelineObj pipe(m_device);
12255 pipe.AddShader(&vs);
12256 pipe.AddShader(&fs);
12257 pipe.AddColorAttachment();
12258 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12259
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012260 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012261
Tony Barbour552f6c02016-12-21 14:34:07 -070012262 m_commandBuffer->BeginCommandBuffer();
12263 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012264 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12265 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12266 VkRect2D scissor = {{0, 0}, {16, 16}};
12267 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12268 // Bind pipeline to cmd buffer
12269 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12270 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12271 &descriptor_set, 0, nullptr);
12272 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012273 m_commandBuffer->EndRenderPass();
12274 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012275
12276 VkSubmitInfo submit_info = {};
12277 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12278 submit_info.commandBufferCount = 1;
12279 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12280 // Submit cmd buffer and then destroy bufferView while in-flight
12281 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12282
12283 vkDestroyBufferView(m_device->device(), view, nullptr);
12284 m_errorMonitor->VerifyFound();
12285 vkQueueWaitIdle(m_device->m_queue);
12286 // Now we can actually destroy bufferView
12287 vkDestroyBufferView(m_device->device(), view, NULL);
12288 vkDestroyBuffer(m_device->device(), buffer, NULL);
12289 vkFreeMemory(m_device->device(), buffer_memory, NULL);
12290 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12291 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12292 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12293}
12294
Tobin Ehlis209532e2016-09-07 13:52:18 -060012295TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
12296 TEST_DESCRIPTION("Delete in-use sampler.");
12297
12298 ASSERT_NO_FATAL_FAILURE(InitState());
12299 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12300
12301 VkDescriptorPoolSize ds_type_count;
12302 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12303 ds_type_count.descriptorCount = 1;
12304
12305 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12306 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12307 ds_pool_ci.maxSets = 1;
12308 ds_pool_ci.poolSizeCount = 1;
12309 ds_pool_ci.pPoolSizes = &ds_type_count;
12310
12311 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012312 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012313 ASSERT_VK_SUCCESS(err);
12314
12315 VkSamplerCreateInfo sampler_ci = {};
12316 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12317 sampler_ci.pNext = NULL;
12318 sampler_ci.magFilter = VK_FILTER_NEAREST;
12319 sampler_ci.minFilter = VK_FILTER_NEAREST;
12320 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12321 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12322 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12323 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12324 sampler_ci.mipLodBias = 1.0;
12325 sampler_ci.anisotropyEnable = VK_FALSE;
12326 sampler_ci.maxAnisotropy = 1;
12327 sampler_ci.compareEnable = VK_FALSE;
12328 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12329 sampler_ci.minLod = 1.0;
12330 sampler_ci.maxLod = 1.0;
12331 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12332 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12333 VkSampler sampler;
12334
12335 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12336 ASSERT_VK_SUCCESS(err);
12337
12338 VkDescriptorSetLayoutBinding layout_binding;
12339 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060012340 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060012341 layout_binding.descriptorCount = 1;
12342 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12343 layout_binding.pImmutableSamplers = NULL;
12344
12345 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12346 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12347 ds_layout_ci.bindingCount = 1;
12348 ds_layout_ci.pBindings = &layout_binding;
12349 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012350 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012351 ASSERT_VK_SUCCESS(err);
12352
12353 VkDescriptorSetAllocateInfo alloc_info = {};
12354 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12355 alloc_info.descriptorSetCount = 1;
12356 alloc_info.descriptorPool = ds_pool;
12357 alloc_info.pSetLayouts = &ds_layout;
12358 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012359 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012360 ASSERT_VK_SUCCESS(err);
12361
12362 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12363 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12364 pipeline_layout_ci.pNext = NULL;
12365 pipeline_layout_ci.setLayoutCount = 1;
12366 pipeline_layout_ci.pSetLayouts = &ds_layout;
12367
12368 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012369 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012370 ASSERT_VK_SUCCESS(err);
12371
12372 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012373 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 -060012374 ASSERT_TRUE(image.initialized());
12375
12376 VkImageView view;
12377 VkImageViewCreateInfo ivci = {};
12378 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12379 ivci.image = image.handle();
12380 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12381 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12382 ivci.subresourceRange.layerCount = 1;
12383 ivci.subresourceRange.baseMipLevel = 0;
12384 ivci.subresourceRange.levelCount = 1;
12385 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12386
12387 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12388 ASSERT_VK_SUCCESS(err);
12389
12390 VkDescriptorImageInfo image_info{};
12391 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12392 image_info.imageView = view;
12393 image_info.sampler = sampler;
12394
12395 VkWriteDescriptorSet descriptor_write = {};
12396 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12397 descriptor_write.dstSet = descriptor_set;
12398 descriptor_write.dstBinding = 0;
12399 descriptor_write.descriptorCount = 1;
12400 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12401 descriptor_write.pImageInfo = &image_info;
12402
12403 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12404
12405 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012406 char const *vsSource =
12407 "#version 450\n"
12408 "\n"
12409 "out gl_PerVertex { \n"
12410 " vec4 gl_Position;\n"
12411 "};\n"
12412 "void main(){\n"
12413 " gl_Position = vec4(1);\n"
12414 "}\n";
12415 char const *fsSource =
12416 "#version 450\n"
12417 "\n"
12418 "layout(set=0, binding=0) uniform sampler2D s;\n"
12419 "layout(location=0) out vec4 x;\n"
12420 "void main(){\n"
12421 " x = texture(s, vec2(1));\n"
12422 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060012423 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12424 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12425 VkPipelineObj pipe(m_device);
12426 pipe.AddShader(&vs);
12427 pipe.AddShader(&fs);
12428 pipe.AddColorAttachment();
12429 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12430
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012431 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012432
Tony Barbour552f6c02016-12-21 14:34:07 -070012433 m_commandBuffer->BeginCommandBuffer();
12434 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012435 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012436 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12437 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12438 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070012439
12440 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12441 VkRect2D scissor = {{0, 0}, {16, 16}};
12442 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12443 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12444
Tobin Ehlis209532e2016-09-07 13:52:18 -060012445 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012446 m_commandBuffer->EndRenderPass();
12447 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060012448 // Submit cmd buffer then destroy sampler
12449 VkSubmitInfo submit_info = {};
12450 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12451 submit_info.commandBufferCount = 1;
12452 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12453 // Submit cmd buffer and then destroy sampler while in-flight
12454 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12455
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012456 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060012457 m_errorMonitor->VerifyFound();
12458 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070012459
Tobin Ehlis209532e2016-09-07 13:52:18 -060012460 // Now we can actually destroy sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012461 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060012462 vkDestroyImageView(m_device->device(), view, NULL);
12463 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12464 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12465 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12466}
12467
Mark Mueller1cd9f412016-08-25 13:23:52 -060012468TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012469 TEST_DESCRIPTION(
12470 "Call VkQueueSubmit with a semaphore that is already "
12471 "signaled but not waited on by the queue. Wait on a "
12472 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060012473
12474 ASSERT_NO_FATAL_FAILURE(InitState());
12475 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12476
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012477 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 -070012478 const char *invalid_fence_wait_message =
12479 " which has not been submitted on a Queue or during "
12480 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060012481
Tony Barbour552f6c02016-12-21 14:34:07 -070012482 m_commandBuffer->BeginCommandBuffer();
12483 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060012484
12485 VkSemaphoreCreateInfo semaphore_create_info = {};
12486 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12487 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012488 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060012489 VkSubmitInfo submit_info = {};
12490 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12491 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012492 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060012493 submit_info.signalSemaphoreCount = 1;
12494 submit_info.pSignalSemaphores = &semaphore;
12495 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012496 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060012497 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070012498 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070012499 m_commandBuffer->BeginCommandBuffer();
12500 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060012502 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12503 m_errorMonitor->VerifyFound();
12504
Mark Mueller1cd9f412016-08-25 13:23:52 -060012505 VkFenceCreateInfo fence_create_info = {};
12506 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12507 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012508 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060012509
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060012511 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
12512 m_errorMonitor->VerifyFound();
12513
Mark Mueller4042b652016-09-05 22:52:21 -060012514 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060012515 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060012516 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12517}
12518
Tobin Ehlis4af23302016-07-19 10:50:30 -060012519TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012520 TEST_DESCRIPTION(
12521 "Bind a secondary command buffer with with a framebuffer "
12522 "that does not match the framebuffer for the active "
12523 "renderpass.");
Tobin Ehlis4af23302016-07-19 10:50:30 -060012524 ASSERT_NO_FATAL_FAILURE(InitState());
12525 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12526
12527 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012528 VkAttachmentDescription attachment = {0,
12529 VK_FORMAT_B8G8R8A8_UNORM,
12530 VK_SAMPLE_COUNT_1_BIT,
12531 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12532 VK_ATTACHMENT_STORE_OP_STORE,
12533 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12534 VK_ATTACHMENT_STORE_OP_DONT_CARE,
12535 VK_IMAGE_LAYOUT_UNDEFINED,
12536 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012537
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012538 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012539
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012540 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012541
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012542 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012543
12544 VkRenderPass rp;
12545 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
12546 ASSERT_VK_SUCCESS(err);
12547
12548 // A compatible framebuffer.
12549 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012550 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 -060012551 ASSERT_TRUE(image.initialized());
12552
12553 VkImageViewCreateInfo ivci = {
12554 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
12555 nullptr,
12556 0,
12557 image.handle(),
12558 VK_IMAGE_VIEW_TYPE_2D,
12559 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012560 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
12561 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060012562 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
12563 };
12564 VkImageView view;
12565 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
12566 ASSERT_VK_SUCCESS(err);
12567
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012568 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012569 VkFramebuffer fb;
12570 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
12571 ASSERT_VK_SUCCESS(err);
12572
12573 VkCommandBufferAllocateInfo cbai = {};
12574 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12575 cbai.commandPool = m_commandPool;
12576 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12577 cbai.commandBufferCount = 1;
12578
12579 VkCommandBuffer sec_cb;
12580 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
12581 ASSERT_VK_SUCCESS(err);
12582 VkCommandBufferBeginInfo cbbi = {};
12583 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130012584 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060012585 cbii.renderPass = renderPass();
12586 cbii.framebuffer = fb;
12587 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12588 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012589 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 -060012590 cbbi.pInheritanceInfo = &cbii;
12591 vkBeginCommandBuffer(sec_cb, &cbbi);
12592 vkEndCommandBuffer(sec_cb);
12593
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012594 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120012595 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
12596 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060012597
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012598 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060012599 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060012600 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
12601 m_errorMonitor->VerifyFound();
12602 // Cleanup
12603 vkDestroyImageView(m_device->device(), view, NULL);
12604 vkDestroyRenderPass(m_device->device(), rp, NULL);
12605 vkDestroyFramebuffer(m_device->device(), fb, NULL);
12606}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012607
12608TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012609 TEST_DESCRIPTION(
12610 "If logicOp is available on the device, set it to an "
12611 "invalid value. If logicOp is not available, attempt to "
12612 "use it and verify that we see the correct error.");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012613 ASSERT_NO_FATAL_FAILURE(InitState());
12614 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12615
12616 auto features = m_device->phy().features();
12617 // Set the expected error depending on whether or not logicOp available
12618 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12620 "If logic operations feature not "
12621 "enabled, logicOpEnable must be "
12622 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012623 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130012624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012625 }
12626 // Create a pipeline using logicOp
12627 VkResult err;
12628
12629 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12630 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12631
12632 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012633 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012634 ASSERT_VK_SUCCESS(err);
12635
12636 VkPipelineViewportStateCreateInfo vp_state_ci = {};
12637 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
12638 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012639 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012640 vp_state_ci.pViewports = &vp;
12641 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012642 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012643 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012644
12645 VkPipelineShaderStageCreateInfo shaderStages[2];
12646 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
12647
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012648 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12649 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012650 shaderStages[0] = vs.GetStageCreateInfo();
12651 shaderStages[1] = fs.GetStageCreateInfo();
12652
12653 VkPipelineVertexInputStateCreateInfo vi_ci = {};
12654 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
12655
12656 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
12657 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
12658 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
12659
12660 VkPipelineRasterizationStateCreateInfo rs_ci = {};
12661 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130012662 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012663
12664 VkPipelineColorBlendAttachmentState att = {};
12665 att.blendEnable = VK_FALSE;
12666 att.colorWriteMask = 0xf;
12667
12668 VkPipelineColorBlendStateCreateInfo cb_ci = {};
12669 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
12670 // Enable logicOp & set logicOp to value 1 beyond allowed entries
12671 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012672 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012673 cb_ci.attachmentCount = 1;
12674 cb_ci.pAttachments = &att;
12675
Chris Forbes8aeacbf2016-10-03 14:25:08 +130012676 VkPipelineMultisampleStateCreateInfo ms_ci = {};
12677 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12678 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12679
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012680 VkGraphicsPipelineCreateInfo gp_ci = {};
12681 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
12682 gp_ci.stageCount = 2;
12683 gp_ci.pStages = shaderStages;
12684 gp_ci.pVertexInputState = &vi_ci;
12685 gp_ci.pInputAssemblyState = &ia_ci;
12686 gp_ci.pViewportState = &vp_state_ci;
12687 gp_ci.pRasterizationState = &rs_ci;
12688 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130012689 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012690 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
12691 gp_ci.layout = pipeline_layout;
12692 gp_ci.renderPass = renderPass();
12693
12694 VkPipelineCacheCreateInfo pc_ci = {};
12695 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
12696
12697 VkPipeline pipeline;
12698 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012699 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012700 ASSERT_VK_SUCCESS(err);
12701
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012702 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012703 m_errorMonitor->VerifyFound();
12704 if (VK_SUCCESS == err) {
12705 vkDestroyPipeline(m_device->device(), pipeline, NULL);
12706 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012707 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
12708 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12709}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012710
Mike Stroyanaccf7692015-05-12 16:00:45 -060012711#if GTEST_IS_THREADSAFE
12712struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012713 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012714 VkEvent event;
12715 bool bailout;
12716};
12717
Karl Schultz6addd812016-02-02 17:17:23 -070012718extern "C" void *AddToCommandBuffer(void *arg) {
12719 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012720
Mike Stroyana6d14942016-07-13 15:10:05 -060012721 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012722 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012723 if (data->bailout) {
12724 break;
12725 }
12726 }
12727 return NULL;
12728}
12729
Karl Schultz6addd812016-02-02 17:17:23 -070012730TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012731 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012732
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012733 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012734
Mike Stroyanaccf7692015-05-12 16:00:45 -060012735 ASSERT_NO_FATAL_FAILURE(InitState());
12736 ASSERT_NO_FATAL_FAILURE(InitViewport());
12737 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12738
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012739 // Calls AllocateCommandBuffers
12740 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012741
12742 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012743 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012744
12745 VkEventCreateInfo event_info;
12746 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012747 VkResult err;
12748
12749 memset(&event_info, 0, sizeof(event_info));
12750 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12751
Chia-I Wuf7458c52015-10-26 21:10:41 +080012752 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012753 ASSERT_VK_SUCCESS(err);
12754
Mike Stroyanaccf7692015-05-12 16:00:45 -060012755 err = vkResetEvent(device(), event);
12756 ASSERT_VK_SUCCESS(err);
12757
12758 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012759 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012760 data.event = event;
12761 data.bailout = false;
12762 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060012763
12764 // First do some correct operations using multiple threads.
12765 // Add many entries to command buffer from another thread.
12766 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
12767 // Make non-conflicting calls from this thread at the same time.
12768 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060012769 uint32_t count;
12770 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060012771 }
12772 test_platform_thread_join(thread, NULL);
12773
12774 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060012775 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012776 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012777 // Add many entries to command buffer from this thread at the same time.
12778 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012779
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012780 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012781 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012782
Mike Stroyan10b8cb72016-01-22 15:22:03 -070012783 m_errorMonitor->SetBailout(NULL);
12784
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012785 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012786
Chia-I Wuf7458c52015-10-26 21:10:41 +080012787 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012788}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012789#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012790
Karl Schultz6addd812016-02-02 17:17:23 -070012791TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012792 TEST_DESCRIPTION(
12793 "Test that an error is produced for a spirv module "
12794 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120012795
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012797
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012798 ASSERT_NO_FATAL_FAILURE(InitState());
12799 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12800
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012801 VkShaderModule module;
12802 VkShaderModuleCreateInfo moduleCreateInfo;
12803 struct icd_spv_header spv;
12804
12805 spv.magic = ICD_SPV_MAGIC;
12806 spv.version = ICD_SPV_VERSION;
12807 spv.gen_magic = 0;
12808
12809 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12810 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012811 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012812 moduleCreateInfo.codeSize = 4;
12813 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012814 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012815
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012816 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012817}
12818
Karl Schultz6addd812016-02-02 17:17:23 -070012819TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012820 TEST_DESCRIPTION(
12821 "Test that an error is produced for a spirv module "
12822 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120012823
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012825
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012826 ASSERT_NO_FATAL_FAILURE(InitState());
12827 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12828
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012829 VkShaderModule module;
12830 VkShaderModuleCreateInfo moduleCreateInfo;
12831 struct icd_spv_header spv;
12832
12833 spv.magic = ~ICD_SPV_MAGIC;
12834 spv.version = ICD_SPV_VERSION;
12835 spv.gen_magic = 0;
12836
12837 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12838 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012839 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012840 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12841 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012842 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012843
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012844 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012845}
12846
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012847#if 0
12848// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070012849TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012851 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012852
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012853 ASSERT_NO_FATAL_FAILURE(InitState());
12854 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12855
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012856 VkShaderModule module;
12857 VkShaderModuleCreateInfo moduleCreateInfo;
12858 struct icd_spv_header spv;
12859
12860 spv.magic = ICD_SPV_MAGIC;
12861 spv.version = ~ICD_SPV_VERSION;
12862 spv.gen_magic = 0;
12863
12864 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12865 moduleCreateInfo.pNext = NULL;
12866
Karl Schultz6addd812016-02-02 17:17:23 -070012867 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012868 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12869 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012870 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012871
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012872 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012873}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012874#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012875
Karl Schultz6addd812016-02-02 17:17:23 -070012876TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012877 TEST_DESCRIPTION(
12878 "Test that a warning is produced for a vertex output that "
12879 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012881
Chris Forbes9f7ff632015-05-25 11:13:08 +120012882 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012883 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012884
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012885 char const *vsSource =
12886 "#version 450\n"
12887 "\n"
12888 "layout(location=0) out float x;\n"
12889 "out gl_PerVertex {\n"
12890 " vec4 gl_Position;\n"
12891 "};\n"
12892 "void main(){\n"
12893 " gl_Position = vec4(1);\n"
12894 " x = 0;\n"
12895 "}\n";
12896 char const *fsSource =
12897 "#version 450\n"
12898 "\n"
12899 "layout(location=0) out vec4 color;\n"
12900 "void main(){\n"
12901 " color = vec4(1);\n"
12902 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120012903
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012904 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12905 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012906
12907 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012908 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012909 pipe.AddShader(&vs);
12910 pipe.AddShader(&fs);
12911
Chris Forbes9f7ff632015-05-25 11:13:08 +120012912 VkDescriptorSetObj descriptorSet(m_device);
12913 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012914 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012915
Tony Barbour5781e8f2015-08-04 16:23:11 -060012916 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012917
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012918 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012919}
Chris Forbes9f7ff632015-05-25 11:13:08 +120012920
Mark Mueller098c9cb2016-09-08 09:01:57 -060012921TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
12922 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
12923
12924 ASSERT_NO_FATAL_FAILURE(InitState());
12925 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12926
12927 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012928 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060012929
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012930 char const *vsSource =
12931 "#version 450\n"
12932 "\n"
12933 "out gl_PerVertex {\n"
12934 " vec4 gl_Position;\n"
12935 "};\n"
12936 "void main(){\n"
12937 " gl_Position = vec4(1);\n"
12938 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060012939
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012940 char const *fsSource =
12941 "#version 450\n"
12942 "\n"
12943 "layout (constant_id = 0) const float r = 0.0f;\n"
12944 "layout(location = 0) out vec4 uFragColor;\n"
12945 "void main(){\n"
12946 " uFragColor = vec4(r,1,0,1);\n"
12947 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060012948
12949 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12950 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12951
12952 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12953 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12954
12955 VkPipelineLayout pipeline_layout;
12956 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12957
12958 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
12959 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
12960 vp_state_create_info.viewportCount = 1;
12961 VkViewport viewport = {};
12962 vp_state_create_info.pViewports = &viewport;
12963 vp_state_create_info.scissorCount = 1;
12964 VkRect2D scissors = {};
12965 vp_state_create_info.pScissors = &scissors;
12966
12967 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
12968
12969 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
12970 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
12971 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
12972 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
12973
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012974 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060012975
12976 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
12977 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
12978
12979 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
12980 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
12981 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
12982
12983 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
12984 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
12985 rasterization_state_create_info.pNext = nullptr;
12986 rasterization_state_create_info.lineWidth = 1.0f;
12987 rasterization_state_create_info.rasterizerDiscardEnable = true;
12988
12989 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
12990 color_blend_attachment_state.blendEnable = VK_FALSE;
12991 color_blend_attachment_state.colorWriteMask = 0xf;
12992
12993 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
12994 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
12995 color_blend_state_create_info.attachmentCount = 1;
12996 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
12997
12998 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
12999 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13000 graphicspipe_create_info.stageCount = 2;
13001 graphicspipe_create_info.pStages = shader_stage_create_info;
13002 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13003 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13004 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13005 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13006 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13007 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13008 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13009 graphicspipe_create_info.layout = pipeline_layout;
13010 graphicspipe_create_info.renderPass = renderPass();
13011
13012 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13013 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13014
13015 VkPipelineCache pipelineCache;
13016 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13017
13018 // This structure maps constant ids to data locations.
13019 const VkSpecializationMapEntry entry =
13020 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013021 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013022
13023 uint32_t data = 1;
13024
13025 // Set up the info describing spec map and data
13026 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013027 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013028 };
13029 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13030
13031 VkPipeline pipeline;
13032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13033 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13034 m_errorMonitor->VerifyFound();
13035
13036 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13037 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13038}
13039
13040TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13041 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13042
13043 ASSERT_NO_FATAL_FAILURE(InitState());
13044 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13045
13046 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13047
13048 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13049 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13050 descriptor_pool_type_count[0].descriptorCount = 1;
13051 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13052 descriptor_pool_type_count[1].descriptorCount = 1;
13053
13054 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13055 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13056 descriptor_pool_create_info.maxSets = 1;
13057 descriptor_pool_create_info.poolSizeCount = 2;
13058 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13059 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13060
13061 VkDescriptorPool descriptorset_pool;
13062 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13063
13064 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13065 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13066 descriptorset_layout_binding.descriptorCount = 1;
13067 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
13068
13069 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13070 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13071 descriptorset_layout_create_info.bindingCount = 1;
13072 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13073
13074 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013075 ASSERT_VK_SUCCESS(
13076 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013077
13078 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13079 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13080 descriptorset_allocate_info.descriptorSetCount = 1;
13081 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13082 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13083 VkDescriptorSet descriptorset;
13084 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13085
13086 // Challenge core_validation with a non uniform buffer type.
13087 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13088
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013089 char const *vsSource =
13090 "#version 450\n"
13091 "\n"
13092 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13093 " mat4 mvp;\n"
13094 "} ubuf;\n"
13095 "out gl_PerVertex {\n"
13096 " vec4 gl_Position;\n"
13097 "};\n"
13098 "void main(){\n"
13099 " gl_Position = ubuf.mvp * vec4(1);\n"
13100 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013101
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013102 char const *fsSource =
13103 "#version 450\n"
13104 "\n"
13105 "layout(location = 0) out vec4 uFragColor;\n"
13106 "void main(){\n"
13107 " uFragColor = vec4(0,1,0,1);\n"
13108 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013109
13110 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13111 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13112
13113 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13114 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13115 pipeline_layout_create_info.setLayoutCount = 1;
13116 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13117
13118 VkPipelineLayout pipeline_layout;
13119 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13120
13121 VkPipelineObj pipe(m_device);
13122 pipe.AddColorAttachment();
13123 pipe.AddShader(&vs);
13124 pipe.AddShader(&fs);
13125
13126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13127 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13128 m_errorMonitor->VerifyFound();
13129
13130 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13131 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13132 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13133}
13134
13135TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13136 TEST_DESCRIPTION(
13137 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13138
13139 ASSERT_NO_FATAL_FAILURE(InitState());
13140 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13141
13142 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13143
13144 VkDescriptorPoolSize descriptor_pool_type_count = {};
13145 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13146 descriptor_pool_type_count.descriptorCount = 1;
13147
13148 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13149 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13150 descriptor_pool_create_info.maxSets = 1;
13151 descriptor_pool_create_info.poolSizeCount = 1;
13152 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13153 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13154
13155 VkDescriptorPool descriptorset_pool;
13156 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13157
13158 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13159 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13160 descriptorset_layout_binding.descriptorCount = 1;
13161 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13162 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13163
13164 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13165 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13166 descriptorset_layout_create_info.bindingCount = 1;
13167 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13168
13169 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013170 ASSERT_VK_SUCCESS(
13171 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013172
13173 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13174 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13175 descriptorset_allocate_info.descriptorSetCount = 1;
13176 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13177 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13178 VkDescriptorSet descriptorset;
13179 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13180
13181 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13182
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013183 char const *vsSource =
13184 "#version 450\n"
13185 "\n"
13186 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13187 " mat4 mvp;\n"
13188 "} ubuf;\n"
13189 "out gl_PerVertex {\n"
13190 " vec4 gl_Position;\n"
13191 "};\n"
13192 "void main(){\n"
13193 " gl_Position = ubuf.mvp * vec4(1);\n"
13194 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013195
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013196 char const *fsSource =
13197 "#version 450\n"
13198 "\n"
13199 "layout(location = 0) out vec4 uFragColor;\n"
13200 "void main(){\n"
13201 " uFragColor = vec4(0,1,0,1);\n"
13202 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013203
13204 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13205 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13206
13207 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13208 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13209 pipeline_layout_create_info.setLayoutCount = 1;
13210 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13211
13212 VkPipelineLayout pipeline_layout;
13213 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13214
13215 VkPipelineObj pipe(m_device);
13216 pipe.AddColorAttachment();
13217 pipe.AddShader(&vs);
13218 pipe.AddShader(&fs);
13219
13220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
13221 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13222 m_errorMonitor->VerifyFound();
13223
13224 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13225 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13226 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13227}
13228
13229TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013230 TEST_DESCRIPTION(
13231 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
13232 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013233
13234 ASSERT_NO_FATAL_FAILURE(InitState());
13235 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13236
13237 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013238 "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 -060013239
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013240 char const *vsSource =
13241 "#version 450\n"
13242 "\n"
13243 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13244 "out gl_PerVertex {\n"
13245 " vec4 gl_Position;\n"
13246 "};\n"
13247 "void main(){\n"
13248 " gl_Position = vec4(consts.x);\n"
13249 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013250
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013251 char const *fsSource =
13252 "#version 450\n"
13253 "\n"
13254 "layout(location = 0) out vec4 uFragColor;\n"
13255 "void main(){\n"
13256 " uFragColor = vec4(0,1,0,1);\n"
13257 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013258
13259 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13260 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13261
13262 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13263 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13264
13265 // Set up a push constant range
13266 VkPushConstantRange push_constant_ranges = {};
13267 // Set to the wrong stage to challenge core_validation
13268 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13269 push_constant_ranges.size = 4;
13270
13271 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
13272 pipeline_layout_create_info.pushConstantRangeCount = 1;
13273
13274 VkPipelineLayout pipeline_layout;
13275 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13276
13277 VkPipelineObj pipe(m_device);
13278 pipe.AddColorAttachment();
13279 pipe.AddShader(&vs);
13280 pipe.AddShader(&fs);
13281
13282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
13283 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13284 m_errorMonitor->VerifyFound();
13285
13286 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13287}
13288
13289TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
13290 TEST_DESCRIPTION(
13291 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
13292
13293 ASSERT_NO_FATAL_FAILURE(InitState());
13294 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13295
13296 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013297 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013298
13299 // Some awkward steps are required to test with custom device features.
13300 std::vector<const char *> device_extension_names;
13301 auto features = m_device->phy().features();
13302 // Disable support for 64 bit floats
13303 features.shaderFloat64 = false;
13304 // The sacrificial device object
13305 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13306
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013307 char const *vsSource =
13308 "#version 450\n"
13309 "\n"
13310 "out gl_PerVertex {\n"
13311 " vec4 gl_Position;\n"
13312 "};\n"
13313 "void main(){\n"
13314 " gl_Position = vec4(1);\n"
13315 "}\n";
13316 char const *fsSource =
13317 "#version 450\n"
13318 "\n"
13319 "layout(location=0) out vec4 color;\n"
13320 "void main(){\n"
13321 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13322 " color = vec4(green);\n"
13323 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013324
13325 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13326 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13327
13328 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013329
13330 VkPipelineObj pipe(&test_device);
13331 pipe.AddColorAttachment();
13332 pipe.AddShader(&vs);
13333 pipe.AddShader(&fs);
13334
13335 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13336 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13337 VkPipelineLayout pipeline_layout;
13338 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13339
13340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
13341 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
13342 m_errorMonitor->VerifyFound();
13343
13344 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
13345}
13346
13347TEST_F(VkLayerTest, CreatePipelineCheckShaderBadCapability) {
13348 TEST_DESCRIPTION("Create a graphics pipeline in which a capability declared by the shader is not supported by Vulkan shaders.");
13349
13350 ASSERT_NO_FATAL_FAILURE(InitState());
13351 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13352
13353 const char *bad_capability_message = "Shader declares capability 53, not supported in Vulkan.";
13354
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013355 char const *vsSource =
13356 "#version 450\n"
13357 "\n"
13358 "out gl_PerVertex {\n"
13359 " vec4 gl_Position;\n"
13360 "};\n"
13361 "layout(xfb_buffer = 1) out;"
13362 "void main(){\n"
13363 " gl_Position = vec4(1);\n"
13364 "}\n";
13365 char const *fsSource =
13366 "#version 450\n"
13367 "\n"
13368 "layout(location=0) out vec4 color;\n"
13369 "void main(){\n"
13370 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13371 " color = vec4(green);\n"
13372 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013373
13374 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13375 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13376
13377 VkPipelineObj pipe(m_device);
13378 pipe.AddColorAttachment();
13379 pipe.AddShader(&vs);
13380 pipe.AddShader(&fs);
13381
13382 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13383 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13384 VkPipelineLayout pipeline_layout;
13385 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13386
13387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_capability_message);
13388 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13389 m_errorMonitor->VerifyFound();
13390
13391 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13392}
13393
Karl Schultz6addd812016-02-02 17:17:23 -070013394TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013395 TEST_DESCRIPTION(
13396 "Test that an error is produced for a fragment shader input "
13397 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120013398
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013400
Chris Forbes59cb88d2015-05-25 11:13:13 +120013401 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013402 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013403
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013404 char const *vsSource =
13405 "#version 450\n"
13406 "\n"
13407 "out gl_PerVertex {\n"
13408 " vec4 gl_Position;\n"
13409 "};\n"
13410 "void main(){\n"
13411 " gl_Position = vec4(1);\n"
13412 "}\n";
13413 char const *fsSource =
13414 "#version 450\n"
13415 "\n"
13416 "layout(location=0) in float x;\n"
13417 "layout(location=0) out vec4 color;\n"
13418 "void main(){\n"
13419 " color = vec4(x);\n"
13420 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120013421
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013422 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13423 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120013424
13425 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013426 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120013427 pipe.AddShader(&vs);
13428 pipe.AddShader(&fs);
13429
Chris Forbes59cb88d2015-05-25 11:13:13 +120013430 VkDescriptorSetObj descriptorSet(m_device);
13431 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013432 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120013433
Tony Barbour5781e8f2015-08-04 16:23:11 -060013434 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013435
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013436 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120013437}
13438
Karl Schultz6addd812016-02-02 17:17:23 -070013439TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013440 TEST_DESCRIPTION(
13441 "Test that an error is produced for a fragment shader input "
13442 "within an interace block, which is not present in the outputs "
13443 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013445
13446 ASSERT_NO_FATAL_FAILURE(InitState());
13447 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13448
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013449 char const *vsSource =
13450 "#version 450\n"
13451 "\n"
13452 "out gl_PerVertex {\n"
13453 " vec4 gl_Position;\n"
13454 "};\n"
13455 "void main(){\n"
13456 " gl_Position = vec4(1);\n"
13457 "}\n";
13458 char const *fsSource =
13459 "#version 450\n"
13460 "\n"
13461 "in block { layout(location=0) float x; } ins;\n"
13462 "layout(location=0) out vec4 color;\n"
13463 "void main(){\n"
13464 " color = vec4(ins.x);\n"
13465 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130013466
13467 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13468 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13469
13470 VkPipelineObj pipe(m_device);
13471 pipe.AddColorAttachment();
13472 pipe.AddShader(&vs);
13473 pipe.AddShader(&fs);
13474
13475 VkDescriptorSetObj descriptorSet(m_device);
13476 descriptorSet.AppendDummy();
13477 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13478
13479 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13480
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013481 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013482}
13483
Karl Schultz6addd812016-02-02 17:17:23 -070013484TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013485 TEST_DESCRIPTION(
13486 "Test that an error is produced for mismatched array sizes "
13487 "across the vertex->fragment shader interface");
13488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13489 "Type mismatch on location 0.0: 'ptr to "
13490 "output arr[2] of float32' vs 'ptr to "
13491 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130013492
13493 ASSERT_NO_FATAL_FAILURE(InitState());
13494 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13495
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013496 char const *vsSource =
13497 "#version 450\n"
13498 "\n"
13499 "layout(location=0) out float x[2];\n"
13500 "out gl_PerVertex {\n"
13501 " vec4 gl_Position;\n"
13502 "};\n"
13503 "void main(){\n"
13504 " x[0] = 0; x[1] = 0;\n"
13505 " gl_Position = vec4(1);\n"
13506 "}\n";
13507 char const *fsSource =
13508 "#version 450\n"
13509 "\n"
13510 "layout(location=0) in float x[1];\n"
13511 "layout(location=0) out vec4 color;\n"
13512 "void main(){\n"
13513 " color = vec4(x[0]);\n"
13514 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130013515
13516 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13517 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13518
13519 VkPipelineObj pipe(m_device);
13520 pipe.AddColorAttachment();
13521 pipe.AddShader(&vs);
13522 pipe.AddShader(&fs);
13523
13524 VkDescriptorSetObj descriptorSet(m_device);
13525 descriptorSet.AppendDummy();
13526 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13527
13528 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13529
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013530 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130013531}
13532
Karl Schultz6addd812016-02-02 17:17:23 -070013533TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013534 TEST_DESCRIPTION(
13535 "Test that an error is produced for mismatched types across "
13536 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013537 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013538
Chris Forbesb56af562015-05-25 11:13:17 +120013539 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013540 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120013541
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013542 char const *vsSource =
13543 "#version 450\n"
13544 "\n"
13545 "layout(location=0) out int x;\n"
13546 "out gl_PerVertex {\n"
13547 " vec4 gl_Position;\n"
13548 "};\n"
13549 "void main(){\n"
13550 " x = 0;\n"
13551 " gl_Position = vec4(1);\n"
13552 "}\n";
13553 char const *fsSource =
13554 "#version 450\n"
13555 "\n"
13556 "layout(location=0) in float x;\n" /* VS writes int */
13557 "layout(location=0) out vec4 color;\n"
13558 "void main(){\n"
13559 " color = vec4(x);\n"
13560 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120013561
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013562 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13563 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120013564
13565 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013566 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120013567 pipe.AddShader(&vs);
13568 pipe.AddShader(&fs);
13569
Chris Forbesb56af562015-05-25 11:13:17 +120013570 VkDescriptorSetObj descriptorSet(m_device);
13571 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013572 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120013573
Tony Barbour5781e8f2015-08-04 16:23:11 -060013574 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120013575
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013576 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120013577}
13578
Karl Schultz6addd812016-02-02 17:17:23 -070013579TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013580 TEST_DESCRIPTION(
13581 "Test that an error is produced for mismatched types across "
13582 "the vertex->fragment shader interface, when the variable is contained within "
13583 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013585
13586 ASSERT_NO_FATAL_FAILURE(InitState());
13587 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13588
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013589 char const *vsSource =
13590 "#version 450\n"
13591 "\n"
13592 "out block { layout(location=0) int x; } outs;\n"
13593 "out gl_PerVertex {\n"
13594 " vec4 gl_Position;\n"
13595 "};\n"
13596 "void main(){\n"
13597 " outs.x = 0;\n"
13598 " gl_Position = vec4(1);\n"
13599 "}\n";
13600 char const *fsSource =
13601 "#version 450\n"
13602 "\n"
13603 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
13604 "layout(location=0) out vec4 color;\n"
13605 "void main(){\n"
13606 " color = vec4(ins.x);\n"
13607 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130013608
13609 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13610 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13611
13612 VkPipelineObj pipe(m_device);
13613 pipe.AddColorAttachment();
13614 pipe.AddShader(&vs);
13615 pipe.AddShader(&fs);
13616
13617 VkDescriptorSetObj descriptorSet(m_device);
13618 descriptorSet.AppendDummy();
13619 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13620
13621 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13622
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013623 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013624}
13625
13626TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013627 TEST_DESCRIPTION(
13628 "Test that an error is produced for location mismatches across "
13629 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
13630 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013631 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 +130013632
13633 ASSERT_NO_FATAL_FAILURE(InitState());
13634 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13635
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013636 char const *vsSource =
13637 "#version 450\n"
13638 "\n"
13639 "out block { layout(location=1) float x; } outs;\n"
13640 "out gl_PerVertex {\n"
13641 " vec4 gl_Position;\n"
13642 "};\n"
13643 "void main(){\n"
13644 " outs.x = 0;\n"
13645 " gl_Position = vec4(1);\n"
13646 "}\n";
13647 char const *fsSource =
13648 "#version 450\n"
13649 "\n"
13650 "in block { layout(location=0) float x; } ins;\n"
13651 "layout(location=0) out vec4 color;\n"
13652 "void main(){\n"
13653 " color = vec4(ins.x);\n"
13654 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130013655
13656 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13657 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13658
13659 VkPipelineObj pipe(m_device);
13660 pipe.AddColorAttachment();
13661 pipe.AddShader(&vs);
13662 pipe.AddShader(&fs);
13663
13664 VkDescriptorSetObj descriptorSet(m_device);
13665 descriptorSet.AppendDummy();
13666 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13667
13668 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13669
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013670 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013671}
13672
13673TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013674 TEST_DESCRIPTION(
13675 "Test that an error is produced for component mismatches across the "
13676 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
13677 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013678 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 +130013679
13680 ASSERT_NO_FATAL_FAILURE(InitState());
13681 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13682
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013683 char const *vsSource =
13684 "#version 450\n"
13685 "\n"
13686 "out block { layout(location=0, component=0) float x; } outs;\n"
13687 "out gl_PerVertex {\n"
13688 " vec4 gl_Position;\n"
13689 "};\n"
13690 "void main(){\n"
13691 " outs.x = 0;\n"
13692 " gl_Position = vec4(1);\n"
13693 "}\n";
13694 char const *fsSource =
13695 "#version 450\n"
13696 "\n"
13697 "in block { layout(location=0, component=1) float x; } ins;\n"
13698 "layout(location=0) out vec4 color;\n"
13699 "void main(){\n"
13700 " color = vec4(ins.x);\n"
13701 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130013702
13703 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13704 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13705
13706 VkPipelineObj pipe(m_device);
13707 pipe.AddColorAttachment();
13708 pipe.AddShader(&vs);
13709 pipe.AddShader(&fs);
13710
13711 VkDescriptorSetObj descriptorSet(m_device);
13712 descriptorSet.AppendDummy();
13713 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13714
13715 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13716
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013717 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013718}
13719
Chris Forbes1f3b0152016-11-30 12:48:40 +130013720TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
13721 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
13722
13723 ASSERT_NO_FATAL_FAILURE(InitState());
13724 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13725
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013726 char const *vsSource =
13727 "#version 450\n"
13728 "layout(location=0) out mediump float x;\n"
13729 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
13730 char const *fsSource =
13731 "#version 450\n"
13732 "layout(location=0) in highp float x;\n"
13733 "layout(location=0) out vec4 color;\n"
13734 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130013735
13736 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13737 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13738
13739 VkPipelineObj pipe(m_device);
13740 pipe.AddColorAttachment();
13741 pipe.AddShader(&vs);
13742 pipe.AddShader(&fs);
13743
13744 VkDescriptorSetObj descriptorSet(m_device);
13745 descriptorSet.AppendDummy();
13746 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13747
13748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
13749
13750 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13751
13752 m_errorMonitor->VerifyFound();
13753}
13754
Chris Forbes870a39e2016-11-30 12:55:56 +130013755TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
13756 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
13757
13758 ASSERT_NO_FATAL_FAILURE(InitState());
13759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13760
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013761 char const *vsSource =
13762 "#version 450\n"
13763 "out block { layout(location=0) mediump float x; };\n"
13764 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
13765 char const *fsSource =
13766 "#version 450\n"
13767 "in block { layout(location=0) highp float x; };\n"
13768 "layout(location=0) out vec4 color;\n"
13769 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130013770
13771 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13772 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13773
13774 VkPipelineObj pipe(m_device);
13775 pipe.AddColorAttachment();
13776 pipe.AddShader(&vs);
13777 pipe.AddShader(&fs);
13778
13779 VkDescriptorSetObj descriptorSet(m_device);
13780 descriptorSet.AppendDummy();
13781 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13782
13783 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
13784
13785 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13786
13787 m_errorMonitor->VerifyFound();
13788}
13789
Karl Schultz6addd812016-02-02 17:17:23 -070013790TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013791 TEST_DESCRIPTION(
13792 "Test that a warning is produced for a vertex attribute which is "
13793 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013795
Chris Forbesde136e02015-05-25 11:13:28 +120013796 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013797 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120013798
13799 VkVertexInputBindingDescription input_binding;
13800 memset(&input_binding, 0, sizeof(input_binding));
13801
13802 VkVertexInputAttributeDescription input_attrib;
13803 memset(&input_attrib, 0, sizeof(input_attrib));
13804 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13805
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013806 char const *vsSource =
13807 "#version 450\n"
13808 "\n"
13809 "out gl_PerVertex {\n"
13810 " vec4 gl_Position;\n"
13811 "};\n"
13812 "void main(){\n"
13813 " gl_Position = vec4(1);\n"
13814 "}\n";
13815 char const *fsSource =
13816 "#version 450\n"
13817 "\n"
13818 "layout(location=0) out vec4 color;\n"
13819 "void main(){\n"
13820 " color = vec4(1);\n"
13821 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120013822
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013823 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13824 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120013825
13826 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013827 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120013828 pipe.AddShader(&vs);
13829 pipe.AddShader(&fs);
13830
13831 pipe.AddVertexInputBindings(&input_binding, 1);
13832 pipe.AddVertexInputAttribs(&input_attrib, 1);
13833
Chris Forbesde136e02015-05-25 11:13:28 +120013834 VkDescriptorSetObj descriptorSet(m_device);
13835 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013836 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120013837
Tony Barbour5781e8f2015-08-04 16:23:11 -060013838 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120013839
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013840 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120013841}
13842
Karl Schultz6addd812016-02-02 17:17:23 -070013843TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013844 TEST_DESCRIPTION(
13845 "Test that a warning is produced for a location mismatch on "
13846 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130013848
13849 ASSERT_NO_FATAL_FAILURE(InitState());
13850 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13851
13852 VkVertexInputBindingDescription input_binding;
13853 memset(&input_binding, 0, sizeof(input_binding));
13854
13855 VkVertexInputAttributeDescription input_attrib;
13856 memset(&input_attrib, 0, sizeof(input_attrib));
13857 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13858
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013859 char const *vsSource =
13860 "#version 450\n"
13861 "\n"
13862 "layout(location=1) in float x;\n"
13863 "out gl_PerVertex {\n"
13864 " vec4 gl_Position;\n"
13865 "};\n"
13866 "void main(){\n"
13867 " gl_Position = vec4(x);\n"
13868 "}\n";
13869 char const *fsSource =
13870 "#version 450\n"
13871 "\n"
13872 "layout(location=0) out vec4 color;\n"
13873 "void main(){\n"
13874 " color = vec4(1);\n"
13875 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130013876
13877 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13878 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13879
13880 VkPipelineObj pipe(m_device);
13881 pipe.AddColorAttachment();
13882 pipe.AddShader(&vs);
13883 pipe.AddShader(&fs);
13884
13885 pipe.AddVertexInputBindings(&input_binding, 1);
13886 pipe.AddVertexInputAttribs(&input_attrib, 1);
13887
13888 VkDescriptorSetObj descriptorSet(m_device);
13889 descriptorSet.AppendDummy();
13890 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13891
13892 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13893
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013894 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130013895}
13896
Karl Schultz6addd812016-02-02 17:17:23 -070013897TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013898 TEST_DESCRIPTION(
13899 "Test that an error is produced for a vertex shader input which is not "
13900 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13902 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013903
Chris Forbes62e8e502015-05-25 11:13:29 +120013904 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013905 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120013906
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013907 char const *vsSource =
13908 "#version 450\n"
13909 "\n"
13910 "layout(location=0) in vec4 x;\n" /* not provided */
13911 "out gl_PerVertex {\n"
13912 " vec4 gl_Position;\n"
13913 "};\n"
13914 "void main(){\n"
13915 " gl_Position = x;\n"
13916 "}\n";
13917 char const *fsSource =
13918 "#version 450\n"
13919 "\n"
13920 "layout(location=0) out vec4 color;\n"
13921 "void main(){\n"
13922 " color = vec4(1);\n"
13923 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120013924
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013925 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13926 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120013927
13928 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013929 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120013930 pipe.AddShader(&vs);
13931 pipe.AddShader(&fs);
13932
Chris Forbes62e8e502015-05-25 11:13:29 +120013933 VkDescriptorSetObj descriptorSet(m_device);
13934 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013935 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120013936
Tony Barbour5781e8f2015-08-04 16:23:11 -060013937 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120013938
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013939 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120013940}
13941
Karl Schultz6addd812016-02-02 17:17:23 -070013942TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013943 TEST_DESCRIPTION(
13944 "Test that an error is produced for a mismatch between the "
13945 "fundamental type (float/int/uint) of an attribute and the "
13946 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060013947 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 -060013948
Chris Forbesc97d98e2015-05-25 11:13:31 +120013949 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013950 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013951
13952 VkVertexInputBindingDescription input_binding;
13953 memset(&input_binding, 0, sizeof(input_binding));
13954
13955 VkVertexInputAttributeDescription input_attrib;
13956 memset(&input_attrib, 0, sizeof(input_attrib));
13957 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13958
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013959 char const *vsSource =
13960 "#version 450\n"
13961 "\n"
13962 "layout(location=0) in int x;\n" /* attrib provided float */
13963 "out gl_PerVertex {\n"
13964 " vec4 gl_Position;\n"
13965 "};\n"
13966 "void main(){\n"
13967 " gl_Position = vec4(x);\n"
13968 "}\n";
13969 char const *fsSource =
13970 "#version 450\n"
13971 "\n"
13972 "layout(location=0) out vec4 color;\n"
13973 "void main(){\n"
13974 " color = vec4(1);\n"
13975 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120013976
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013977 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13978 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013979
13980 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013981 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013982 pipe.AddShader(&vs);
13983 pipe.AddShader(&fs);
13984
13985 pipe.AddVertexInputBindings(&input_binding, 1);
13986 pipe.AddVertexInputAttribs(&input_attrib, 1);
13987
Chris Forbesc97d98e2015-05-25 11:13:31 +120013988 VkDescriptorSetObj descriptorSet(m_device);
13989 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013990 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013991
Tony Barbour5781e8f2015-08-04 16:23:11 -060013992 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013993
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013994 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013995}
13996
Chris Forbesc68b43c2016-04-06 11:18:47 +120013997TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013998 TEST_DESCRIPTION(
13999 "Test that an error is produced for a pipeline containing multiple "
14000 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014001 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14002 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014003
14004 ASSERT_NO_FATAL_FAILURE(InitState());
14005 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14006
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014007 char const *vsSource =
14008 "#version 450\n"
14009 "\n"
14010 "out gl_PerVertex {\n"
14011 " vec4 gl_Position;\n"
14012 "};\n"
14013 "void main(){\n"
14014 " gl_Position = vec4(1);\n"
14015 "}\n";
14016 char const *fsSource =
14017 "#version 450\n"
14018 "\n"
14019 "layout(location=0) out vec4 color;\n"
14020 "void main(){\n"
14021 " color = vec4(1);\n"
14022 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014023
14024 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14025 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14026
14027 VkPipelineObj pipe(m_device);
14028 pipe.AddColorAttachment();
14029 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014030 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014031 pipe.AddShader(&fs);
14032
14033 VkDescriptorSetObj descriptorSet(m_device);
14034 descriptorSet.AppendDummy();
14035 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14036
14037 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14038
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014039 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014040}
14041
Chris Forbes82ff92a2016-09-09 10:50:24 +120014042TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014043 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014044
14045 ASSERT_NO_FATAL_FAILURE(InitState());
14046 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14047
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014048 char const *vsSource =
14049 "#version 450\n"
14050 "out gl_PerVertex {\n"
14051 " vec4 gl_Position;\n"
14052 "};\n"
14053 "void main(){\n"
14054 " gl_Position = vec4(0);\n"
14055 "}\n";
14056 char const *fsSource =
14057 "#version 450\n"
14058 "\n"
14059 "layout(location=0) out vec4 color;\n"
14060 "void main(){\n"
14061 " color = vec4(1);\n"
14062 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014063
14064 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14065 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14066
14067 VkPipelineObj pipe(m_device);
14068 pipe.AddColorAttachment();
14069 pipe.AddShader(&vs);
14070 pipe.AddShader(&fs);
14071
14072 VkDescriptorSetObj descriptorSet(m_device);
14073 descriptorSet.AppendDummy();
14074 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14075
14076 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14077
14078 m_errorMonitor->VerifyFound();
14079}
14080
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014081TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14083 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14084 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014085
14086 ASSERT_NO_FATAL_FAILURE(InitState());
14087 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14088
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014089 char const *vsSource =
14090 "#version 450\n"
14091 "void main(){ gl_Position = vec4(0); }\n";
14092 char const *fsSource =
14093 "#version 450\n"
14094 "\n"
14095 "layout(location=0) out vec4 color;\n"
14096 "void main(){\n"
14097 " color = vec4(1);\n"
14098 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014099
14100 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14101 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14102
14103 VkPipelineObj pipe(m_device);
14104 pipe.AddColorAttachment();
14105 pipe.AddShader(&vs);
14106 pipe.AddShader(&fs);
14107
14108 VkDescriptorSetObj descriptorSet(m_device);
14109 descriptorSet.AppendDummy();
14110 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14111
14112 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014113 {
14114 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14115 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14116 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014117 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014118 {
14119 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14120 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14121 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014122 },
14123 };
14124 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014125 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014126 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014127 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14128 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014129 VkRenderPass rp;
14130 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14131 ASSERT_VK_SUCCESS(err);
14132
14133 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14134
14135 m_errorMonitor->VerifyFound();
14136
14137 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14138}
14139
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014140TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014141 TEST_DESCRIPTION(
14142 "Test that an error is produced for a variable output from "
14143 "the TCS without the patch decoration, but consumed in the TES "
14144 "with the decoration.");
14145 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14146 "is per-vertex in tessellation control shader stage "
14147 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014148
14149 ASSERT_NO_FATAL_FAILURE(InitState());
14150 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14151
Chris Forbesc1e852d2016-04-04 19:26:42 +120014152 if (!m_device->phy().features().tessellationShader) {
14153 printf("Device does not support tessellation shaders; skipped.\n");
14154 return;
14155 }
14156
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014157 char const *vsSource =
14158 "#version 450\n"
14159 "void main(){}\n";
14160 char const *tcsSource =
14161 "#version 450\n"
14162 "layout(location=0) out int x[];\n"
14163 "layout(vertices=3) out;\n"
14164 "void main(){\n"
14165 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14166 " gl_TessLevelInner[0] = 1;\n"
14167 " x[gl_InvocationID] = gl_InvocationID;\n"
14168 "}\n";
14169 char const *tesSource =
14170 "#version 450\n"
14171 "layout(triangles, equal_spacing, cw) in;\n"
14172 "layout(location=0) patch in int x;\n"
14173 "out gl_PerVertex { vec4 gl_Position; };\n"
14174 "void main(){\n"
14175 " gl_Position.xyz = gl_TessCoord;\n"
14176 " gl_Position.w = x;\n"
14177 "}\n";
14178 char const *fsSource =
14179 "#version 450\n"
14180 "layout(location=0) out vec4 color;\n"
14181 "void main(){\n"
14182 " color = vec4(1);\n"
14183 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014184
14185 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14186 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14187 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14188 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14189
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014190 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14191 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014192
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014193 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014194
14195 VkPipelineObj pipe(m_device);
14196 pipe.SetInputAssembly(&iasci);
14197 pipe.SetTessellation(&tsci);
14198 pipe.AddColorAttachment();
14199 pipe.AddShader(&vs);
14200 pipe.AddShader(&tcs);
14201 pipe.AddShader(&tes);
14202 pipe.AddShader(&fs);
14203
14204 VkDescriptorSetObj descriptorSet(m_device);
14205 descriptorSet.AppendDummy();
14206 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14207
14208 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14209
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014210 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014211}
14212
Karl Schultz6addd812016-02-02 17:17:23 -070014213TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014214 TEST_DESCRIPTION(
14215 "Test that an error is produced for a vertex attribute setup where multiple "
14216 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14218 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014219
Chris Forbes280ba2c2015-06-12 11:16:41 +120014220 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014221 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014222
14223 /* Two binding descriptions for binding 0 */
14224 VkVertexInputBindingDescription input_bindings[2];
14225 memset(input_bindings, 0, sizeof(input_bindings));
14226
14227 VkVertexInputAttributeDescription input_attrib;
14228 memset(&input_attrib, 0, sizeof(input_attrib));
14229 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14230
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014231 char const *vsSource =
14232 "#version 450\n"
14233 "\n"
14234 "layout(location=0) in float x;\n" /* attrib provided float */
14235 "out gl_PerVertex {\n"
14236 " vec4 gl_Position;\n"
14237 "};\n"
14238 "void main(){\n"
14239 " gl_Position = vec4(x);\n"
14240 "}\n";
14241 char const *fsSource =
14242 "#version 450\n"
14243 "\n"
14244 "layout(location=0) out vec4 color;\n"
14245 "void main(){\n"
14246 " color = vec4(1);\n"
14247 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120014248
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014249 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14250 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014251
14252 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014253 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014254 pipe.AddShader(&vs);
14255 pipe.AddShader(&fs);
14256
14257 pipe.AddVertexInputBindings(input_bindings, 2);
14258 pipe.AddVertexInputAttribs(&input_attrib, 1);
14259
Chris Forbes280ba2c2015-06-12 11:16:41 +120014260 VkDescriptorSetObj descriptorSet(m_device);
14261 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014262 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014263
Tony Barbour5781e8f2015-08-04 16:23:11 -060014264 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014265
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014266 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014267}
Chris Forbes8f68b562015-05-25 11:13:32 +120014268
Karl Schultz6addd812016-02-02 17:17:23 -070014269TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014270 TEST_DESCRIPTION(
14271 "Test that an error is produced for a fragment shader which does not "
14272 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014273 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014274
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014275 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014276
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014277 char const *vsSource =
14278 "#version 450\n"
14279 "\n"
14280 "out gl_PerVertex {\n"
14281 " vec4 gl_Position;\n"
14282 "};\n"
14283 "void main(){\n"
14284 " gl_Position = vec4(1);\n"
14285 "}\n";
14286 char const *fsSource =
14287 "#version 450\n"
14288 "\n"
14289 "void main(){\n"
14290 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014291
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014292 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14293 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014294
14295 VkPipelineObj pipe(m_device);
14296 pipe.AddShader(&vs);
14297 pipe.AddShader(&fs);
14298
Chia-I Wu08accc62015-07-07 11:50:03 +080014299 /* set up CB 0, not written */
14300 pipe.AddColorAttachment();
14301 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014302
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014303 VkDescriptorSetObj descriptorSet(m_device);
14304 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014305 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014306
Tony Barbour5781e8f2015-08-04 16:23:11 -060014307 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014308
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014309 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014310}
14311
Karl Schultz6addd812016-02-02 17:17:23 -070014312TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014313 TEST_DESCRIPTION(
14314 "Test that a warning is produced for a fragment shader which provides a spurious "
14315 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014317 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014318
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014319 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014320
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014321 char const *vsSource =
14322 "#version 450\n"
14323 "\n"
14324 "out gl_PerVertex {\n"
14325 " vec4 gl_Position;\n"
14326 "};\n"
14327 "void main(){\n"
14328 " gl_Position = vec4(1);\n"
14329 "}\n";
14330 char const *fsSource =
14331 "#version 450\n"
14332 "\n"
14333 "layout(location=0) out vec4 x;\n"
14334 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
14335 "void main(){\n"
14336 " x = vec4(1);\n"
14337 " y = vec4(1);\n"
14338 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014339
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014340 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14341 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014342
14343 VkPipelineObj pipe(m_device);
14344 pipe.AddShader(&vs);
14345 pipe.AddShader(&fs);
14346
Chia-I Wu08accc62015-07-07 11:50:03 +080014347 /* set up CB 0, not written */
14348 pipe.AddColorAttachment();
14349 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014350 /* FS writes CB 1, but we don't configure it */
14351
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014352 VkDescriptorSetObj descriptorSet(m_device);
14353 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014354 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014355
Tony Barbour5781e8f2015-08-04 16:23:11 -060014356 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014357
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014358 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014359}
14360
Karl Schultz6addd812016-02-02 17:17:23 -070014361TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014362 TEST_DESCRIPTION(
14363 "Test that an error is produced for a mismatch between the fundamental "
14364 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014365 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014366
Chris Forbesa36d69e2015-05-25 11:13:44 +120014367 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014368
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014369 char const *vsSource =
14370 "#version 450\n"
14371 "\n"
14372 "out gl_PerVertex {\n"
14373 " vec4 gl_Position;\n"
14374 "};\n"
14375 "void main(){\n"
14376 " gl_Position = vec4(1);\n"
14377 "}\n";
14378 char const *fsSource =
14379 "#version 450\n"
14380 "\n"
14381 "layout(location=0) out ivec4 x;\n" /* not UNORM */
14382 "void main(){\n"
14383 " x = ivec4(1);\n"
14384 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120014385
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014386 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14387 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014388
14389 VkPipelineObj pipe(m_device);
14390 pipe.AddShader(&vs);
14391 pipe.AddShader(&fs);
14392
Chia-I Wu08accc62015-07-07 11:50:03 +080014393 /* set up CB 0; type is UNORM by default */
14394 pipe.AddColorAttachment();
14395 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014396
Chris Forbesa36d69e2015-05-25 11:13:44 +120014397 VkDescriptorSetObj descriptorSet(m_device);
14398 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014399 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014400
Tony Barbour5781e8f2015-08-04 16:23:11 -060014401 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014402
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014403 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014404}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014405
Karl Schultz6addd812016-02-02 17:17:23 -070014406TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014407 TEST_DESCRIPTION(
14408 "Test that an error is produced for a shader consuming a uniform "
14409 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014411
Chris Forbes556c76c2015-08-14 12:04:59 +120014412 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120014413
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014414 char const *vsSource =
14415 "#version 450\n"
14416 "\n"
14417 "out gl_PerVertex {\n"
14418 " vec4 gl_Position;\n"
14419 "};\n"
14420 "void main(){\n"
14421 " gl_Position = vec4(1);\n"
14422 "}\n";
14423 char const *fsSource =
14424 "#version 450\n"
14425 "\n"
14426 "layout(location=0) out vec4 x;\n"
14427 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
14428 "void main(){\n"
14429 " x = vec4(bar.y);\n"
14430 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120014431
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014432 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14433 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120014434
Chris Forbes556c76c2015-08-14 12:04:59 +120014435 VkPipelineObj pipe(m_device);
14436 pipe.AddShader(&vs);
14437 pipe.AddShader(&fs);
14438
14439 /* set up CB 0; type is UNORM by default */
14440 pipe.AddColorAttachment();
14441 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14442
14443 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014444 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120014445
14446 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14447
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014448 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120014449}
14450
Chris Forbes5c59e902016-02-26 16:56:09 +130014451TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014452 TEST_DESCRIPTION(
14453 "Test that an error is produced for a shader consuming push constants "
14454 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130014456
14457 ASSERT_NO_FATAL_FAILURE(InitState());
14458
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014459 char const *vsSource =
14460 "#version 450\n"
14461 "\n"
14462 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14463 "out gl_PerVertex {\n"
14464 " vec4 gl_Position;\n"
14465 "};\n"
14466 "void main(){\n"
14467 " gl_Position = vec4(consts.x);\n"
14468 "}\n";
14469 char const *fsSource =
14470 "#version 450\n"
14471 "\n"
14472 "layout(location=0) out vec4 x;\n"
14473 "void main(){\n"
14474 " x = vec4(1);\n"
14475 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130014476
14477 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14478 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14479
14480 VkPipelineObj pipe(m_device);
14481 pipe.AddShader(&vs);
14482 pipe.AddShader(&fs);
14483
14484 /* set up CB 0; type is UNORM by default */
14485 pipe.AddColorAttachment();
14486 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14487
14488 VkDescriptorSetObj descriptorSet(m_device);
14489 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14490
14491 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14492
14493 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014494 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130014495}
14496
Chris Forbes3fb17902016-08-22 14:57:55 +120014497TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014498 TEST_DESCRIPTION(
14499 "Test that an error is produced for a shader consuming an input attachment "
14500 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120014501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14502 "consumes input attachment index 0 but not provided in subpass");
14503
14504 ASSERT_NO_FATAL_FAILURE(InitState());
14505
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014506 char const *vsSource =
14507 "#version 450\n"
14508 "\n"
14509 "out gl_PerVertex {\n"
14510 " vec4 gl_Position;\n"
14511 "};\n"
14512 "void main(){\n"
14513 " gl_Position = vec4(1);\n"
14514 "}\n";
14515 char const *fsSource =
14516 "#version 450\n"
14517 "\n"
14518 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
14519 "layout(location=0) out vec4 color;\n"
14520 "void main() {\n"
14521 " color = subpassLoad(x);\n"
14522 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120014523
14524 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14525 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14526
14527 VkPipelineObj pipe(m_device);
14528 pipe.AddShader(&vs);
14529 pipe.AddShader(&fs);
14530 pipe.AddColorAttachment();
14531 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14532
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014533 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
14534 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120014535 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014536 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120014537 ASSERT_VK_SUCCESS(err);
14538
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014539 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120014540 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014541 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120014542 ASSERT_VK_SUCCESS(err);
14543
14544 // error here.
14545 pipe.CreateVKPipeline(pl, renderPass());
14546
14547 m_errorMonitor->VerifyFound();
14548
14549 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14550 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14551}
14552
Chris Forbes5a9a0472016-08-22 16:02:09 +120014553TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014554 TEST_DESCRIPTION(
14555 "Test that an error is produced for a shader consuming an input attachment "
14556 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120014557 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14558 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
14559
14560 ASSERT_NO_FATAL_FAILURE(InitState());
14561
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014562 char const *vsSource =
14563 "#version 450\n"
14564 "\n"
14565 "out gl_PerVertex {\n"
14566 " vec4 gl_Position;\n"
14567 "};\n"
14568 "void main(){\n"
14569 " gl_Position = vec4(1);\n"
14570 "}\n";
14571 char const *fsSource =
14572 "#version 450\n"
14573 "\n"
14574 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
14575 "layout(location=0) out vec4 color;\n"
14576 "void main() {\n"
14577 " color = subpassLoad(x);\n"
14578 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120014579
14580 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14581 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14582
14583 VkPipelineObj pipe(m_device);
14584 pipe.AddShader(&vs);
14585 pipe.AddShader(&fs);
14586 pipe.AddColorAttachment();
14587 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14588
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014589 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
14590 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120014591 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014592 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120014593 ASSERT_VK_SUCCESS(err);
14594
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014595 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120014596 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014597 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120014598 ASSERT_VK_SUCCESS(err);
14599
14600 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014601 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
14602 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
14603 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
14604 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
14605 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 +120014606 };
14607 VkAttachmentReference color = {
14608 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
14609 };
14610 VkAttachmentReference input = {
14611 1, VK_IMAGE_LAYOUT_GENERAL,
14612 };
14613
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014614 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120014615
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014616 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120014617 VkRenderPass rp;
14618 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14619 ASSERT_VK_SUCCESS(err);
14620
14621 // error here.
14622 pipe.CreateVKPipeline(pl, rp);
14623
14624 m_errorMonitor->VerifyFound();
14625
14626 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14627 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14628 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14629}
14630
Chris Forbes541f7b02016-08-22 15:30:27 +120014631TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014632 TEST_DESCRIPTION(
14633 "Test that an error is produced for a shader consuming an input attachment "
14634 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120014635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070014636 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120014637
14638 ASSERT_NO_FATAL_FAILURE(InitState());
14639
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014640 char const *vsSource =
14641 "#version 450\n"
14642 "\n"
14643 "out gl_PerVertex {\n"
14644 " vec4 gl_Position;\n"
14645 "};\n"
14646 "void main(){\n"
14647 " gl_Position = vec4(1);\n"
14648 "}\n";
14649 char const *fsSource =
14650 "#version 450\n"
14651 "\n"
14652 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
14653 "layout(location=0) out vec4 color;\n"
14654 "void main() {\n"
14655 " color = subpassLoad(xs[0]);\n"
14656 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120014657
14658 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14659 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14660
14661 VkPipelineObj pipe(m_device);
14662 pipe.AddShader(&vs);
14663 pipe.AddShader(&fs);
14664 pipe.AddColorAttachment();
14665 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14666
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014667 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
14668 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120014669 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014670 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120014671 ASSERT_VK_SUCCESS(err);
14672
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014673 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120014674 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014675 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120014676 ASSERT_VK_SUCCESS(err);
14677
14678 // error here.
14679 pipe.CreateVKPipeline(pl, renderPass());
14680
14681 m_errorMonitor->VerifyFound();
14682
14683 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14684 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14685}
14686
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014687TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014688 TEST_DESCRIPTION(
14689 "Test that an error is produced for a compute pipeline consuming a "
14690 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014691 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014692
14693 ASSERT_NO_FATAL_FAILURE(InitState());
14694
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014695 char const *csSource =
14696 "#version 450\n"
14697 "\n"
14698 "layout(local_size_x=1) in;\n"
14699 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14700 "void main(){\n"
14701 " x = vec4(1);\n"
14702 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014703
14704 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14705
14706 VkDescriptorSetObj descriptorSet(m_device);
14707 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14708
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014709 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14710 nullptr,
14711 0,
14712 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
14713 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
14714 descriptorSet.GetPipelineLayout(),
14715 VK_NULL_HANDLE,
14716 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014717
14718 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014719 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014720
14721 m_errorMonitor->VerifyFound();
14722
14723 if (err == VK_SUCCESS) {
14724 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14725 }
14726}
14727
Chris Forbes22a9b092016-07-19 14:34:05 +120014728TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014729 TEST_DESCRIPTION(
14730 "Test that an error is produced for a pipeline consuming a "
14731 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14733 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120014734
14735 ASSERT_NO_FATAL_FAILURE(InitState());
14736
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014737 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
14738 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120014739 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014740 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120014741 ASSERT_VK_SUCCESS(err);
14742
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014743 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120014744 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014745 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120014746 ASSERT_VK_SUCCESS(err);
14747
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014748 char const *csSource =
14749 "#version 450\n"
14750 "\n"
14751 "layout(local_size_x=1) in;\n"
14752 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14753 "void main() {\n"
14754 " x.x = 1.0f;\n"
14755 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120014756 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14757
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014758 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14759 nullptr,
14760 0,
14761 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
14762 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
14763 pl,
14764 VK_NULL_HANDLE,
14765 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120014766
14767 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014768 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120014769
14770 m_errorMonitor->VerifyFound();
14771
14772 if (err == VK_SUCCESS) {
14773 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14774 }
14775
14776 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14777 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14778}
14779
Chris Forbes50020592016-07-27 13:52:41 +120014780TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014781 TEST_DESCRIPTION(
14782 "Test that an error is produced when an image view type "
14783 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120014784
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014785 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 +120014786
14787 ASSERT_NO_FATAL_FAILURE(InitState());
14788 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14789
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014790 char const *vsSource =
14791 "#version 450\n"
14792 "\n"
14793 "out gl_PerVertex { vec4 gl_Position; };\n"
14794 "void main() { gl_Position = vec4(0); }\n";
14795 char const *fsSource =
14796 "#version 450\n"
14797 "\n"
14798 "layout(set=0, binding=0) uniform sampler3D s;\n"
14799 "layout(location=0) out vec4 color;\n"
14800 "void main() {\n"
14801 " color = texture(s, vec3(0));\n"
14802 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120014803 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14804 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14805
14806 VkPipelineObj pipe(m_device);
14807 pipe.AddShader(&vs);
14808 pipe.AddShader(&fs);
14809 pipe.AddColorAttachment();
14810
14811 VkTextureObj texture(m_device, nullptr);
14812 VkSamplerObj sampler(m_device);
14813
14814 VkDescriptorSetObj descriptorSet(m_device);
14815 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14816 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14817
14818 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14819 ASSERT_VK_SUCCESS(err);
14820
Tony Barbour552f6c02016-12-21 14:34:07 -070014821 m_commandBuffer->BeginCommandBuffer();
14822 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120014823
14824 m_commandBuffer->BindPipeline(pipe);
14825 m_commandBuffer->BindDescriptorSet(descriptorSet);
14826
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014827 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120014828 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014829 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120014830 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14831
14832 // error produced here.
14833 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
14834
14835 m_errorMonitor->VerifyFound();
14836
Tony Barbour552f6c02016-12-21 14:34:07 -070014837 m_commandBuffer->EndRenderPass();
14838 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120014839}
14840
Chris Forbes5533bfc2016-07-27 14:12:34 +120014841TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014842 TEST_DESCRIPTION(
14843 "Test that an error is produced when a multisampled images "
14844 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120014845
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120014847
14848 ASSERT_NO_FATAL_FAILURE(InitState());
14849 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14850
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014851 char const *vsSource =
14852 "#version 450\n"
14853 "\n"
14854 "out gl_PerVertex { vec4 gl_Position; };\n"
14855 "void main() { gl_Position = vec4(0); }\n";
14856 char const *fsSource =
14857 "#version 450\n"
14858 "\n"
14859 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
14860 "layout(location=0) out vec4 color;\n"
14861 "void main() {\n"
14862 " color = texelFetch(s, ivec2(0), 0);\n"
14863 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120014864 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14865 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14866
14867 VkPipelineObj pipe(m_device);
14868 pipe.AddShader(&vs);
14869 pipe.AddShader(&fs);
14870 pipe.AddColorAttachment();
14871
14872 VkTextureObj texture(m_device, nullptr);
14873 VkSamplerObj sampler(m_device);
14874
14875 VkDescriptorSetObj descriptorSet(m_device);
14876 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14877 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14878
14879 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14880 ASSERT_VK_SUCCESS(err);
14881
Tony Barbour552f6c02016-12-21 14:34:07 -070014882 m_commandBuffer->BeginCommandBuffer();
14883 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120014884
14885 m_commandBuffer->BindPipeline(pipe);
14886 m_commandBuffer->BindDescriptorSet(descriptorSet);
14887
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014888 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120014889 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014890 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120014891 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14892
14893 // error produced here.
14894 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
14895
14896 m_errorMonitor->VerifyFound();
14897
Tony Barbour552f6c02016-12-21 14:34:07 -070014898 m_commandBuffer->EndRenderPass();
14899 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120014900}
14901
Mark Youngc48c4c12016-04-11 14:26:49 -060014902TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014904
14905 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014906
14907 // Create an image
14908 VkImage image;
14909
Karl Schultz6addd812016-02-02 17:17:23 -070014910 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14911 const int32_t tex_width = 32;
14912 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014913
14914 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014915 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14916 image_create_info.pNext = NULL;
14917 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14918 image_create_info.format = tex_format;
14919 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014920 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070014921 image_create_info.extent.depth = 1;
14922 image_create_info.mipLevels = 1;
14923 image_create_info.arrayLayers = 1;
14924 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14925 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14926 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14927 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014928
14929 // Introduce error by sending down a bogus width extent
14930 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014931 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014932
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014933 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014934}
14935
Mark Youngc48c4c12016-04-11 14:26:49 -060014936TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Mark Lobodzinski688ed322017-01-27 11:13:21 -070014937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00716);
Mark Youngc48c4c12016-04-11 14:26:49 -060014938
14939 ASSERT_NO_FATAL_FAILURE(InitState());
14940
14941 // Create an image
14942 VkImage image;
14943
14944 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14945 const int32_t tex_width = 32;
14946 const int32_t tex_height = 32;
14947
14948 VkImageCreateInfo image_create_info = {};
14949 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;
14954 image_create_info.extent.height = tex_height;
14955 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;
14962
14963 // Introduce error by sending down a bogus width extent
14964 image_create_info.extent.width = 0;
14965 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14966
14967 m_errorMonitor->VerifyFound();
14968}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070014969
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060014970TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014971 TEST_DESCRIPTION(
14972 "Create a render pass with an attachment description "
14973 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060014974
14975 ASSERT_NO_FATAL_FAILURE(InitState());
14976 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14977
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070014978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060014979
14980 VkAttachmentReference color_attach = {};
14981 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
14982 color_attach.attachment = 0;
14983 VkSubpassDescription subpass = {};
14984 subpass.colorAttachmentCount = 1;
14985 subpass.pColorAttachments = &color_attach;
14986
14987 VkRenderPassCreateInfo rpci = {};
14988 rpci.subpassCount = 1;
14989 rpci.pSubpasses = &subpass;
14990 rpci.attachmentCount = 1;
14991 VkAttachmentDescription attach_desc = {};
14992 attach_desc.format = VK_FORMAT_UNDEFINED;
14993 rpci.pAttachments = &attach_desc;
14994 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
14995 VkRenderPass rp;
14996 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
14997
14998 m_errorMonitor->VerifyFound();
14999
15000 if (result == VK_SUCCESS) {
15001 vkDestroyRenderPass(m_device->device(), rp, NULL);
15002 }
15003}
15004
Karl Schultz6addd812016-02-02 17:17:23 -070015005TEST_F(VkLayerTest, InvalidImageView) {
15006 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060015007
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015008 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015009
Tobin Ehliscde08892015-09-22 10:11:37 -060015010 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060015011
Mike Stroyana3082432015-09-25 13:39:21 -060015012 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015013 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060015014
Karl Schultz6addd812016-02-02 17:17:23 -070015015 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15016 const int32_t tex_width = 32;
15017 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015018
15019 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015020 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15021 image_create_info.pNext = NULL;
15022 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15023 image_create_info.format = tex_format;
15024 image_create_info.extent.width = tex_width;
15025 image_create_info.extent.height = tex_height;
15026 image_create_info.extent.depth = 1;
15027 image_create_info.mipLevels = 1;
15028 image_create_info.arrayLayers = 1;
15029 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15030 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15031 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15032 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015033
Chia-I Wuf7458c52015-10-26 21:10:41 +080015034 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015035 ASSERT_VK_SUCCESS(err);
15036
15037 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015038 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015039 image_view_create_info.image = image;
15040 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15041 image_view_create_info.format = tex_format;
15042 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015043 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015044 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015045 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015046
15047 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015048 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060015049
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015050 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060015051 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015052}
Mike Stroyana3082432015-09-25 13:39:21 -060015053
Mark Youngd339ba32016-05-30 13:28:35 -060015054TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15055 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015056 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015057 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015058
15059 ASSERT_NO_FATAL_FAILURE(InitState());
15060
15061 // Create an image and try to create a view with no memory backing the image
15062 VkImage image;
15063
15064 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15065 const int32_t tex_width = 32;
15066 const int32_t tex_height = 32;
15067
15068 VkImageCreateInfo image_create_info = {};
15069 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15070 image_create_info.pNext = NULL;
15071 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15072 image_create_info.format = tex_format;
15073 image_create_info.extent.width = tex_width;
15074 image_create_info.extent.height = tex_height;
15075 image_create_info.extent.depth = 1;
15076 image_create_info.mipLevels = 1;
15077 image_create_info.arrayLayers = 1;
15078 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15079 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15080 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15081 image_create_info.flags = 0;
15082
15083 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15084 ASSERT_VK_SUCCESS(err);
15085
15086 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015087 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015088 image_view_create_info.image = image;
15089 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15090 image_view_create_info.format = tex_format;
15091 image_view_create_info.subresourceRange.layerCount = 1;
15092 image_view_create_info.subresourceRange.baseMipLevel = 0;
15093 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015094 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015095
15096 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015097 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015098
15099 m_errorMonitor->VerifyFound();
15100 vkDestroyImage(m_device->device(), image, NULL);
15101 // If last error is success, it still created the view, so delete it.
15102 if (err == VK_SUCCESS) {
15103 vkDestroyImageView(m_device->device(), view, NULL);
15104 }
Mark Youngd339ba32016-05-30 13:28:35 -060015105}
15106
Karl Schultz6addd812016-02-02 17:17:23 -070015107TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015108 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015109 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015110
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015111 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015112
Karl Schultz6addd812016-02-02 17:17:23 -070015113 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015114 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015115 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015116 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015117
15118 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015119 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015120 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015121 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15122 image_view_create_info.format = tex_format;
15123 image_view_create_info.subresourceRange.baseMipLevel = 0;
15124 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015125 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015126 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015127 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015128
15129 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015130 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015131
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015132 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015133}
15134
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015135TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015136 VkResult err;
15137 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015138
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015139 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015140
Mike Stroyana3082432015-09-25 13:39:21 -060015141 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015142
15143 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015144 VkImage srcImage;
15145 VkImage dstImage;
15146 VkDeviceMemory srcMem;
15147 VkDeviceMemory destMem;
15148 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015149
15150 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015151 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15152 image_create_info.pNext = NULL;
15153 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15154 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15155 image_create_info.extent.width = 32;
15156 image_create_info.extent.height = 32;
15157 image_create_info.extent.depth = 1;
15158 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015159 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015160 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15161 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15162 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15163 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015164
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015165 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015166 ASSERT_VK_SUCCESS(err);
15167
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015168 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015169 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015170 ASSERT_VK_SUCCESS(err);
15171
15172 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015173 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015174 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15175 memAlloc.pNext = NULL;
15176 memAlloc.allocationSize = 0;
15177 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015178
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015179 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015180 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015181 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015182 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015183 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015184 ASSERT_VK_SUCCESS(err);
15185
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015186 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015187 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015188 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015189 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015190 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015191 ASSERT_VK_SUCCESS(err);
15192
15193 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15194 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015195 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015196 ASSERT_VK_SUCCESS(err);
15197
Tony Barbour552f6c02016-12-21 14:34:07 -070015198 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015199 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015200 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015201 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015202 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015203 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015204 copyRegion.srcOffset.x = 0;
15205 copyRegion.srcOffset.y = 0;
15206 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015207 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015208 copyRegion.dstSubresource.mipLevel = 0;
15209 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015210 // Introduce failure by forcing the dst layerCount to differ from src
15211 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015212 copyRegion.dstOffset.x = 0;
15213 copyRegion.dstOffset.y = 0;
15214 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015215 copyRegion.extent.width = 1;
15216 copyRegion.extent.height = 1;
15217 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015218 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015219 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015220
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015221 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015222
Chia-I Wuf7458c52015-10-26 21:10:41 +080015223 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015224 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015225 vkFreeMemory(m_device->device(), srcMem, NULL);
15226 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015227}
15228
Tony Barbourd6673642016-05-05 14:46:39 -060015229TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060015230 TEST_DESCRIPTION("Creating images with unsuported formats ");
15231
15232 ASSERT_NO_FATAL_FAILURE(InitState());
15233 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15234 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015235 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 -060015236 VK_IMAGE_TILING_OPTIMAL, 0);
15237 ASSERT_TRUE(image.initialized());
15238
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015239 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130015240 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015241 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015242 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15243 image_create_info.format = VK_FORMAT_UNDEFINED;
15244 image_create_info.extent.width = 32;
15245 image_create_info.extent.height = 32;
15246 image_create_info.extent.depth = 1;
15247 image_create_info.mipLevels = 1;
15248 image_create_info.arrayLayers = 1;
15249 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15250 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15251 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015252
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15254 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015255
15256 VkImage localImage;
15257 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
15258 m_errorMonitor->VerifyFound();
15259
Tony Barbourd6673642016-05-05 14:46:39 -060015260 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015261 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060015262 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15263 VkFormat format = static_cast<VkFormat>(f);
15264 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015265 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060015266 unsupported = format;
15267 break;
15268 }
15269 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015270
Tony Barbourd6673642016-05-05 14:46:39 -060015271 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015272 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015273 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015274
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015275 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060015276 m_errorMonitor->VerifyFound();
15277 }
15278}
15279
15280TEST_F(VkLayerTest, ImageLayerViewTests) {
15281 VkResult ret;
15282 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15283
15284 ASSERT_NO_FATAL_FAILURE(InitState());
15285
15286 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015287 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 -060015288 VK_IMAGE_TILING_OPTIMAL, 0);
15289 ASSERT_TRUE(image.initialized());
15290
15291 VkImageView imgView;
15292 VkImageViewCreateInfo imgViewInfo = {};
15293 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15294 imgViewInfo.image = image.handle();
15295 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15296 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15297 imgViewInfo.subresourceRange.layerCount = 1;
15298 imgViewInfo.subresourceRange.baseMipLevel = 0;
15299 imgViewInfo.subresourceRange.levelCount = 1;
15300 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15301
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015303 // View can't have baseMipLevel >= image's mipLevels - Expect
15304 // VIEW_CREATE_ERROR
15305 imgViewInfo.subresourceRange.baseMipLevel = 1;
15306 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15307 m_errorMonitor->VerifyFound();
15308 imgViewInfo.subresourceRange.baseMipLevel = 0;
15309
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060015311 // View can't have baseArrayLayer >= image's arraySize - Expect
15312 // VIEW_CREATE_ERROR
15313 imgViewInfo.subresourceRange.baseArrayLayer = 1;
15314 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15315 m_errorMonitor->VerifyFound();
15316 imgViewInfo.subresourceRange.baseArrayLayer = 0;
15317
Mike Weiblenc16b2aa2017-01-25 13:02:44 -070015318 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015319 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
15320 imgViewInfo.subresourceRange.levelCount = 0;
15321 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15322 m_errorMonitor->VerifyFound();
15323 imgViewInfo.subresourceRange.levelCount = 1;
15324
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015325 m_errorMonitor->SetDesiredFailureMsg(
15326 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15327 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060015328 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
15329 imgViewInfo.subresourceRange.layerCount = 0;
15330 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15331 m_errorMonitor->VerifyFound();
15332 imgViewInfo.subresourceRange.layerCount = 1;
15333
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15335 "Formats MUST be IDENTICAL unless "
15336 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
15337 "was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060015338 // Can't use depth format for view into color image - Expect INVALID_FORMAT
15339 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
15340 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15341 m_errorMonitor->VerifyFound();
15342 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15343
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060015345 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
15346 // VIEW_CREATE_ERROR
15347 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
15348 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15349 m_errorMonitor->VerifyFound();
15350 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15351
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015352 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015353 // TODO: Update framework to easily passing mutable flag into ImageObj init
15354 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070015355 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
15356 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15357 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060015358 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
15359 // VIEW_CREATE_ERROR
15360 VkImageCreateInfo mutImgInfo = image.create_info();
15361 VkImage mutImage;
15362 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015363 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060015364 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
15365 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15366 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
15367 ASSERT_VK_SUCCESS(ret);
15368 imgViewInfo.image = mutImage;
15369 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15370 m_errorMonitor->VerifyFound();
15371 imgViewInfo.image = image.handle();
15372 vkDestroyImage(m_device->handle(), mutImage, NULL);
15373}
15374
15375TEST_F(VkLayerTest, MiscImageLayerTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060015376 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
15377
15378 ASSERT_NO_FATAL_FAILURE(InitState());
15379
Rene Lindsay135204f2016-12-22 17:11:09 -070015380 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060015381 VkImageObj image(m_device);
Rene Lindsay135204f2016-12-22 17:11:09 -070015382 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 -070015383 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060015384 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060015385 vk_testing::Buffer buffer;
15386 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070015387 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060015388 VkBufferImageCopy region = {};
15389 region.bufferRowLength = 128;
15390 region.bufferImageHeight = 128;
15391 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15392 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070015393 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060015394 region.imageExtent.height = 4;
15395 region.imageExtent.width = 4;
15396 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070015397
15398 VkImageObj image2(m_device);
15399 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 -070015400 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070015401 ASSERT_TRUE(image2.initialized());
15402 vk_testing::Buffer buffer2;
15403 VkMemoryPropertyFlags reqs2 = 0;
15404 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
15405 VkBufferImageCopy region2 = {};
15406 region2.bufferRowLength = 128;
15407 region2.bufferImageHeight = 128;
15408 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15409 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
15410 region2.imageSubresource.layerCount = 1;
15411 region2.imageExtent.height = 4;
15412 region2.imageExtent.width = 4;
15413 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060015414 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060015415
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070015416 // Image must have offset.z of 0 and extent.depth of 1
15417 // Introduce failure by setting imageExtent.depth to 0
15418 region.imageExtent.depth = 0;
15419 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01269);
15420 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015421 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070015422 m_errorMonitor->VerifyFound();
15423
15424 region.imageExtent.depth = 1;
15425
15426 // Image must have offset.z of 0 and extent.depth of 1
15427 // Introduce failure by setting imageOffset.z to 4
15428 region.imageOffset.z = 4;
15429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01269);
15430 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015431 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070015432 m_errorMonitor->VerifyFound();
15433
15434 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015435 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
15436 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070015437 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070015438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015439 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
15440 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015441 m_errorMonitor->VerifyFound();
15442
15443 // BufferOffset must be a multiple of 4
15444 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070015445 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070015446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070015447 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
15448 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015449 m_errorMonitor->VerifyFound();
15450
15451 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
15452 region.bufferOffset = 0;
15453 region.imageExtent.height = 128;
15454 region.imageExtent.width = 128;
15455 // Introduce failure by setting bufferRowLength > 0 but less than width
15456 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070015457 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015458 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
15459 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015460 m_errorMonitor->VerifyFound();
15461
15462 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
15463 region.bufferRowLength = 128;
15464 // Introduce failure by setting bufferRowHeight > 0 but less than height
15465 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070015466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015467 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
15468 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015469 m_errorMonitor->VerifyFound();
15470
15471 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060015472 VkImageObj intImage1(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070015473 intImage1.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
15474 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060015475 VkImageObj intImage2(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070015476 intImage2.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15477 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060015478 VkImageBlit blitRegion = {};
15479 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15480 blitRegion.srcSubresource.baseArrayLayer = 0;
15481 blitRegion.srcSubresource.layerCount = 1;
15482 blitRegion.srcSubresource.mipLevel = 0;
15483 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15484 blitRegion.dstSubresource.baseArrayLayer = 0;
15485 blitRegion.dstSubresource.layerCount = 1;
15486 blitRegion.dstSubresource.mipLevel = 0;
15487
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060015488 // Look for NULL-blit warning
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "Offsets specify a zero-volume area.");
15490 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
15491 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060015492 m_errorMonitor->VerifyFound();
15493
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070015494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060015495 VkImageMemoryBarrier img_barrier;
15496 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
15497 img_barrier.pNext = NULL;
15498 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
15499 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
15500 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15501 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15502 img_barrier.image = image.handle();
15503 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15504 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15505 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15506 img_barrier.subresourceRange.baseArrayLayer = 0;
15507 img_barrier.subresourceRange.baseMipLevel = 0;
15508 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
15509 img_barrier.subresourceRange.layerCount = 0;
15510 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015511 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
15512 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060015513 m_errorMonitor->VerifyFound();
15514 img_barrier.subresourceRange.layerCount = 1;
15515}
15516
15517TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060015518 TEST_DESCRIPTION("Exceed the limits of image format ");
15519
Cody Northropc31a84f2016-08-22 10:41:47 -060015520 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060015522 VkImageCreateInfo image_create_info = {};
15523 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15524 image_create_info.pNext = NULL;
15525 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15526 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15527 image_create_info.extent.width = 32;
15528 image_create_info.extent.height = 32;
15529 image_create_info.extent.depth = 1;
15530 image_create_info.mipLevels = 1;
15531 image_create_info.arrayLayers = 1;
15532 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15533 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15534 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15535 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15536 image_create_info.flags = 0;
15537
15538 VkImage nullImg;
15539 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015540 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
15541 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070015542 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060015543 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15544 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15545 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070015546 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060015547
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060015549 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
15550 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15551 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15552 m_errorMonitor->VerifyFound();
15553 image_create_info.mipLevels = 1;
15554
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015555 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060015556 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
15557 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15558 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15559 m_errorMonitor->VerifyFound();
15560 image_create_info.arrayLayers = 1;
15561
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015562 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060015563 int samples = imgFmtProps.sampleCounts >> 1;
15564 image_create_info.samples = (VkSampleCountFlagBits)samples;
15565 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15566 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15567 m_errorMonitor->VerifyFound();
15568 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15569
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15571 "pCreateInfo->initialLayout, must be "
15572 "VK_IMAGE_LAYOUT_UNDEFINED or "
15573 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060015574 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15575 // Expect INVALID_LAYOUT
15576 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15577 m_errorMonitor->VerifyFound();
15578 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15579}
15580
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015581TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015582 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060015583 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015584
15585 ASSERT_NO_FATAL_FAILURE(InitState());
15586
15587 VkImageObj src_image(m_device);
15588 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
15589 VkImageObj dst_image(m_device);
15590 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
15591
Tony Barbour552f6c02016-12-21 14:34:07 -070015592 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015593 VkImageCopy copy_region;
15594 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15595 copy_region.srcSubresource.mipLevel = 0;
15596 copy_region.srcSubresource.baseArrayLayer = 0;
15597 copy_region.srcSubresource.layerCount = 0;
15598 copy_region.srcOffset.x = 0;
15599 copy_region.srcOffset.y = 0;
15600 copy_region.srcOffset.z = 0;
15601 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15602 copy_region.dstSubresource.mipLevel = 0;
15603 copy_region.dstSubresource.baseArrayLayer = 0;
15604 copy_region.dstSubresource.layerCount = 0;
15605 copy_region.dstOffset.x = 0;
15606 copy_region.dstOffset.y = 0;
15607 copy_region.dstOffset.z = 0;
15608 copy_region.extent.width = 64;
15609 copy_region.extent.height = 64;
15610 copy_region.extent.depth = 1;
15611 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
15612 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070015613 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015614
15615 m_errorMonitor->VerifyFound();
15616}
15617
15618TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015619 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060015620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015621
15622 ASSERT_NO_FATAL_FAILURE(InitState());
15623
15624 VkImageObj src_image(m_device);
15625 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
15626 VkImageObj dst_image(m_device);
15627 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
15628
Tony Barbour552f6c02016-12-21 14:34:07 -070015629 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015630 VkImageCopy copy_region;
15631 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15632 copy_region.srcSubresource.mipLevel = 0;
15633 copy_region.srcSubresource.baseArrayLayer = 0;
15634 copy_region.srcSubresource.layerCount = 0;
15635 copy_region.srcOffset.x = 0;
15636 copy_region.srcOffset.y = 0;
15637 copy_region.srcOffset.z = 0;
15638 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15639 copy_region.dstSubresource.mipLevel = 0;
15640 copy_region.dstSubresource.baseArrayLayer = 0;
15641 copy_region.dstSubresource.layerCount = 0;
15642 copy_region.dstOffset.x = 0;
15643 copy_region.dstOffset.y = 0;
15644 copy_region.dstOffset.z = 0;
15645 copy_region.extent.width = 64;
15646 copy_region.extent.height = 64;
15647 copy_region.extent.depth = 1;
15648 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
15649 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070015650 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015651
15652 m_errorMonitor->VerifyFound();
15653}
15654
Karl Schultz6addd812016-02-02 17:17:23 -070015655TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060015656 VkResult err;
15657 bool pass;
15658
15659 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060015661
15662 ASSERT_NO_FATAL_FAILURE(InitState());
15663
15664 // Create two images of different types and try to copy between them
15665 VkImage srcImage;
15666 VkImage dstImage;
15667 VkDeviceMemory srcMem;
15668 VkDeviceMemory destMem;
15669 VkMemoryRequirements memReqs;
15670
15671 VkImageCreateInfo image_create_info = {};
15672 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15673 image_create_info.pNext = NULL;
15674 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15675 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15676 image_create_info.extent.width = 32;
15677 image_create_info.extent.height = 32;
15678 image_create_info.extent.depth = 1;
15679 image_create_info.mipLevels = 1;
15680 image_create_info.arrayLayers = 1;
15681 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15682 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15683 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15684 image_create_info.flags = 0;
15685
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015686 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060015687 ASSERT_VK_SUCCESS(err);
15688
15689 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15690 // Introduce failure by creating second image with a different-sized format.
15691 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
15692
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015693 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060015694 ASSERT_VK_SUCCESS(err);
15695
15696 // Allocate memory
15697 VkMemoryAllocateInfo memAlloc = {};
15698 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15699 memAlloc.pNext = NULL;
15700 memAlloc.allocationSize = 0;
15701 memAlloc.memoryTypeIndex = 0;
15702
15703 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
15704 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015705 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060015706 ASSERT_TRUE(pass);
15707 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
15708 ASSERT_VK_SUCCESS(err);
15709
15710 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
15711 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015712 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060015713 ASSERT_TRUE(pass);
15714 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
15715 ASSERT_VK_SUCCESS(err);
15716
15717 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15718 ASSERT_VK_SUCCESS(err);
15719 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
15720 ASSERT_VK_SUCCESS(err);
15721
Tony Barbour552f6c02016-12-21 14:34:07 -070015722 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060015723 VkImageCopy copyRegion;
15724 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15725 copyRegion.srcSubresource.mipLevel = 0;
15726 copyRegion.srcSubresource.baseArrayLayer = 0;
15727 copyRegion.srcSubresource.layerCount = 0;
15728 copyRegion.srcOffset.x = 0;
15729 copyRegion.srcOffset.y = 0;
15730 copyRegion.srcOffset.z = 0;
15731 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15732 copyRegion.dstSubresource.mipLevel = 0;
15733 copyRegion.dstSubresource.baseArrayLayer = 0;
15734 copyRegion.dstSubresource.layerCount = 0;
15735 copyRegion.dstOffset.x = 0;
15736 copyRegion.dstOffset.y = 0;
15737 copyRegion.dstOffset.z = 0;
15738 copyRegion.extent.width = 1;
15739 copyRegion.extent.height = 1;
15740 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015741 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015742 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060015743
15744 m_errorMonitor->VerifyFound();
15745
15746 vkDestroyImage(m_device->device(), srcImage, NULL);
15747 vkDestroyImage(m_device->device(), dstImage, NULL);
15748 vkFreeMemory(m_device->device(), srcMem, NULL);
15749 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015750}
15751
Karl Schultz6addd812016-02-02 17:17:23 -070015752TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
15753 VkResult err;
15754 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015755
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015756 // Create a color image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015757 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15758 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015759
Mike Stroyana3082432015-09-25 13:39:21 -060015760 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015761
15762 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015763 VkImage srcImage;
15764 VkImage dstImage;
15765 VkDeviceMemory srcMem;
15766 VkDeviceMemory destMem;
15767 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015768
15769 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015770 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15771 image_create_info.pNext = NULL;
15772 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15773 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15774 image_create_info.extent.width = 32;
15775 image_create_info.extent.height = 32;
15776 image_create_info.extent.depth = 1;
15777 image_create_info.mipLevels = 1;
15778 image_create_info.arrayLayers = 1;
15779 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15780 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15781 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15782 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015783
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015784 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015785 ASSERT_VK_SUCCESS(err);
15786
Karl Schultzbdb75952016-04-19 11:36:49 -060015787 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15788
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015789 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070015790 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015791 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015792 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015793
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015794 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015795 ASSERT_VK_SUCCESS(err);
15796
15797 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015798 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015799 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15800 memAlloc.pNext = NULL;
15801 memAlloc.allocationSize = 0;
15802 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015803
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015804 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015805 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015806 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015807 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015808 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015809 ASSERT_VK_SUCCESS(err);
15810
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015811 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015812 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015813 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015814 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015815 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015816 ASSERT_VK_SUCCESS(err);
15817
15818 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15819 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015820 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015821 ASSERT_VK_SUCCESS(err);
15822
Tony Barbour552f6c02016-12-21 14:34:07 -070015823 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015824 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015825 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015826 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015827 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015828 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015829 copyRegion.srcOffset.x = 0;
15830 copyRegion.srcOffset.y = 0;
15831 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015832 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015833 copyRegion.dstSubresource.mipLevel = 0;
15834 copyRegion.dstSubresource.baseArrayLayer = 0;
15835 copyRegion.dstSubresource.layerCount = 0;
15836 copyRegion.dstOffset.x = 0;
15837 copyRegion.dstOffset.y = 0;
15838 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015839 copyRegion.extent.width = 1;
15840 copyRegion.extent.height = 1;
15841 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015842 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015843 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015844
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015845 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015846
Chia-I Wuf7458c52015-10-26 21:10:41 +080015847 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015848 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015849 vkFreeMemory(m_device->device(), srcMem, NULL);
15850 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015851}
15852
Karl Schultz6addd812016-02-02 17:17:23 -070015853TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
15854 VkResult err;
15855 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015856
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15858 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015859
Mike Stroyana3082432015-09-25 13:39:21 -060015860 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015861
15862 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015863 VkImage srcImage;
15864 VkImage dstImage;
15865 VkDeviceMemory srcMem;
15866 VkDeviceMemory destMem;
15867 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015868
15869 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015870 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15871 image_create_info.pNext = NULL;
15872 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15873 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15874 image_create_info.extent.width = 32;
15875 image_create_info.extent.height = 1;
15876 image_create_info.extent.depth = 1;
15877 image_create_info.mipLevels = 1;
15878 image_create_info.arrayLayers = 1;
15879 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15880 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15881 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15882 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015883
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015884 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015885 ASSERT_VK_SUCCESS(err);
15886
Karl Schultz6addd812016-02-02 17:17:23 -070015887 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015888
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015889 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015890 ASSERT_VK_SUCCESS(err);
15891
15892 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015893 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015894 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15895 memAlloc.pNext = NULL;
15896 memAlloc.allocationSize = 0;
15897 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015898
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015899 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015900 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015901 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015902 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015903 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015904 ASSERT_VK_SUCCESS(err);
15905
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015906 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015907 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015908 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015909 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015910 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015911 ASSERT_VK_SUCCESS(err);
15912
15913 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15914 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015915 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015916 ASSERT_VK_SUCCESS(err);
15917
Tony Barbour552f6c02016-12-21 14:34:07 -070015918 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015919 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015920 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15921 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015922 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015923 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015924 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015925 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015926 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015927 resolveRegion.srcOffset.x = 0;
15928 resolveRegion.srcOffset.y = 0;
15929 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015930 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015931 resolveRegion.dstSubresource.mipLevel = 0;
15932 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015933 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015934 resolveRegion.dstOffset.x = 0;
15935 resolveRegion.dstOffset.y = 0;
15936 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015937 resolveRegion.extent.width = 1;
15938 resolveRegion.extent.height = 1;
15939 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015940 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015941 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015942
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015943 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015944
Chia-I Wuf7458c52015-10-26 21:10:41 +080015945 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015946 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015947 vkFreeMemory(m_device->device(), srcMem, NULL);
15948 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015949}
15950
Karl Schultz6addd812016-02-02 17:17:23 -070015951TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
15952 VkResult err;
15953 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015954
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015955 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15956 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015957
Mike Stroyana3082432015-09-25 13:39:21 -060015958 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015959
Chris Forbesa7530692016-05-08 12:35:39 +120015960 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015961 VkImage srcImage;
15962 VkImage dstImage;
15963 VkDeviceMemory srcMem;
15964 VkDeviceMemory destMem;
15965 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015966
15967 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015968 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15969 image_create_info.pNext = NULL;
15970 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15971 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15972 image_create_info.extent.width = 32;
15973 image_create_info.extent.height = 1;
15974 image_create_info.extent.depth = 1;
15975 image_create_info.mipLevels = 1;
15976 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120015977 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015978 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15979 // Note: Some implementations expect color attachment usage for any
15980 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015981 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015982 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015983
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015984 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015985 ASSERT_VK_SUCCESS(err);
15986
Karl Schultz6addd812016-02-02 17:17:23 -070015987 // Note: Some implementations expect color attachment usage for any
15988 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015989 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015990
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015991 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015992 ASSERT_VK_SUCCESS(err);
15993
15994 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015995 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015996 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15997 memAlloc.pNext = NULL;
15998 memAlloc.allocationSize = 0;
15999 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016000
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016001 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016002 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016003 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016004 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016005 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016006 ASSERT_VK_SUCCESS(err);
16007
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016008 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016009 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016010 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016011 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016012 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016013 ASSERT_VK_SUCCESS(err);
16014
16015 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16016 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016017 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016018 ASSERT_VK_SUCCESS(err);
16019
Tony Barbour552f6c02016-12-21 14:34:07 -070016020 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016021 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016022 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16023 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016024 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016025 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016026 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016027 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016028 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016029 resolveRegion.srcOffset.x = 0;
16030 resolveRegion.srcOffset.y = 0;
16031 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016032 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016033 resolveRegion.dstSubresource.mipLevel = 0;
16034 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016035 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016036 resolveRegion.dstOffset.x = 0;
16037 resolveRegion.dstOffset.y = 0;
16038 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016039 resolveRegion.extent.width = 1;
16040 resolveRegion.extent.height = 1;
16041 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016042 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016043 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016044
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016045 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016046
Chia-I Wuf7458c52015-10-26 21:10:41 +080016047 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016048 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016049 vkFreeMemory(m_device->device(), srcMem, NULL);
16050 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016051}
16052
Karl Schultz6addd812016-02-02 17:17:23 -070016053TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
16054 VkResult err;
16055 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016056
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070016057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016058 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016059
Mike Stroyana3082432015-09-25 13:39:21 -060016060 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016061
16062 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016063 VkImage srcImage;
16064 VkImage dstImage;
16065 VkDeviceMemory srcMem;
16066 VkDeviceMemory destMem;
16067 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016068
16069 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016070 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16071 image_create_info.pNext = NULL;
16072 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16073 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16074 image_create_info.extent.width = 32;
16075 image_create_info.extent.height = 1;
16076 image_create_info.extent.depth = 1;
16077 image_create_info.mipLevels = 1;
16078 image_create_info.arrayLayers = 1;
16079 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
16080 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16081 // Note: Some implementations expect color attachment usage for any
16082 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016083 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016084 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016085
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016086 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016087 ASSERT_VK_SUCCESS(err);
16088
Karl Schultz6addd812016-02-02 17:17:23 -070016089 // Set format to something other than source image
16090 image_create_info.format = VK_FORMAT_R32_SFLOAT;
16091 // Note: Some implementations expect color attachment usage for any
16092 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016093 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016094 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016095
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016096 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016097 ASSERT_VK_SUCCESS(err);
16098
16099 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016100 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016101 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16102 memAlloc.pNext = NULL;
16103 memAlloc.allocationSize = 0;
16104 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016105
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016106 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016107 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016108 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016109 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016110 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016111 ASSERT_VK_SUCCESS(err);
16112
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016113 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016114 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016115 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016116 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016117 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016118 ASSERT_VK_SUCCESS(err);
16119
16120 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16121 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016122 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016123 ASSERT_VK_SUCCESS(err);
16124
Tony Barbour552f6c02016-12-21 14:34:07 -070016125 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016126 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016127 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16128 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016129 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016130 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016131 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016132 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016133 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016134 resolveRegion.srcOffset.x = 0;
16135 resolveRegion.srcOffset.y = 0;
16136 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016137 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016138 resolveRegion.dstSubresource.mipLevel = 0;
16139 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016140 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016141 resolveRegion.dstOffset.x = 0;
16142 resolveRegion.dstOffset.y = 0;
16143 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016144 resolveRegion.extent.width = 1;
16145 resolveRegion.extent.height = 1;
16146 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016147 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016148 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016149
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016150 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016151
Chia-I Wuf7458c52015-10-26 21:10:41 +080016152 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016153 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016154 vkFreeMemory(m_device->device(), srcMem, NULL);
16155 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016156}
16157
Karl Schultz6addd812016-02-02 17:17:23 -070016158TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
16159 VkResult err;
16160 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016161
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070016162 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016163 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016164
Mike Stroyana3082432015-09-25 13:39:21 -060016165 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016166
16167 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016168 VkImage srcImage;
16169 VkImage dstImage;
16170 VkDeviceMemory srcMem;
16171 VkDeviceMemory destMem;
16172 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016173
16174 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016175 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16176 image_create_info.pNext = NULL;
16177 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16178 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16179 image_create_info.extent.width = 32;
16180 image_create_info.extent.height = 1;
16181 image_create_info.extent.depth = 1;
16182 image_create_info.mipLevels = 1;
16183 image_create_info.arrayLayers = 1;
16184 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
16185 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16186 // Note: Some implementations expect color attachment usage for any
16187 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016188 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016189 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016190
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016191 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016192 ASSERT_VK_SUCCESS(err);
16193
Karl Schultz6addd812016-02-02 17:17:23 -070016194 image_create_info.imageType = VK_IMAGE_TYPE_1D;
16195 // Note: Some implementations expect color attachment usage for any
16196 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016197 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016198 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016199
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016200 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016201 ASSERT_VK_SUCCESS(err);
16202
16203 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016204 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016205 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16206 memAlloc.pNext = NULL;
16207 memAlloc.allocationSize = 0;
16208 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016209
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016210 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016211 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016212 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016213 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016214 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016215 ASSERT_VK_SUCCESS(err);
16216
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016217 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016218 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016219 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016220 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016221 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016222 ASSERT_VK_SUCCESS(err);
16223
16224 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16225 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016226 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016227 ASSERT_VK_SUCCESS(err);
16228
Tony Barbour552f6c02016-12-21 14:34:07 -070016229 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016230 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016231 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16232 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016233 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016234 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016235 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016236 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016237 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016238 resolveRegion.srcOffset.x = 0;
16239 resolveRegion.srcOffset.y = 0;
16240 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016241 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016242 resolveRegion.dstSubresource.mipLevel = 0;
16243 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016244 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016245 resolveRegion.dstOffset.x = 0;
16246 resolveRegion.dstOffset.y = 0;
16247 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016248 resolveRegion.extent.width = 1;
16249 resolveRegion.extent.height = 1;
16250 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016251 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016252 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016253
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016254 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016255
Chia-I Wuf7458c52015-10-26 21:10:41 +080016256 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016257 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016258 vkFreeMemory(m_device->device(), srcMem, NULL);
16259 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016260}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016261
Karl Schultz6addd812016-02-02 17:17:23 -070016262TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016263 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070016264 // to using a DS format, then cause it to hit error due to COLOR_BIT not
16265 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016266 // The image format check comes 2nd in validation so we trigger it first,
16267 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070016268 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016269
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16271 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016272
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016273 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016274
Chia-I Wu1b99bb22015-10-27 19:25:11 +080016275 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016276 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16277 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016278
16279 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016280 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16281 ds_pool_ci.pNext = NULL;
16282 ds_pool_ci.maxSets = 1;
16283 ds_pool_ci.poolSizeCount = 1;
16284 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016285
16286 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016287 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016288 ASSERT_VK_SUCCESS(err);
16289
16290 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016291 dsl_binding.binding = 0;
16292 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16293 dsl_binding.descriptorCount = 1;
16294 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16295 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016296
16297 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016298 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16299 ds_layout_ci.pNext = NULL;
16300 ds_layout_ci.bindingCount = 1;
16301 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016302 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016303 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016304 ASSERT_VK_SUCCESS(err);
16305
16306 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016307 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080016308 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070016309 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016310 alloc_info.descriptorPool = ds_pool;
16311 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016312 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016313 ASSERT_VK_SUCCESS(err);
16314
Karl Schultz6addd812016-02-02 17:17:23 -070016315 VkImage image_bad;
16316 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016317 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060016318 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016319 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070016320 const int32_t tex_width = 32;
16321 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016322
16323 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016324 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16325 image_create_info.pNext = NULL;
16326 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16327 image_create_info.format = tex_format_bad;
16328 image_create_info.extent.width = tex_width;
16329 image_create_info.extent.height = tex_height;
16330 image_create_info.extent.depth = 1;
16331 image_create_info.mipLevels = 1;
16332 image_create_info.arrayLayers = 1;
16333 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16334 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016335 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016336 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016337
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016338 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016339 ASSERT_VK_SUCCESS(err);
16340 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016341 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16342 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016343 ASSERT_VK_SUCCESS(err);
16344
Rene Lindsayf1e89c82016-12-28 13:18:31 -070016345 // ---Bind image memory---
16346 VkMemoryRequirements img_mem_reqs;
16347 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
16348 VkMemoryAllocateInfo image_alloc_info = {};
16349 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16350 image_alloc_info.pNext = NULL;
16351 image_alloc_info.memoryTypeIndex = 0;
16352 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016353 bool pass =
16354 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 -070016355 ASSERT_TRUE(pass);
16356 VkDeviceMemory mem;
16357 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
16358 ASSERT_VK_SUCCESS(err);
16359 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
16360 ASSERT_VK_SUCCESS(err);
16361 // -----------------------
16362
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016363 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130016364 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070016365 image_view_create_info.image = image_bad;
16366 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16367 image_view_create_info.format = tex_format_bad;
16368 image_view_create_info.subresourceRange.baseArrayLayer = 0;
16369 image_view_create_info.subresourceRange.baseMipLevel = 0;
16370 image_view_create_info.subresourceRange.layerCount = 1;
16371 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070016372 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016373
16374 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016375 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016376
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016377 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016378
Chia-I Wuf7458c52015-10-26 21:10:41 +080016379 vkDestroyImage(m_device->device(), image_bad, NULL);
16380 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016381 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16382 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070016383
16384 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016385}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016386
16387TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016388 TEST_DESCRIPTION(
16389 "Call ClearColorImage w/ a depth|stencil image and "
16390 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016391
16392 ASSERT_NO_FATAL_FAILURE(InitState());
16393 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16394
Tony Barbour552f6c02016-12-21 14:34:07 -070016395 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016396
16397 // Color image
16398 VkClearColorValue clear_color;
16399 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
16400 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
16401 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
16402 const int32_t img_width = 32;
16403 const int32_t img_height = 32;
16404 VkImageCreateInfo image_create_info = {};
16405 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16406 image_create_info.pNext = NULL;
16407 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16408 image_create_info.format = color_format;
16409 image_create_info.extent.width = img_width;
16410 image_create_info.extent.height = img_height;
16411 image_create_info.extent.depth = 1;
16412 image_create_info.mipLevels = 1;
16413 image_create_info.arrayLayers = 1;
16414 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16415 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16416 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16417
16418 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016419 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016420
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016421 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016422
16423 // Depth/Stencil image
16424 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016425 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016426 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
16427 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
16428 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
16429 ds_image_create_info.extent.width = 64;
16430 ds_image_create_info.extent.height = 64;
16431 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070016432 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 -060016433
16434 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016435 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016436
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016437 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 -060016438
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016440
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016441 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016442 &color_range);
16443
16444 m_errorMonitor->VerifyFound();
16445
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16447 "vkCmdClearColorImage called with "
16448 "image created without "
16449 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060016450
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070016451 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060016452 &color_range);
16453
16454 m_errorMonitor->VerifyFound();
16455
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016456 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016457 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16458 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016459
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016460 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
16461 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016462
16463 m_errorMonitor->VerifyFound();
16464}
Tobin Ehliscde08892015-09-22 10:11:37 -060016465
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016466// WSI Enabled Tests
16467//
Chris Forbes09368e42016-10-13 11:59:22 +130016468#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016469TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
16470
16471#if defined(VK_USE_PLATFORM_XCB_KHR)
16472 VkSurfaceKHR surface = VK_NULL_HANDLE;
16473
16474 VkResult err;
16475 bool pass;
16476 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
16477 VkSwapchainCreateInfoKHR swapchain_create_info = {};
16478 // uint32_t swapchain_image_count = 0;
16479 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
16480 // uint32_t image_index = 0;
16481 // VkPresentInfoKHR present_info = {};
16482
16483 ASSERT_NO_FATAL_FAILURE(InitState());
16484
16485 // Use the create function from one of the VK_KHR_*_surface extension in
16486 // order to create a surface, testing all known errors in the process,
16487 // before successfully creating a surface:
16488 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
16489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
16490 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
16491 pass = (err != VK_SUCCESS);
16492 ASSERT_TRUE(pass);
16493 m_errorMonitor->VerifyFound();
16494
16495 // Next, try to create a surface with the wrong
16496 // VkXcbSurfaceCreateInfoKHR::sType:
16497 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
16498 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
16499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
16500 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
16501 pass = (err != VK_SUCCESS);
16502 ASSERT_TRUE(pass);
16503 m_errorMonitor->VerifyFound();
16504
16505 // Create a native window, and then correctly create a surface:
16506 xcb_connection_t *connection;
16507 xcb_screen_t *screen;
16508 xcb_window_t xcb_window;
16509 xcb_intern_atom_reply_t *atom_wm_delete_window;
16510
16511 const xcb_setup_t *setup;
16512 xcb_screen_iterator_t iter;
16513 int scr;
16514 uint32_t value_mask, value_list[32];
16515 int width = 1;
16516 int height = 1;
16517
16518 connection = xcb_connect(NULL, &scr);
16519 ASSERT_TRUE(connection != NULL);
16520 setup = xcb_get_setup(connection);
16521 iter = xcb_setup_roots_iterator(setup);
16522 while (scr-- > 0)
16523 xcb_screen_next(&iter);
16524 screen = iter.data;
16525
16526 xcb_window = xcb_generate_id(connection);
16527
16528 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
16529 value_list[0] = screen->black_pixel;
16530 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
16531
16532 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
16533 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
16534
16535 /* Magic code that will send notification when window is destroyed */
16536 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
16537 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
16538
16539 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
16540 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
16541 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
16542 free(reply);
16543
16544 xcb_map_window(connection, xcb_window);
16545
16546 // Force the x/y coordinates to 100,100 results are identical in consecutive
16547 // runs
16548 const uint32_t coords[] = { 100, 100 };
16549 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
16550
16551 // Finally, try to correctly create a surface:
16552 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
16553 xcb_create_info.pNext = NULL;
16554 xcb_create_info.flags = 0;
16555 xcb_create_info.connection = connection;
16556 xcb_create_info.window = xcb_window;
16557 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
16558 pass = (err == VK_SUCCESS);
16559 ASSERT_TRUE(pass);
16560
16561 // Check if surface supports presentation:
16562
16563 // 1st, do so without having queried the queue families:
16564 VkBool32 supported = false;
16565 // TODO: Get the following error to come out:
16566 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16567 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
16568 "function");
16569 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
16570 pass = (err != VK_SUCCESS);
16571 // ASSERT_TRUE(pass);
16572 // m_errorMonitor->VerifyFound();
16573
16574 // Next, query a queue family index that's too large:
16575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
16576 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
16577 pass = (err != VK_SUCCESS);
16578 ASSERT_TRUE(pass);
16579 m_errorMonitor->VerifyFound();
16580
16581 // Finally, do so correctly:
16582 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
16583 // SUPPORTED
16584 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
16585 pass = (err == VK_SUCCESS);
16586 ASSERT_TRUE(pass);
16587
16588 // Before proceeding, try to create a swapchain without having called
16589 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
16590 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
16591 swapchain_create_info.pNext = NULL;
16592 swapchain_create_info.flags = 0;
16593 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16594 swapchain_create_info.surface = surface;
16595 swapchain_create_info.imageArrayLayers = 1;
16596 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
16597 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
16598 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16599 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
16600 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16601 pass = (err != VK_SUCCESS);
16602 ASSERT_TRUE(pass);
16603 m_errorMonitor->VerifyFound();
16604
16605 // Get the surface capabilities:
16606 VkSurfaceCapabilitiesKHR surface_capabilities;
16607
16608 // Do so correctly (only error logged by this entrypoint is if the
16609 // extension isn't enabled):
16610 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
16611 pass = (err == VK_SUCCESS);
16612 ASSERT_TRUE(pass);
16613
16614 // Get the surface formats:
16615 uint32_t surface_format_count;
16616
16617 // First, try without a pointer to surface_format_count:
16618 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
16619 "specified as NULL");
16620 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
16621 pass = (err == VK_SUCCESS);
16622 ASSERT_TRUE(pass);
16623 m_errorMonitor->VerifyFound();
16624
16625 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
16626 // correctly done a 1st try (to get the count):
16627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
16628 surface_format_count = 0;
16629 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
16630 pass = (err == VK_SUCCESS);
16631 ASSERT_TRUE(pass);
16632 m_errorMonitor->VerifyFound();
16633
16634 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
16635 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
16636 pass = (err == VK_SUCCESS);
16637 ASSERT_TRUE(pass);
16638
16639 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
16640 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
16641
16642 // Next, do a 2nd try with surface_format_count being set too high:
16643 surface_format_count += 5;
16644 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
16645 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
16646 pass = (err == VK_SUCCESS);
16647 ASSERT_TRUE(pass);
16648 m_errorMonitor->VerifyFound();
16649
16650 // Finally, do a correct 1st and 2nd try:
16651 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
16652 pass = (err == VK_SUCCESS);
16653 ASSERT_TRUE(pass);
16654 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
16655 pass = (err == VK_SUCCESS);
16656 ASSERT_TRUE(pass);
16657
16658 // Get the surface present modes:
16659 uint32_t surface_present_mode_count;
16660
16661 // First, try without a pointer to surface_format_count:
16662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
16663 "specified as NULL");
16664
16665 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
16666 pass = (err == VK_SUCCESS);
16667 ASSERT_TRUE(pass);
16668 m_errorMonitor->VerifyFound();
16669
16670 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
16671 // correctly done a 1st try (to get the count):
16672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
16673 surface_present_mode_count = 0;
16674 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
16675 (VkPresentModeKHR *)&surface_present_mode_count);
16676 pass = (err == VK_SUCCESS);
16677 ASSERT_TRUE(pass);
16678 m_errorMonitor->VerifyFound();
16679
16680 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
16681 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
16682 pass = (err == VK_SUCCESS);
16683 ASSERT_TRUE(pass);
16684
16685 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
16686 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
16687
16688 // Next, do a 2nd try with surface_format_count being set too high:
16689 surface_present_mode_count += 5;
16690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
16691 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
16692 pass = (err == VK_SUCCESS);
16693 ASSERT_TRUE(pass);
16694 m_errorMonitor->VerifyFound();
16695
16696 // Finally, do a correct 1st and 2nd try:
16697 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
16698 pass = (err == VK_SUCCESS);
16699 ASSERT_TRUE(pass);
16700 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
16701 pass = (err == VK_SUCCESS);
16702 ASSERT_TRUE(pass);
16703
16704 // Create a swapchain:
16705
16706 // First, try without a pointer to swapchain_create_info:
16707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
16708 "specified as NULL");
16709
16710 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
16711 pass = (err != VK_SUCCESS);
16712 ASSERT_TRUE(pass);
16713 m_errorMonitor->VerifyFound();
16714
16715 // Next, call with a non-NULL swapchain_create_info, that has the wrong
16716 // sType:
16717 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
16718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
16719
16720 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16721 pass = (err != VK_SUCCESS);
16722 ASSERT_TRUE(pass);
16723 m_errorMonitor->VerifyFound();
16724
16725 // Next, call with a NULL swapchain pointer:
16726 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
16727 swapchain_create_info.pNext = NULL;
16728 swapchain_create_info.flags = 0;
16729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
16730 "specified as NULL");
16731
16732 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
16733 pass = (err != VK_SUCCESS);
16734 ASSERT_TRUE(pass);
16735 m_errorMonitor->VerifyFound();
16736
16737 // TODO: Enhance swapchain layer so that
16738 // swapchain_create_info.queueFamilyIndexCount is checked against something?
16739
16740 // Next, call with a queue family index that's too large:
16741 uint32_t queueFamilyIndex[2] = { 100000, 0 };
16742 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
16743 swapchain_create_info.queueFamilyIndexCount = 2;
16744 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
16745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
16746 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16747 pass = (err != VK_SUCCESS);
16748 ASSERT_TRUE(pass);
16749 m_errorMonitor->VerifyFound();
16750
16751 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
16752 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
16753 swapchain_create_info.queueFamilyIndexCount = 1;
16754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16755 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
16756 "pCreateInfo->pQueueFamilyIndices).");
16757 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16758 pass = (err != VK_SUCCESS);
16759 ASSERT_TRUE(pass);
16760 m_errorMonitor->VerifyFound();
16761
16762 // Next, call with an invalid imageSharingMode:
16763 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
16764 swapchain_create_info.queueFamilyIndexCount = 1;
16765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16766 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
16767 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16768 pass = (err != VK_SUCCESS);
16769 ASSERT_TRUE(pass);
16770 m_errorMonitor->VerifyFound();
16771 // Fix for the future:
16772 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
16773 // SUPPORTED
16774 swapchain_create_info.queueFamilyIndexCount = 0;
16775 queueFamilyIndex[0] = 0;
16776 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
16777
16778 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
16779 // Get the images from a swapchain:
16780 // Acquire an image from a swapchain:
16781 // Present an image to a swapchain:
16782 // Destroy the swapchain:
16783
16784 // TODOs:
16785 //
16786 // - Try destroying the device without first destroying the swapchain
16787 //
16788 // - Try destroying the device without first destroying the surface
16789 //
16790 // - Try destroying the surface without first destroying the swapchain
16791
16792 // Destroy the surface:
16793 vkDestroySurfaceKHR(instance(), surface, NULL);
16794
16795 // Tear down the window:
16796 xcb_destroy_window(connection, xcb_window);
16797 xcb_disconnect(connection);
16798
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016799#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016800 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016801#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016802}
Chris Forbes09368e42016-10-13 11:59:22 +130016803#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016804
16805//
16806// POSITIVE VALIDATION TESTS
16807//
16808// These tests do not expect to encounter ANY validation errors pass only if this is true
16809
Tobin Ehlise0006882016-11-03 10:14:28 -060016810TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016811 TEST_DESCRIPTION(
16812 "Perform an image layout transition in a secondary command buffer followed "
16813 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060016814 VkResult err;
16815 m_errorMonitor->ExpectSuccess();
16816 ASSERT_NO_FATAL_FAILURE(InitState());
16817 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16818 // Allocate a secondary and primary cmd buffer
16819 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
16820 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
16821 command_buffer_allocate_info.commandPool = m_commandPool;
16822 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
16823 command_buffer_allocate_info.commandBufferCount = 1;
16824
16825 VkCommandBuffer secondary_command_buffer;
16826 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
16827 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
16828 VkCommandBuffer primary_command_buffer;
16829 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
16830 VkCommandBufferBeginInfo command_buffer_begin_info = {};
16831 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
16832 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
16833 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
16834 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
16835 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
16836
16837 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
16838 ASSERT_VK_SUCCESS(err);
16839 VkImageObj image(m_device);
16840 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
16841 ASSERT_TRUE(image.initialized());
16842 VkImageMemoryBarrier img_barrier = {};
16843 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16844 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16845 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16846 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16847 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16848 img_barrier.image = image.handle();
16849 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16850 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16851 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16852 img_barrier.subresourceRange.baseArrayLayer = 0;
16853 img_barrier.subresourceRange.baseMipLevel = 0;
16854 img_barrier.subresourceRange.layerCount = 1;
16855 img_barrier.subresourceRange.levelCount = 1;
16856 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
16857 0, nullptr, 1, &img_barrier);
16858 err = vkEndCommandBuffer(secondary_command_buffer);
16859 ASSERT_VK_SUCCESS(err);
16860
16861 // Now update primary cmd buffer to execute secondary and transitions image
16862 command_buffer_begin_info.pInheritanceInfo = nullptr;
16863 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
16864 ASSERT_VK_SUCCESS(err);
16865 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
16866 VkImageMemoryBarrier img_barrier2 = {};
16867 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16868 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16869 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16870 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16871 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16872 img_barrier2.image = image.handle();
16873 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16874 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16875 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16876 img_barrier2.subresourceRange.baseArrayLayer = 0;
16877 img_barrier2.subresourceRange.baseMipLevel = 0;
16878 img_barrier2.subresourceRange.layerCount = 1;
16879 img_barrier2.subresourceRange.levelCount = 1;
16880 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
16881 nullptr, 1, &img_barrier2);
16882 err = vkEndCommandBuffer(primary_command_buffer);
16883 ASSERT_VK_SUCCESS(err);
16884 VkSubmitInfo submit_info = {};
16885 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
16886 submit_info.commandBufferCount = 1;
16887 submit_info.pCommandBuffers = &primary_command_buffer;
16888 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
16889 ASSERT_VK_SUCCESS(err);
16890 m_errorMonitor->VerifyNotFound();
16891 err = vkDeviceWaitIdle(m_device->device());
16892 ASSERT_VK_SUCCESS(err);
16893 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &secondary_command_buffer);
16894 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &primary_command_buffer);
16895}
16896
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016897// This is a positive test. No failures are expected.
16898TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016899 TEST_DESCRIPTION(
16900 "Ensure that the vkUpdateDescriptorSets validation code "
16901 "is ignoring VkWriteDescriptorSet members that are not "
16902 "related to the descriptor type specified by "
16903 "VkWriteDescriptorSet::descriptorType. Correct "
16904 "validation behavior will result in the test running to "
16905 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016906
16907 const uintptr_t invalid_ptr = 0xcdcdcdcd;
16908
16909 ASSERT_NO_FATAL_FAILURE(InitState());
16910
16911 // Image Case
16912 {
16913 m_errorMonitor->ExpectSuccess();
16914
16915 VkImage image;
16916 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16917 const int32_t tex_width = 32;
16918 const int32_t tex_height = 32;
16919 VkImageCreateInfo image_create_info = {};
16920 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16921 image_create_info.pNext = NULL;
16922 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16923 image_create_info.format = tex_format;
16924 image_create_info.extent.width = tex_width;
16925 image_create_info.extent.height = tex_height;
16926 image_create_info.extent.depth = 1;
16927 image_create_info.mipLevels = 1;
16928 image_create_info.arrayLayers = 1;
16929 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16930 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16931 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16932 image_create_info.flags = 0;
16933 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16934 ASSERT_VK_SUCCESS(err);
16935
16936 VkMemoryRequirements memory_reqs;
16937 VkDeviceMemory image_memory;
16938 bool pass;
16939 VkMemoryAllocateInfo memory_info = {};
16940 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16941 memory_info.pNext = NULL;
16942 memory_info.allocationSize = 0;
16943 memory_info.memoryTypeIndex = 0;
16944 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
16945 memory_info.allocationSize = memory_reqs.size;
16946 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
16947 ASSERT_TRUE(pass);
16948 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
16949 ASSERT_VK_SUCCESS(err);
16950 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
16951 ASSERT_VK_SUCCESS(err);
16952
16953 VkImageViewCreateInfo image_view_create_info = {};
16954 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16955 image_view_create_info.image = image;
16956 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16957 image_view_create_info.format = tex_format;
16958 image_view_create_info.subresourceRange.layerCount = 1;
16959 image_view_create_info.subresourceRange.baseMipLevel = 0;
16960 image_view_create_info.subresourceRange.levelCount = 1;
16961 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16962
16963 VkImageView view;
16964 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
16965 ASSERT_VK_SUCCESS(err);
16966
16967 VkDescriptorPoolSize ds_type_count = {};
16968 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16969 ds_type_count.descriptorCount = 1;
16970
16971 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16972 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16973 ds_pool_ci.pNext = NULL;
16974 ds_pool_ci.maxSets = 1;
16975 ds_pool_ci.poolSizeCount = 1;
16976 ds_pool_ci.pPoolSizes = &ds_type_count;
16977
16978 VkDescriptorPool ds_pool;
16979 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16980 ASSERT_VK_SUCCESS(err);
16981
16982 VkDescriptorSetLayoutBinding dsl_binding = {};
16983 dsl_binding.binding = 0;
16984 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16985 dsl_binding.descriptorCount = 1;
16986 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16987 dsl_binding.pImmutableSamplers = NULL;
16988
16989 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16990 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16991 ds_layout_ci.pNext = NULL;
16992 ds_layout_ci.bindingCount = 1;
16993 ds_layout_ci.pBindings = &dsl_binding;
16994 VkDescriptorSetLayout ds_layout;
16995 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16996 ASSERT_VK_SUCCESS(err);
16997
16998 VkDescriptorSet descriptor_set;
16999 VkDescriptorSetAllocateInfo alloc_info = {};
17000 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17001 alloc_info.descriptorSetCount = 1;
17002 alloc_info.descriptorPool = ds_pool;
17003 alloc_info.pSetLayouts = &ds_layout;
17004 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17005 ASSERT_VK_SUCCESS(err);
17006
17007 VkDescriptorImageInfo image_info = {};
17008 image_info.imageView = view;
17009 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
17010
17011 VkWriteDescriptorSet descriptor_write;
17012 memset(&descriptor_write, 0, sizeof(descriptor_write));
17013 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17014 descriptor_write.dstSet = descriptor_set;
17015 descriptor_write.dstBinding = 0;
17016 descriptor_write.descriptorCount = 1;
17017 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17018 descriptor_write.pImageInfo = &image_info;
17019
17020 // Set pBufferInfo and pTexelBufferView to invalid values, which should
17021 // be
17022 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
17023 // This will most likely produce a crash if the parameter_validation
17024 // layer
17025 // does not correctly ignore pBufferInfo.
17026 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
17027 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
17028
17029 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17030
17031 m_errorMonitor->VerifyNotFound();
17032
17033 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17034 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17035 vkDestroyImageView(m_device->device(), view, NULL);
17036 vkDestroyImage(m_device->device(), image, NULL);
17037 vkFreeMemory(m_device->device(), image_memory, NULL);
17038 }
17039
17040 // Buffer Case
17041 {
17042 m_errorMonitor->ExpectSuccess();
17043
17044 VkBuffer buffer;
17045 uint32_t queue_family_index = 0;
17046 VkBufferCreateInfo buffer_create_info = {};
17047 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17048 buffer_create_info.size = 1024;
17049 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
17050 buffer_create_info.queueFamilyIndexCount = 1;
17051 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
17052
17053 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
17054 ASSERT_VK_SUCCESS(err);
17055
17056 VkMemoryRequirements memory_reqs;
17057 VkDeviceMemory buffer_memory;
17058 bool pass;
17059 VkMemoryAllocateInfo memory_info = {};
17060 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17061 memory_info.pNext = NULL;
17062 memory_info.allocationSize = 0;
17063 memory_info.memoryTypeIndex = 0;
17064
17065 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
17066 memory_info.allocationSize = memory_reqs.size;
17067 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
17068 ASSERT_TRUE(pass);
17069
17070 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
17071 ASSERT_VK_SUCCESS(err);
17072 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
17073 ASSERT_VK_SUCCESS(err);
17074
17075 VkDescriptorPoolSize ds_type_count = {};
17076 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17077 ds_type_count.descriptorCount = 1;
17078
17079 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17080 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17081 ds_pool_ci.pNext = NULL;
17082 ds_pool_ci.maxSets = 1;
17083 ds_pool_ci.poolSizeCount = 1;
17084 ds_pool_ci.pPoolSizes = &ds_type_count;
17085
17086 VkDescriptorPool ds_pool;
17087 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17088 ASSERT_VK_SUCCESS(err);
17089
17090 VkDescriptorSetLayoutBinding dsl_binding = {};
17091 dsl_binding.binding = 0;
17092 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17093 dsl_binding.descriptorCount = 1;
17094 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17095 dsl_binding.pImmutableSamplers = NULL;
17096
17097 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17098 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17099 ds_layout_ci.pNext = NULL;
17100 ds_layout_ci.bindingCount = 1;
17101 ds_layout_ci.pBindings = &dsl_binding;
17102 VkDescriptorSetLayout ds_layout;
17103 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17104 ASSERT_VK_SUCCESS(err);
17105
17106 VkDescriptorSet descriptor_set;
17107 VkDescriptorSetAllocateInfo alloc_info = {};
17108 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17109 alloc_info.descriptorSetCount = 1;
17110 alloc_info.descriptorPool = ds_pool;
17111 alloc_info.pSetLayouts = &ds_layout;
17112 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17113 ASSERT_VK_SUCCESS(err);
17114
17115 VkDescriptorBufferInfo buffer_info = {};
17116 buffer_info.buffer = buffer;
17117 buffer_info.offset = 0;
17118 buffer_info.range = 1024;
17119
17120 VkWriteDescriptorSet descriptor_write;
17121 memset(&descriptor_write, 0, sizeof(descriptor_write));
17122 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17123 descriptor_write.dstSet = descriptor_set;
17124 descriptor_write.dstBinding = 0;
17125 descriptor_write.descriptorCount = 1;
17126 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17127 descriptor_write.pBufferInfo = &buffer_info;
17128
17129 // Set pImageInfo and pTexelBufferView to invalid values, which should
17130 // be
17131 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
17132 // This will most likely produce a crash if the parameter_validation
17133 // layer
17134 // does not correctly ignore pImageInfo.
17135 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
17136 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
17137
17138 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17139
17140 m_errorMonitor->VerifyNotFound();
17141
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017142 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17143 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17144 vkDestroyBuffer(m_device->device(), buffer, NULL);
17145 vkFreeMemory(m_device->device(), buffer_memory, NULL);
17146 }
17147
17148 // Texel Buffer Case
17149 {
17150 m_errorMonitor->ExpectSuccess();
17151
17152 VkBuffer buffer;
17153 uint32_t queue_family_index = 0;
17154 VkBufferCreateInfo buffer_create_info = {};
17155 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17156 buffer_create_info.size = 1024;
17157 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
17158 buffer_create_info.queueFamilyIndexCount = 1;
17159 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
17160
17161 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
17162 ASSERT_VK_SUCCESS(err);
17163
17164 VkMemoryRequirements memory_reqs;
17165 VkDeviceMemory buffer_memory;
17166 bool pass;
17167 VkMemoryAllocateInfo memory_info = {};
17168 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17169 memory_info.pNext = NULL;
17170 memory_info.allocationSize = 0;
17171 memory_info.memoryTypeIndex = 0;
17172
17173 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
17174 memory_info.allocationSize = memory_reqs.size;
17175 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
17176 ASSERT_TRUE(pass);
17177
17178 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
17179 ASSERT_VK_SUCCESS(err);
17180 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
17181 ASSERT_VK_SUCCESS(err);
17182
17183 VkBufferViewCreateInfo buff_view_ci = {};
17184 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
17185 buff_view_ci.buffer = buffer;
17186 buff_view_ci.format = VK_FORMAT_R8_UNORM;
17187 buff_view_ci.range = VK_WHOLE_SIZE;
17188 VkBufferView buffer_view;
17189 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
17190
17191 VkDescriptorPoolSize ds_type_count = {};
17192 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
17193 ds_type_count.descriptorCount = 1;
17194
17195 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17196 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17197 ds_pool_ci.pNext = NULL;
17198 ds_pool_ci.maxSets = 1;
17199 ds_pool_ci.poolSizeCount = 1;
17200 ds_pool_ci.pPoolSizes = &ds_type_count;
17201
17202 VkDescriptorPool ds_pool;
17203 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17204 ASSERT_VK_SUCCESS(err);
17205
17206 VkDescriptorSetLayoutBinding dsl_binding = {};
17207 dsl_binding.binding = 0;
17208 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
17209 dsl_binding.descriptorCount = 1;
17210 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17211 dsl_binding.pImmutableSamplers = NULL;
17212
17213 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17214 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17215 ds_layout_ci.pNext = NULL;
17216 ds_layout_ci.bindingCount = 1;
17217 ds_layout_ci.pBindings = &dsl_binding;
17218 VkDescriptorSetLayout ds_layout;
17219 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17220 ASSERT_VK_SUCCESS(err);
17221
17222 VkDescriptorSet descriptor_set;
17223 VkDescriptorSetAllocateInfo alloc_info = {};
17224 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17225 alloc_info.descriptorSetCount = 1;
17226 alloc_info.descriptorPool = ds_pool;
17227 alloc_info.pSetLayouts = &ds_layout;
17228 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17229 ASSERT_VK_SUCCESS(err);
17230
17231 VkWriteDescriptorSet descriptor_write;
17232 memset(&descriptor_write, 0, sizeof(descriptor_write));
17233 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17234 descriptor_write.dstSet = descriptor_set;
17235 descriptor_write.dstBinding = 0;
17236 descriptor_write.descriptorCount = 1;
17237 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
17238 descriptor_write.pTexelBufferView = &buffer_view;
17239
17240 // Set pImageInfo and pBufferInfo to invalid values, which should be
17241 // ignored for descriptorType ==
17242 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
17243 // This will most likely produce a crash if the parameter_validation
17244 // layer
17245 // does not correctly ignore pImageInfo and pBufferInfo.
17246 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
17247 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
17248
17249 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17250
17251 m_errorMonitor->VerifyNotFound();
17252
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017253 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17254 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17255 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
17256 vkDestroyBuffer(m_device->device(), buffer, NULL);
17257 vkFreeMemory(m_device->device(), buffer_memory, NULL);
17258 }
17259}
17260
Tobin Ehlisf7428442016-10-25 07:58:24 -060017261TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
17262 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
17263
17264 ASSERT_NO_FATAL_FAILURE(InitState());
17265 // Create layout where two binding #s are "1"
17266 static const uint32_t NUM_BINDINGS = 3;
17267 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
17268 dsl_binding[0].binding = 1;
17269 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17270 dsl_binding[0].descriptorCount = 1;
17271 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17272 dsl_binding[0].pImmutableSamplers = NULL;
17273 dsl_binding[1].binding = 0;
17274 dsl_binding[1].descriptorCount = 1;
17275 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17276 dsl_binding[1].descriptorCount = 1;
17277 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17278 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017279 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060017280 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17281 dsl_binding[2].descriptorCount = 1;
17282 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17283 dsl_binding[2].pImmutableSamplers = NULL;
17284
17285 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17286 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17287 ds_layout_ci.pNext = NULL;
17288 ds_layout_ci.bindingCount = NUM_BINDINGS;
17289 ds_layout_ci.pBindings = dsl_binding;
17290 VkDescriptorSetLayout ds_layout;
17291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
17292 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17293 m_errorMonitor->VerifyFound();
17294}
17295
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060017296TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017297 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
17298
17299 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017300
Tony Barbour552f6c02016-12-21 14:34:07 -070017301 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017302
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060017303 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
17304
17305 {
17306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
17307 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
17308 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17309 m_errorMonitor->VerifyFound();
17310 }
17311
17312 {
17313 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
17314 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
17315 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17316 m_errorMonitor->VerifyFound();
17317 }
17318
17319 {
17320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
17321 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
17322 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17323 m_errorMonitor->VerifyFound();
17324 }
17325
17326 {
17327 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
17328 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
17329 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17330 m_errorMonitor->VerifyFound();
17331 }
17332
17333 {
17334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
17335 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
17336 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17337 m_errorMonitor->VerifyFound();
17338 }
17339
17340 {
17341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
17342 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
17343 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17344 m_errorMonitor->VerifyFound();
17345 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017346
17347 {
17348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
17349 VkRect2D scissor = {{-1, 0}, {16, 16}};
17350 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
17351 m_errorMonitor->VerifyFound();
17352 }
17353
17354 {
17355 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
17356 VkRect2D scissor = {{0, -2}, {16, 16}};
17357 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
17358 m_errorMonitor->VerifyFound();
17359 }
17360
17361 {
17362 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
17363 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
17364 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
17365 m_errorMonitor->VerifyFound();
17366 }
17367
17368 {
17369 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
17370 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
17371 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
17372 m_errorMonitor->VerifyFound();
17373 }
17374
Tony Barbour552f6c02016-12-21 14:34:07 -070017375 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017376}
17377
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017378// This is a positive test. No failures are expected.
17379TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
17380 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
17381 VkResult err;
17382
17383 ASSERT_NO_FATAL_FAILURE(InitState());
17384 m_errorMonitor->ExpectSuccess();
17385 VkDescriptorPoolSize ds_type_count = {};
17386 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17387 ds_type_count.descriptorCount = 2;
17388
17389 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17390 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17391 ds_pool_ci.pNext = NULL;
17392 ds_pool_ci.maxSets = 1;
17393 ds_pool_ci.poolSizeCount = 1;
17394 ds_pool_ci.pPoolSizes = &ds_type_count;
17395
17396 VkDescriptorPool ds_pool;
17397 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17398 ASSERT_VK_SUCCESS(err);
17399
17400 // Create layout with two uniform buffer descriptors w/ empty binding between them
17401 static const uint32_t NUM_BINDINGS = 3;
17402 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
17403 dsl_binding[0].binding = 0;
17404 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17405 dsl_binding[0].descriptorCount = 1;
17406 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
17407 dsl_binding[0].pImmutableSamplers = NULL;
17408 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017409 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017410 dsl_binding[2].binding = 2;
17411 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17412 dsl_binding[2].descriptorCount = 1;
17413 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
17414 dsl_binding[2].pImmutableSamplers = NULL;
17415
17416 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17417 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17418 ds_layout_ci.pNext = NULL;
17419 ds_layout_ci.bindingCount = NUM_BINDINGS;
17420 ds_layout_ci.pBindings = dsl_binding;
17421 VkDescriptorSetLayout ds_layout;
17422 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17423 ASSERT_VK_SUCCESS(err);
17424
17425 VkDescriptorSet descriptor_set = {};
17426 VkDescriptorSetAllocateInfo alloc_info = {};
17427 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17428 alloc_info.descriptorSetCount = 1;
17429 alloc_info.descriptorPool = ds_pool;
17430 alloc_info.pSetLayouts = &ds_layout;
17431 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17432 ASSERT_VK_SUCCESS(err);
17433
17434 // Create a buffer to be used for update
17435 VkBufferCreateInfo buff_ci = {};
17436 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17437 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
17438 buff_ci.size = 256;
17439 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17440 VkBuffer buffer;
17441 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
17442 ASSERT_VK_SUCCESS(err);
17443 // Have to bind memory to buffer before descriptor update
17444 VkMemoryAllocateInfo mem_alloc = {};
17445 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17446 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017447 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017448 mem_alloc.memoryTypeIndex = 0;
17449
17450 VkMemoryRequirements mem_reqs;
17451 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
17452 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
17453 if (!pass) {
17454 vkDestroyBuffer(m_device->device(), buffer, NULL);
17455 return;
17456 }
17457
17458 VkDeviceMemory mem;
17459 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
17460 ASSERT_VK_SUCCESS(err);
17461 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
17462 ASSERT_VK_SUCCESS(err);
17463
17464 // Only update the descriptor at binding 2
17465 VkDescriptorBufferInfo buff_info = {};
17466 buff_info.buffer = buffer;
17467 buff_info.offset = 0;
17468 buff_info.range = VK_WHOLE_SIZE;
17469 VkWriteDescriptorSet descriptor_write = {};
17470 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17471 descriptor_write.dstBinding = 2;
17472 descriptor_write.descriptorCount = 1;
17473 descriptor_write.pTexelBufferView = nullptr;
17474 descriptor_write.pBufferInfo = &buff_info;
17475 descriptor_write.pImageInfo = nullptr;
17476 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17477 descriptor_write.dstSet = descriptor_set;
17478
17479 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17480
17481 m_errorMonitor->VerifyNotFound();
17482 // Cleanup
17483 vkFreeMemory(m_device->device(), mem, NULL);
17484 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17485 vkDestroyBuffer(m_device->device(), buffer, NULL);
17486 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17487}
17488
17489// This is a positive test. No failures are expected.
17490TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
17491 VkResult err;
17492 bool pass;
17493
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017494 TEST_DESCRIPTION(
17495 "Create a buffer, allocate memory, bind memory, destroy "
17496 "the buffer, create an image, and bind the same memory to "
17497 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017498
17499 m_errorMonitor->ExpectSuccess();
17500
17501 ASSERT_NO_FATAL_FAILURE(InitState());
17502
17503 VkBuffer buffer;
17504 VkImage image;
17505 VkDeviceMemory mem;
17506 VkMemoryRequirements mem_reqs;
17507
17508 VkBufferCreateInfo buf_info = {};
17509 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17510 buf_info.pNext = NULL;
17511 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
17512 buf_info.size = 256;
17513 buf_info.queueFamilyIndexCount = 0;
17514 buf_info.pQueueFamilyIndices = NULL;
17515 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17516 buf_info.flags = 0;
17517 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
17518 ASSERT_VK_SUCCESS(err);
17519
17520 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
17521
17522 VkMemoryAllocateInfo alloc_info = {};
17523 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17524 alloc_info.pNext = NULL;
17525 alloc_info.memoryTypeIndex = 0;
17526
17527 // Ensure memory is big enough for both bindings
17528 alloc_info.allocationSize = 0x10000;
17529
17530 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
17531 if (!pass) {
17532 vkDestroyBuffer(m_device->device(), buffer, NULL);
17533 return;
17534 }
17535
17536 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
17537 ASSERT_VK_SUCCESS(err);
17538
17539 uint8_t *pData;
17540 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
17541 ASSERT_VK_SUCCESS(err);
17542
17543 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
17544
17545 vkUnmapMemory(m_device->device(), mem);
17546
17547 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
17548 ASSERT_VK_SUCCESS(err);
17549
17550 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
17551 // memory. In fact, it was never used by the GPU.
17552 // Just be be sure, wait for idle.
17553 vkDestroyBuffer(m_device->device(), buffer, NULL);
17554 vkDeviceWaitIdle(m_device->device());
17555
Tobin Ehlis6a005702016-12-28 15:25:56 -070017556 // Use optimal as some platforms report linear support but then fail image creation
17557 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
17558 VkImageFormatProperties image_format_properties;
17559 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
17560 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
17561 if (image_format_properties.maxExtent.width == 0) {
17562 printf("Image format not supported; skipped.\n");
17563 vkFreeMemory(m_device->device(), mem, NULL);
17564 return;
17565 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017566 VkImageCreateInfo image_create_info = {};
17567 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17568 image_create_info.pNext = NULL;
17569 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17570 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
17571 image_create_info.extent.width = 64;
17572 image_create_info.extent.height = 64;
17573 image_create_info.extent.depth = 1;
17574 image_create_info.mipLevels = 1;
17575 image_create_info.arrayLayers = 1;
17576 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070017577 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017578 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
17579 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17580 image_create_info.queueFamilyIndexCount = 0;
17581 image_create_info.pQueueFamilyIndices = NULL;
17582 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17583 image_create_info.flags = 0;
17584
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017585 /* Create a mappable image. It will be the texture if linear images are ok
17586 * to be textures or it will be the staging image if they are not.
17587 */
17588 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
17589 ASSERT_VK_SUCCESS(err);
17590
17591 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
17592
Tobin Ehlis6a005702016-12-28 15:25:56 -070017593 VkMemoryAllocateInfo mem_alloc = {};
17594 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17595 mem_alloc.pNext = NULL;
17596 mem_alloc.allocationSize = 0;
17597 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017598 mem_alloc.allocationSize = mem_reqs.size;
17599
17600 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
17601 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070017602 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017603 vkDestroyImage(m_device->device(), image, NULL);
17604 return;
17605 }
17606
17607 // VALIDATION FAILURE:
17608 err = vkBindImageMemory(m_device->device(), image, mem, 0);
17609 ASSERT_VK_SUCCESS(err);
17610
17611 m_errorMonitor->VerifyNotFound();
17612
17613 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017614 vkDestroyImage(m_device->device(), image, NULL);
17615}
17616
Tony Barbourab713912017-02-02 14:17:35 -070017617// This is a positive test. No failures are expected.
17618TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
17619 VkResult err;
17620
17621 TEST_DESCRIPTION(
17622 "Call all applicable destroy and free routines with NULL"
17623 "handles, expecting no validation errors");
17624
17625 m_errorMonitor->ExpectSuccess();
17626
17627 ASSERT_NO_FATAL_FAILURE(InitState());
17628 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
17629 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
17630 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
17631 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
17632 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
17633 vkDestroyDevice(VK_NULL_HANDLE, NULL);
17634 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
17635 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
17636 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
17637 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
17638 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
17639 vkDestroyInstance(VK_NULL_HANDLE, NULL);
17640 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
17641 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
17642 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
17643 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
17644 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
17645 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
17646 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
17647 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
17648
17649 VkCommandPool command_pool;
17650 VkCommandPoolCreateInfo pool_create_info{};
17651 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
17652 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
17653 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
17654 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
17655 VkCommandBuffer command_buffers[3] = {};
17656 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
17657 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17658 command_buffer_allocate_info.commandPool = command_pool;
17659 command_buffer_allocate_info.commandBufferCount = 1;
17660 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17661 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
17662 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
17663 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
17664
17665 VkDescriptorPoolSize ds_type_count = {};
17666 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17667 ds_type_count.descriptorCount = 1;
17668
17669 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17670 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17671 ds_pool_ci.pNext = NULL;
17672 ds_pool_ci.maxSets = 1;
17673 ds_pool_ci.poolSizeCount = 1;
17674 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
17675 ds_pool_ci.pPoolSizes = &ds_type_count;
17676
17677 VkDescriptorPool ds_pool;
17678 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17679 ASSERT_VK_SUCCESS(err);
17680
17681 VkDescriptorSetLayoutBinding dsl_binding = {};
17682 dsl_binding.binding = 2;
17683 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17684 dsl_binding.descriptorCount = 1;
17685 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17686 dsl_binding.pImmutableSamplers = NULL;
17687 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17688 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17689 ds_layout_ci.pNext = NULL;
17690 ds_layout_ci.bindingCount = 1;
17691 ds_layout_ci.pBindings = &dsl_binding;
17692 VkDescriptorSetLayout ds_layout;
17693 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17694 ASSERT_VK_SUCCESS(err);
17695
17696 VkDescriptorSet descriptor_sets[3] = {};
17697 VkDescriptorSetAllocateInfo alloc_info = {};
17698 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17699 alloc_info.descriptorSetCount = 1;
17700 alloc_info.descriptorPool = ds_pool;
17701 alloc_info.pSetLayouts = &ds_layout;
17702 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
17703 ASSERT_VK_SUCCESS(err);
17704 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
17705 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17706 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17707
17708 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
17709
17710 m_errorMonitor->VerifyNotFound();
17711}
17712
Tony Barbour626994c2017-02-08 15:29:37 -070017713TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070017714 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070017715
17716 m_errorMonitor->ExpectSuccess();
17717
17718 ASSERT_NO_FATAL_FAILURE(InitState());
17719 VkCommandBuffer cmd_bufs[4];
17720 VkCommandBufferAllocateInfo alloc_info;
17721 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17722 alloc_info.pNext = NULL;
17723 alloc_info.commandBufferCount = 4;
17724 alloc_info.commandPool = m_commandPool;
17725 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17726 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
17727 VkImageObj image(m_device);
17728 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17729 ASSERT_TRUE(image.initialized());
17730 VkCommandBufferBeginInfo cb_binfo;
17731 cb_binfo.pNext = NULL;
17732 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
17733 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
17734 cb_binfo.flags = 0;
17735 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
17736 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
17737 VkImageMemoryBarrier img_barrier = {};
17738 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17739 img_barrier.pNext = NULL;
17740 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17741 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17742 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17743 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
17744 img_barrier.image = image.handle();
17745 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17746 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17747 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17748 img_barrier.subresourceRange.baseArrayLayer = 0;
17749 img_barrier.subresourceRange.baseMipLevel = 0;
17750 img_barrier.subresourceRange.layerCount = 1;
17751 img_barrier.subresourceRange.levelCount = 1;
17752 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
17753 &img_barrier);
17754 vkEndCommandBuffer(cmd_bufs[0]);
17755 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
17756 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
17757 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17758 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
17759 &img_barrier);
17760 vkEndCommandBuffer(cmd_bufs[1]);
17761 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
17762 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17763 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
17764 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
17765 &img_barrier);
17766 vkEndCommandBuffer(cmd_bufs[2]);
17767 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
17768 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
17769 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
17770 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
17771 &img_barrier);
17772 vkEndCommandBuffer(cmd_bufs[3]);
17773
17774 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
17775 VkSemaphore semaphore1, semaphore2;
17776 VkSemaphoreCreateInfo semaphore_create_info{};
17777 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
17778 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
17779 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
17780 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
17781 VkSubmitInfo submit_info[3];
17782 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17783 submit_info[0].pNext = nullptr;
17784 submit_info[0].commandBufferCount = 1;
17785 submit_info[0].pCommandBuffers = &cmd_bufs[0];
17786 submit_info[0].signalSemaphoreCount = 1;
17787 submit_info[0].pSignalSemaphores = &semaphore1;
17788 submit_info[0].waitSemaphoreCount = 0;
17789 submit_info[0].pWaitDstStageMask = nullptr;
17790 submit_info[0].pWaitDstStageMask = flags;
17791 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17792 submit_info[1].pNext = nullptr;
17793 submit_info[1].commandBufferCount = 1;
17794 submit_info[1].pCommandBuffers = &cmd_bufs[1];
17795 submit_info[1].waitSemaphoreCount = 1;
17796 submit_info[1].pWaitSemaphores = &semaphore1;
17797 submit_info[1].signalSemaphoreCount = 1;
17798 submit_info[1].pSignalSemaphores = &semaphore2;
17799 submit_info[1].pWaitDstStageMask = flags;
17800 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17801 submit_info[2].pNext = nullptr;
17802 submit_info[2].commandBufferCount = 2;
17803 submit_info[2].pCommandBuffers = &cmd_bufs[2];
17804 submit_info[2].waitSemaphoreCount = 1;
17805 submit_info[2].pWaitSemaphores = &semaphore2;
17806 submit_info[2].signalSemaphoreCount = 0;
17807 submit_info[2].pSignalSemaphores = nullptr;
17808 submit_info[2].pWaitDstStageMask = flags;
17809 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
17810 vkQueueWaitIdle(m_device->m_queue);
17811
17812 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
17813 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
17814 m_errorMonitor->VerifyNotFound();
17815}
17816
Tobin Ehlis953e8392016-11-17 10:54:13 -070017817TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
17818 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
17819 // We previously had a bug where dynamic offset of inactive bindings was still being used
17820 VkResult err;
17821 m_errorMonitor->ExpectSuccess();
17822
17823 ASSERT_NO_FATAL_FAILURE(InitState());
17824 ASSERT_NO_FATAL_FAILURE(InitViewport());
17825 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17826
17827 VkDescriptorPoolSize ds_type_count = {};
17828 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17829 ds_type_count.descriptorCount = 3;
17830
17831 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17832 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17833 ds_pool_ci.pNext = NULL;
17834 ds_pool_ci.maxSets = 1;
17835 ds_pool_ci.poolSizeCount = 1;
17836 ds_pool_ci.pPoolSizes = &ds_type_count;
17837
17838 VkDescriptorPool ds_pool;
17839 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17840 ASSERT_VK_SUCCESS(err);
17841
17842 const uint32_t BINDING_COUNT = 3;
17843 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070017844 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070017845 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17846 dsl_binding[0].descriptorCount = 1;
17847 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17848 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070017849 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070017850 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17851 dsl_binding[1].descriptorCount = 1;
17852 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17853 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070017854 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070017855 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17856 dsl_binding[2].descriptorCount = 1;
17857 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17858 dsl_binding[2].pImmutableSamplers = NULL;
17859
17860 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17861 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17862 ds_layout_ci.pNext = NULL;
17863 ds_layout_ci.bindingCount = BINDING_COUNT;
17864 ds_layout_ci.pBindings = dsl_binding;
17865 VkDescriptorSetLayout ds_layout;
17866 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17867 ASSERT_VK_SUCCESS(err);
17868
17869 VkDescriptorSet descriptor_set;
17870 VkDescriptorSetAllocateInfo alloc_info = {};
17871 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17872 alloc_info.descriptorSetCount = 1;
17873 alloc_info.descriptorPool = ds_pool;
17874 alloc_info.pSetLayouts = &ds_layout;
17875 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17876 ASSERT_VK_SUCCESS(err);
17877
17878 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
17879 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
17880 pipeline_layout_ci.pNext = NULL;
17881 pipeline_layout_ci.setLayoutCount = 1;
17882 pipeline_layout_ci.pSetLayouts = &ds_layout;
17883
17884 VkPipelineLayout pipeline_layout;
17885 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
17886 ASSERT_VK_SUCCESS(err);
17887
17888 // Create two buffers to update the descriptors with
17889 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
17890 uint32_t qfi = 0;
17891 VkBufferCreateInfo buffCI = {};
17892 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17893 buffCI.size = 2048;
17894 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
17895 buffCI.queueFamilyIndexCount = 1;
17896 buffCI.pQueueFamilyIndices = &qfi;
17897
17898 VkBuffer dyub1;
17899 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
17900 ASSERT_VK_SUCCESS(err);
17901 // buffer2
17902 buffCI.size = 1024;
17903 VkBuffer dyub2;
17904 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
17905 ASSERT_VK_SUCCESS(err);
17906 // Allocate memory and bind to buffers
17907 VkMemoryAllocateInfo mem_alloc[2] = {};
17908 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17909 mem_alloc[0].pNext = NULL;
17910 mem_alloc[0].memoryTypeIndex = 0;
17911 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17912 mem_alloc[1].pNext = NULL;
17913 mem_alloc[1].memoryTypeIndex = 0;
17914
17915 VkMemoryRequirements mem_reqs1;
17916 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
17917 VkMemoryRequirements mem_reqs2;
17918 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
17919 mem_alloc[0].allocationSize = mem_reqs1.size;
17920 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
17921 mem_alloc[1].allocationSize = mem_reqs2.size;
17922 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
17923 if (!pass) {
17924 vkDestroyBuffer(m_device->device(), dyub1, NULL);
17925 vkDestroyBuffer(m_device->device(), dyub2, NULL);
17926 return;
17927 }
17928
17929 VkDeviceMemory mem1;
17930 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
17931 ASSERT_VK_SUCCESS(err);
17932 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
17933 ASSERT_VK_SUCCESS(err);
17934 VkDeviceMemory mem2;
17935 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
17936 ASSERT_VK_SUCCESS(err);
17937 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
17938 ASSERT_VK_SUCCESS(err);
17939 // Update descriptors
17940 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
17941 buff_info[0].buffer = dyub1;
17942 buff_info[0].offset = 0;
17943 buff_info[0].range = 256;
17944 buff_info[1].buffer = dyub1;
17945 buff_info[1].offset = 256;
17946 buff_info[1].range = 512;
17947 buff_info[2].buffer = dyub2;
17948 buff_info[2].offset = 0;
17949 buff_info[2].range = 512;
17950
17951 VkWriteDescriptorSet descriptor_write;
17952 memset(&descriptor_write, 0, sizeof(descriptor_write));
17953 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17954 descriptor_write.dstSet = descriptor_set;
17955 descriptor_write.dstBinding = 0;
17956 descriptor_write.descriptorCount = BINDING_COUNT;
17957 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17958 descriptor_write.pBufferInfo = buff_info;
17959
17960 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17961
Tony Barbour552f6c02016-12-21 14:34:07 -070017962 m_commandBuffer->BeginCommandBuffer();
17963 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070017964
17965 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017966 char const *vsSource =
17967 "#version 450\n"
17968 "\n"
17969 "out gl_PerVertex { \n"
17970 " vec4 gl_Position;\n"
17971 "};\n"
17972 "void main(){\n"
17973 " gl_Position = vec4(1);\n"
17974 "}\n";
17975 char const *fsSource =
17976 "#version 450\n"
17977 "\n"
17978 "layout(location=0) out vec4 x;\n"
17979 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
17980 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
17981 "void main(){\n"
17982 " x = vec4(bar1.y) + vec4(bar2.y);\n"
17983 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070017984 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
17985 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
17986 VkPipelineObj pipe(m_device);
17987 pipe.SetViewport(m_viewports);
17988 pipe.SetScissor(m_scissors);
17989 pipe.AddShader(&vs);
17990 pipe.AddShader(&fs);
17991 pipe.AddColorAttachment();
17992 pipe.CreateVKPipeline(pipeline_layout, renderPass());
17993
17994 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
17995 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
17996 // we used to have a bug in this case.
17997 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
17998 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
17999 &descriptor_set, BINDING_COUNT, dyn_off);
18000 Draw(1, 0, 0, 0);
18001 m_errorMonitor->VerifyNotFound();
18002
18003 vkDestroyBuffer(m_device->device(), dyub1, NULL);
18004 vkDestroyBuffer(m_device->device(), dyub2, NULL);
18005 vkFreeMemory(m_device->device(), mem1, NULL);
18006 vkFreeMemory(m_device->device(), mem2, NULL);
18007
18008 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
18009 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18010 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18011}
18012
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018013TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018014 TEST_DESCRIPTION(
18015 "Ensure that validations handling of non-coherent memory "
18016 "mapping while using VK_WHOLE_SIZE does not cause access "
18017 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018018 VkResult err;
18019 uint8_t *pData;
18020 ASSERT_NO_FATAL_FAILURE(InitState());
18021
18022 VkDeviceMemory mem;
18023 VkMemoryRequirements mem_reqs;
18024 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018025 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018026 VkMemoryAllocateInfo alloc_info = {};
18027 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18028 alloc_info.pNext = NULL;
18029 alloc_info.memoryTypeIndex = 0;
18030
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018031 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018032 alloc_info.allocationSize = allocation_size;
18033
18034 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
18035 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 -070018036 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018037 if (!pass) {
18038 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018039 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
18040 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018041 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018042 pass = m_device->phy().set_memory_type(
18043 mem_reqs.memoryTypeBits, &alloc_info,
18044 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
18045 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018046 if (!pass) {
18047 return;
18048 }
18049 }
18050 }
18051
18052 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
18053 ASSERT_VK_SUCCESS(err);
18054
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018055 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018056 m_errorMonitor->ExpectSuccess();
18057 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
18058 ASSERT_VK_SUCCESS(err);
18059 VkMappedMemoryRange mmr = {};
18060 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
18061 mmr.memory = mem;
18062 mmr.offset = 0;
18063 mmr.size = VK_WHOLE_SIZE;
18064 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18065 ASSERT_VK_SUCCESS(err);
18066 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
18067 ASSERT_VK_SUCCESS(err);
18068 m_errorMonitor->VerifyNotFound();
18069 vkUnmapMemory(m_device->device(), mem);
18070
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018071 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018072 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018073 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018074 ASSERT_VK_SUCCESS(err);
18075 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
18076 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018077 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018078 mmr.size = VK_WHOLE_SIZE;
18079 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18080 ASSERT_VK_SUCCESS(err);
18081 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
18082 ASSERT_VK_SUCCESS(err);
18083 m_errorMonitor->VerifyNotFound();
18084 vkUnmapMemory(m_device->device(), mem);
18085
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018086 // Map with offset and size
18087 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018088 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018089 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018090 ASSERT_VK_SUCCESS(err);
18091 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
18092 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018093 mmr.offset = 4 * atom_size;
18094 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018095 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18096 ASSERT_VK_SUCCESS(err);
18097 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
18098 ASSERT_VK_SUCCESS(err);
18099 m_errorMonitor->VerifyNotFound();
18100 vkUnmapMemory(m_device->device(), mem);
18101
18102 // Map without offset and flush WHOLE_SIZE with two separate offsets
18103 m_errorMonitor->ExpectSuccess();
18104 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
18105 ASSERT_VK_SUCCESS(err);
18106 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
18107 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018108 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018109 mmr.size = VK_WHOLE_SIZE;
18110 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18111 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018112 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018113 mmr.size = VK_WHOLE_SIZE;
18114 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18115 ASSERT_VK_SUCCESS(err);
18116 m_errorMonitor->VerifyNotFound();
18117 vkUnmapMemory(m_device->device(), mem);
18118
18119 vkFreeMemory(m_device->device(), mem, NULL);
18120}
18121
18122// This is a positive test. We used to expect error in this case but spec now allows it
18123TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
18124 m_errorMonitor->ExpectSuccess();
18125 vk_testing::Fence testFence;
18126 VkFenceCreateInfo fenceInfo = {};
18127 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18128 fenceInfo.pNext = NULL;
18129
18130 ASSERT_NO_FATAL_FAILURE(InitState());
18131 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018132 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018133 VkResult result = vkResetFences(m_device->device(), 1, fences);
18134 ASSERT_VK_SUCCESS(result);
18135
18136 m_errorMonitor->VerifyNotFound();
18137}
18138
18139TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
18140 m_errorMonitor->ExpectSuccess();
18141
18142 ASSERT_NO_FATAL_FAILURE(InitState());
18143 VkResult err;
18144
18145 // Record (empty!) command buffer that can be submitted multiple times
18146 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018147 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
18148 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018149 m_commandBuffer->BeginCommandBuffer(&cbbi);
18150 m_commandBuffer->EndCommandBuffer();
18151
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018152 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018153 VkFence fence;
18154 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
18155 ASSERT_VK_SUCCESS(err);
18156
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018157 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018158 VkSemaphore s1, s2;
18159 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
18160 ASSERT_VK_SUCCESS(err);
18161 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
18162 ASSERT_VK_SUCCESS(err);
18163
18164 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018165 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018166 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
18167 ASSERT_VK_SUCCESS(err);
18168
18169 // Submit CB again, signaling s2.
18170 si.pSignalSemaphores = &s2;
18171 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
18172 ASSERT_VK_SUCCESS(err);
18173
18174 // Wait for fence.
18175 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18176 ASSERT_VK_SUCCESS(err);
18177
18178 // CB is still in flight from second submission, but semaphore s1 is no
18179 // longer in flight. delete it.
18180 vkDestroySemaphore(m_device->device(), s1, nullptr);
18181
18182 m_errorMonitor->VerifyNotFound();
18183
18184 // Force device idle and clean up remaining objects
18185 vkDeviceWaitIdle(m_device->device());
18186 vkDestroySemaphore(m_device->device(), s2, nullptr);
18187 vkDestroyFence(m_device->device(), fence, nullptr);
18188}
18189
18190TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
18191 m_errorMonitor->ExpectSuccess();
18192
18193 ASSERT_NO_FATAL_FAILURE(InitState());
18194 VkResult err;
18195
18196 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018197 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018198 VkFence f1;
18199 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
18200 ASSERT_VK_SUCCESS(err);
18201
18202 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018203 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018204 VkFence f2;
18205 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
18206 ASSERT_VK_SUCCESS(err);
18207
18208 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018209 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018210 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
18211
18212 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018213 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018214 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
18215
18216 // Should have both retired!
18217 vkDestroyFence(m_device->device(), f1, nullptr);
18218 vkDestroyFence(m_device->device(), f2, nullptr);
18219
18220 m_errorMonitor->VerifyNotFound();
18221}
18222
18223TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018224 TEST_DESCRIPTION(
18225 "Verify that creating an image view from an image with valid usage "
18226 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018227
18228 ASSERT_NO_FATAL_FAILURE(InitState());
18229
18230 m_errorMonitor->ExpectSuccess();
18231 // Verify that we can create a view with usage INPUT_ATTACHMENT
18232 VkImageObj image(m_device);
18233 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
18234 ASSERT_TRUE(image.initialized());
18235 VkImageView imageView;
18236 VkImageViewCreateInfo ivci = {};
18237 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18238 ivci.image = image.handle();
18239 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
18240 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
18241 ivci.subresourceRange.layerCount = 1;
18242 ivci.subresourceRange.baseMipLevel = 0;
18243 ivci.subresourceRange.levelCount = 1;
18244 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18245
18246 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
18247 m_errorMonitor->VerifyNotFound();
18248 vkDestroyImageView(m_device->device(), imageView, NULL);
18249}
18250
18251// This is a positive test. No failures are expected.
18252TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018253 TEST_DESCRIPTION(
18254 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
18255 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018256
18257 ASSERT_NO_FATAL_FAILURE(InitState());
18258
18259 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018260 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018261
18262 m_errorMonitor->ExpectSuccess();
18263
18264 VkImage image;
18265 VkImageCreateInfo image_create_info = {};
18266 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18267 image_create_info.pNext = NULL;
18268 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18269 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18270 image_create_info.extent.width = 64;
18271 image_create_info.extent.height = 64;
18272 image_create_info.extent.depth = 1;
18273 image_create_info.mipLevels = 1;
18274 image_create_info.arrayLayers = 1;
18275 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18276 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18277 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
18278 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
18279 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18280 ASSERT_VK_SUCCESS(err);
18281
18282 VkMemoryRequirements memory_reqs;
18283 VkDeviceMemory memory_one, memory_two;
18284 bool pass;
18285 VkMemoryAllocateInfo memory_info = {};
18286 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18287 memory_info.pNext = NULL;
18288 memory_info.allocationSize = 0;
18289 memory_info.memoryTypeIndex = 0;
18290 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18291 // Find an image big enough to allow sparse mapping of 2 memory regions
18292 // Increase the image size until it is at least twice the
18293 // size of the required alignment, to ensure we can bind both
18294 // allocated memory blocks to the image on aligned offsets.
18295 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
18296 vkDestroyImage(m_device->device(), image, nullptr);
18297 image_create_info.extent.width *= 2;
18298 image_create_info.extent.height *= 2;
18299 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
18300 ASSERT_VK_SUCCESS(err);
18301 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18302 }
18303 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
18304 // at the end of the first
18305 memory_info.allocationSize = memory_reqs.alignment;
18306 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18307 ASSERT_TRUE(pass);
18308 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
18309 ASSERT_VK_SUCCESS(err);
18310 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
18311 ASSERT_VK_SUCCESS(err);
18312 VkSparseMemoryBind binds[2];
18313 binds[0].flags = 0;
18314 binds[0].memory = memory_one;
18315 binds[0].memoryOffset = 0;
18316 binds[0].resourceOffset = 0;
18317 binds[0].size = memory_info.allocationSize;
18318 binds[1].flags = 0;
18319 binds[1].memory = memory_two;
18320 binds[1].memoryOffset = 0;
18321 binds[1].resourceOffset = memory_info.allocationSize;
18322 binds[1].size = memory_info.allocationSize;
18323
18324 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
18325 opaqueBindInfo.image = image;
18326 opaqueBindInfo.bindCount = 2;
18327 opaqueBindInfo.pBinds = binds;
18328
18329 VkFence fence = VK_NULL_HANDLE;
18330 VkBindSparseInfo bindSparseInfo = {};
18331 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
18332 bindSparseInfo.imageOpaqueBindCount = 1;
18333 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
18334
18335 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
18336 vkQueueWaitIdle(m_device->m_queue);
18337 vkDestroyImage(m_device->device(), image, NULL);
18338 vkFreeMemory(m_device->device(), memory_one, NULL);
18339 vkFreeMemory(m_device->device(), memory_two, NULL);
18340 m_errorMonitor->VerifyNotFound();
18341}
18342
18343TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018344 TEST_DESCRIPTION(
18345 "Ensure that CmdBeginRenderPass with an attachment's "
18346 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
18347 "the command buffer has prior knowledge of that "
18348 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018349
18350 m_errorMonitor->ExpectSuccess();
18351
18352 ASSERT_NO_FATAL_FAILURE(InitState());
18353
18354 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018355 VkAttachmentDescription attachment = {0,
18356 VK_FORMAT_R8G8B8A8_UNORM,
18357 VK_SAMPLE_COUNT_1_BIT,
18358 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18359 VK_ATTACHMENT_STORE_OP_STORE,
18360 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18361 VK_ATTACHMENT_STORE_OP_DONT_CARE,
18362 VK_IMAGE_LAYOUT_UNDEFINED,
18363 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018364
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018365 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018366
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018367 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018368
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018369 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018370
18371 VkRenderPass rp;
18372 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18373 ASSERT_VK_SUCCESS(err);
18374
18375 // A compatible framebuffer.
18376 VkImageObj image(m_device);
18377 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
18378 ASSERT_TRUE(image.initialized());
18379
18380 VkImageViewCreateInfo ivci = {
18381 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
18382 nullptr,
18383 0,
18384 image.handle(),
18385 VK_IMAGE_VIEW_TYPE_2D,
18386 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018387 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
18388 VK_COMPONENT_SWIZZLE_IDENTITY},
18389 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018390 };
18391 VkImageView view;
18392 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
18393 ASSERT_VK_SUCCESS(err);
18394
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018395 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018396 VkFramebuffer fb;
18397 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18398 ASSERT_VK_SUCCESS(err);
18399
18400 // Record a single command buffer which uses this renderpass twice. The
18401 // bug is triggered at the beginning of the second renderpass, when the
18402 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018403 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 -070018404 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018405 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18406 vkCmdEndRenderPass(m_commandBuffer->handle());
18407 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18408
18409 m_errorMonitor->VerifyNotFound();
18410
18411 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070018412 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018413
18414 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18415 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18416 vkDestroyImageView(m_device->device(), view, nullptr);
18417}
18418
18419TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018420 TEST_DESCRIPTION(
18421 "This test should pass. Create a Framebuffer and "
18422 "command buffer, bind them together, then destroy "
18423 "command pool and framebuffer and verify there are no "
18424 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018425
18426 m_errorMonitor->ExpectSuccess();
18427
18428 ASSERT_NO_FATAL_FAILURE(InitState());
18429
18430 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018431 VkAttachmentDescription attachment = {0,
18432 VK_FORMAT_R8G8B8A8_UNORM,
18433 VK_SAMPLE_COUNT_1_BIT,
18434 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18435 VK_ATTACHMENT_STORE_OP_STORE,
18436 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18437 VK_ATTACHMENT_STORE_OP_DONT_CARE,
18438 VK_IMAGE_LAYOUT_UNDEFINED,
18439 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018440
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018441 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018442
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018443 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018444
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018445 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018446
18447 VkRenderPass rp;
18448 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18449 ASSERT_VK_SUCCESS(err);
18450
18451 // A compatible framebuffer.
18452 VkImageObj image(m_device);
18453 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
18454 ASSERT_TRUE(image.initialized());
18455
18456 VkImageViewCreateInfo ivci = {
18457 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
18458 nullptr,
18459 0,
18460 image.handle(),
18461 VK_IMAGE_VIEW_TYPE_2D,
18462 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018463 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
18464 VK_COMPONENT_SWIZZLE_IDENTITY},
18465 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018466 };
18467 VkImageView view;
18468 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
18469 ASSERT_VK_SUCCESS(err);
18470
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018471 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018472 VkFramebuffer fb;
18473 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18474 ASSERT_VK_SUCCESS(err);
18475
18476 // Explicitly create a command buffer to bind the FB to so that we can then
18477 // destroy the command pool in order to implicitly free command buffer
18478 VkCommandPool command_pool;
18479 VkCommandPoolCreateInfo pool_create_info{};
18480 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18481 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18482 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18483 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18484
18485 VkCommandBuffer command_buffer;
18486 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18487 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18488 command_buffer_allocate_info.commandPool = command_pool;
18489 command_buffer_allocate_info.commandBufferCount = 1;
18490 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18491 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
18492
18493 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018494 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 -060018495 VkCommandBufferBeginInfo begin_info{};
18496 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18497 vkBeginCommandBuffer(command_buffer, &begin_info);
18498
18499 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18500 vkCmdEndRenderPass(command_buffer);
18501 vkEndCommandBuffer(command_buffer);
18502 vkDestroyImageView(m_device->device(), view, nullptr);
18503 // Destroy command pool to implicitly free command buffer
18504 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18505 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18506 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18507 m_errorMonitor->VerifyNotFound();
18508}
18509
18510TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018511 TEST_DESCRIPTION(
18512 "Ensure that CmdBeginRenderPass applies the layout "
18513 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018514
18515 m_errorMonitor->ExpectSuccess();
18516
18517 ASSERT_NO_FATAL_FAILURE(InitState());
18518
18519 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018520 VkAttachmentDescription attachment = {0,
18521 VK_FORMAT_R8G8B8A8_UNORM,
18522 VK_SAMPLE_COUNT_1_BIT,
18523 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18524 VK_ATTACHMENT_STORE_OP_STORE,
18525 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18526 VK_ATTACHMENT_STORE_OP_DONT_CARE,
18527 VK_IMAGE_LAYOUT_UNDEFINED,
18528 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018529
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018530 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018531
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018532 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018533
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018534 VkSubpassDependency dep = {0,
18535 0,
18536 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
18537 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
18538 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18539 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18540 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018541
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018542 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018543
18544 VkResult err;
18545 VkRenderPass rp;
18546 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18547 ASSERT_VK_SUCCESS(err);
18548
18549 // A compatible framebuffer.
18550 VkImageObj image(m_device);
18551 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
18552 ASSERT_TRUE(image.initialized());
18553
18554 VkImageViewCreateInfo ivci = {
18555 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
18556 nullptr,
18557 0,
18558 image.handle(),
18559 VK_IMAGE_VIEW_TYPE_2D,
18560 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018561 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
18562 VK_COMPONENT_SWIZZLE_IDENTITY},
18563 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018564 };
18565 VkImageView view;
18566 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
18567 ASSERT_VK_SUCCESS(err);
18568
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018569 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018570 VkFramebuffer fb;
18571 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18572 ASSERT_VK_SUCCESS(err);
18573
18574 // Record a single command buffer which issues a pipeline barrier w/
18575 // image memory barrier for the attachment. This detects the previously
18576 // missing tracking of the subpass layout by throwing a validation error
18577 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018578 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 -070018579 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018580 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18581
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018582 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
18583 nullptr,
18584 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18585 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18586 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
18587 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
18588 VK_QUEUE_FAMILY_IGNORED,
18589 VK_QUEUE_FAMILY_IGNORED,
18590 image.handle(),
18591 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018592 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018593 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
18594 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018595
18596 vkCmdEndRenderPass(m_commandBuffer->handle());
18597 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070018598 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018599
18600 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18601 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18602 vkDestroyImageView(m_device->device(), view, nullptr);
18603}
18604
18605TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018606 TEST_DESCRIPTION(
18607 "Validate that when an imageView of a depth/stencil image "
18608 "is used as a depth/stencil framebuffer attachment, the "
18609 "aspectMask is ignored and both depth and stencil image "
18610 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018611
18612 VkFormatProperties format_properties;
18613 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
18614 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
18615 return;
18616 }
18617
18618 m_errorMonitor->ExpectSuccess();
18619
18620 ASSERT_NO_FATAL_FAILURE(InitState());
18621
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018622 VkAttachmentDescription attachment = {0,
18623 VK_FORMAT_D32_SFLOAT_S8_UINT,
18624 VK_SAMPLE_COUNT_1_BIT,
18625 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18626 VK_ATTACHMENT_STORE_OP_STORE,
18627 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18628 VK_ATTACHMENT_STORE_OP_DONT_CARE,
18629 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
18630 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018631
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018632 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018633
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018634 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018635
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018636 VkSubpassDependency dep = {0,
18637 0,
18638 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
18639 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
18640 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18641 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18642 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018643
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018644 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018645
18646 VkResult err;
18647 VkRenderPass rp;
18648 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18649 ASSERT_VK_SUCCESS(err);
18650
18651 VkImageObj image(m_device);
18652 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018653 0x26, // usage
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018654 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018655 ASSERT_TRUE(image.initialized());
18656 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
18657
18658 VkImageViewCreateInfo ivci = {
18659 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
18660 nullptr,
18661 0,
18662 image.handle(),
18663 VK_IMAGE_VIEW_TYPE_2D,
18664 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018665 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
18666 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018667 };
18668 VkImageView view;
18669 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
18670 ASSERT_VK_SUCCESS(err);
18671
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018672 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018673 VkFramebuffer fb;
18674 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18675 ASSERT_VK_SUCCESS(err);
18676
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018677 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 -070018678 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018679 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18680
18681 VkImageMemoryBarrier imb = {};
18682 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18683 imb.pNext = nullptr;
18684 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
18685 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18686 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18687 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18688 imb.srcQueueFamilyIndex = 0;
18689 imb.dstQueueFamilyIndex = 0;
18690 imb.image = image.handle();
18691 imb.subresourceRange.aspectMask = 0x6;
18692 imb.subresourceRange.baseMipLevel = 0;
18693 imb.subresourceRange.levelCount = 0x1;
18694 imb.subresourceRange.baseArrayLayer = 0;
18695 imb.subresourceRange.layerCount = 0x1;
18696
18697 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018698 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
18699 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018700
18701 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070018702 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018703 QueueCommandBuffer(false);
18704 m_errorMonitor->VerifyNotFound();
18705
18706 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18707 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18708 vkDestroyImageView(m_device->device(), view, nullptr);
18709}
18710
18711TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018712 TEST_DESCRIPTION(
18713 "Ensure that layout transitions work correctly without "
18714 "errors, when an attachment reference is "
18715 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018716
18717 m_errorMonitor->ExpectSuccess();
18718
18719 ASSERT_NO_FATAL_FAILURE(InitState());
18720
18721 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018722 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018723
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018724 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018725
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018726 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018727
18728 VkRenderPass rp;
18729 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18730 ASSERT_VK_SUCCESS(err);
18731
18732 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018733 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018734 VkFramebuffer fb;
18735 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18736 ASSERT_VK_SUCCESS(err);
18737
18738 // Record a command buffer which just begins and ends the renderpass. The
18739 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018740 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 -070018741 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018742 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18743 vkCmdEndRenderPass(m_commandBuffer->handle());
18744 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070018745 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018746
18747 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18748 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18749}
18750
18751// This is a positive test. No errors are expected.
18752TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018753 TEST_DESCRIPTION(
18754 "Create a stencil-only attachment with a LOAD_OP set to "
18755 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018756 VkResult result = VK_SUCCESS;
18757 VkImageFormatProperties formatProps;
18758 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018759 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
18760 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018761 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
18762 return;
18763 }
18764
18765 ASSERT_NO_FATAL_FAILURE(InitState());
18766 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
18767 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018768 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018769 VkAttachmentDescription att = {};
18770 VkAttachmentReference ref = {};
18771 att.format = depth_stencil_fmt;
18772 att.samples = VK_SAMPLE_COUNT_1_BIT;
18773 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
18774 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
18775 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
18776 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
18777 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18778 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18779
18780 VkClearValue clear;
18781 clear.depthStencil.depth = 1.0;
18782 clear.depthStencil.stencil = 0;
18783 ref.attachment = 0;
18784 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18785
18786 VkSubpassDescription subpass = {};
18787 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
18788 subpass.flags = 0;
18789 subpass.inputAttachmentCount = 0;
18790 subpass.pInputAttachments = NULL;
18791 subpass.colorAttachmentCount = 0;
18792 subpass.pColorAttachments = NULL;
18793 subpass.pResolveAttachments = NULL;
18794 subpass.pDepthStencilAttachment = &ref;
18795 subpass.preserveAttachmentCount = 0;
18796 subpass.pPreserveAttachments = NULL;
18797
18798 VkRenderPass rp;
18799 VkRenderPassCreateInfo rp_info = {};
18800 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
18801 rp_info.attachmentCount = 1;
18802 rp_info.pAttachments = &att;
18803 rp_info.subpassCount = 1;
18804 rp_info.pSubpasses = &subpass;
18805 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
18806 ASSERT_VK_SUCCESS(result);
18807
18808 VkImageView *depthView = m_depthStencil->BindInfo();
18809 VkFramebufferCreateInfo fb_info = {};
18810 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
18811 fb_info.pNext = NULL;
18812 fb_info.renderPass = rp;
18813 fb_info.attachmentCount = 1;
18814 fb_info.pAttachments = depthView;
18815 fb_info.width = 100;
18816 fb_info.height = 100;
18817 fb_info.layers = 1;
18818 VkFramebuffer fb;
18819 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
18820 ASSERT_VK_SUCCESS(result);
18821
18822 VkRenderPassBeginInfo rpbinfo = {};
18823 rpbinfo.clearValueCount = 1;
18824 rpbinfo.pClearValues = &clear;
18825 rpbinfo.pNext = NULL;
18826 rpbinfo.renderPass = rp;
18827 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
18828 rpbinfo.renderArea.extent.width = 100;
18829 rpbinfo.renderArea.extent.height = 100;
18830 rpbinfo.renderArea.offset.x = 0;
18831 rpbinfo.renderArea.offset.y = 0;
18832 rpbinfo.framebuffer = fb;
18833
18834 VkFence fence = {};
18835 VkFenceCreateInfo fence_ci = {};
18836 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18837 fence_ci.pNext = nullptr;
18838 fence_ci.flags = 0;
18839 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
18840 ASSERT_VK_SUCCESS(result);
18841
18842 m_commandBuffer->BeginCommandBuffer();
18843 m_commandBuffer->BeginRenderPass(rpbinfo);
18844 m_commandBuffer->EndRenderPass();
18845 m_commandBuffer->EndCommandBuffer();
18846 m_commandBuffer->QueueCommandBuffer(fence);
18847
18848 VkImageObj destImage(m_device);
18849 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 -070018850 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018851 VkImageMemoryBarrier barrier = {};
18852 VkImageSubresourceRange range;
18853 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18854 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
18855 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
18856 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18857 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
18858 barrier.image = m_depthStencil->handle();
18859 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18860 range.baseMipLevel = 0;
18861 range.levelCount = 1;
18862 range.baseArrayLayer = 0;
18863 range.layerCount = 1;
18864 barrier.subresourceRange = range;
18865 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18866 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
18867 cmdbuf.BeginCommandBuffer();
18868 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 -070018869 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018870 barrier.srcAccessMask = 0;
18871 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18872 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
18873 barrier.image = destImage.handle();
18874 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
18875 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 -070018876 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018877 VkImageCopy cregion;
18878 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18879 cregion.srcSubresource.mipLevel = 0;
18880 cregion.srcSubresource.baseArrayLayer = 0;
18881 cregion.srcSubresource.layerCount = 1;
18882 cregion.srcOffset.x = 0;
18883 cregion.srcOffset.y = 0;
18884 cregion.srcOffset.z = 0;
18885 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18886 cregion.dstSubresource.mipLevel = 0;
18887 cregion.dstSubresource.baseArrayLayer = 0;
18888 cregion.dstSubresource.layerCount = 1;
18889 cregion.dstOffset.x = 0;
18890 cregion.dstOffset.y = 0;
18891 cregion.dstOffset.z = 0;
18892 cregion.extent.width = 100;
18893 cregion.extent.height = 100;
18894 cregion.extent.depth = 1;
18895 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018896 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018897 cmdbuf.EndCommandBuffer();
18898
18899 VkSubmitInfo submit_info;
18900 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18901 submit_info.pNext = NULL;
18902 submit_info.waitSemaphoreCount = 0;
18903 submit_info.pWaitSemaphores = NULL;
18904 submit_info.pWaitDstStageMask = NULL;
18905 submit_info.commandBufferCount = 1;
18906 submit_info.pCommandBuffers = &cmdbuf.handle();
18907 submit_info.signalSemaphoreCount = 0;
18908 submit_info.pSignalSemaphores = NULL;
18909
18910 m_errorMonitor->ExpectSuccess();
18911 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18912 m_errorMonitor->VerifyNotFound();
18913
18914 vkQueueWaitIdle(m_device->m_queue);
18915 vkDestroyFence(m_device->device(), fence, nullptr);
18916 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18917 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18918}
18919
18920// This is a positive test. No errors should be generated.
18921TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
18922 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
18923
18924 m_errorMonitor->ExpectSuccess();
18925 ASSERT_NO_FATAL_FAILURE(InitState());
18926
18927 VkEvent event;
18928 VkEventCreateInfo event_create_info{};
18929 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
18930 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
18931
18932 VkCommandPool command_pool;
18933 VkCommandPoolCreateInfo pool_create_info{};
18934 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18935 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18936 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18937 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18938
18939 VkCommandBuffer command_buffer;
18940 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18941 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18942 command_buffer_allocate_info.commandPool = command_pool;
18943 command_buffer_allocate_info.commandBufferCount = 1;
18944 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18945 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
18946
18947 VkQueue queue = VK_NULL_HANDLE;
18948 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
18949
18950 {
18951 VkCommandBufferBeginInfo begin_info{};
18952 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18953 vkBeginCommandBuffer(command_buffer, &begin_info);
18954
18955 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 -070018956 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018957 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
18958 vkEndCommandBuffer(command_buffer);
18959 }
18960 {
18961 VkSubmitInfo submit_info{};
18962 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18963 submit_info.commandBufferCount = 1;
18964 submit_info.pCommandBuffers = &command_buffer;
18965 submit_info.signalSemaphoreCount = 0;
18966 submit_info.pSignalSemaphores = nullptr;
18967 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18968 }
18969 { vkSetEvent(m_device->device(), event); }
18970
18971 vkQueueWaitIdle(queue);
18972
18973 vkDestroyEvent(m_device->device(), event, nullptr);
18974 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
18975 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18976
18977 m_errorMonitor->VerifyNotFound();
18978}
18979// This is a positive test. No errors should be generated.
18980TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
18981 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
18982
18983 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018984 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018985
18986 m_errorMonitor->ExpectSuccess();
18987
18988 VkQueryPool query_pool;
18989 VkQueryPoolCreateInfo query_pool_create_info{};
18990 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
18991 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
18992 query_pool_create_info.queryCount = 1;
18993 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
18994
18995 VkCommandPool command_pool;
18996 VkCommandPoolCreateInfo pool_create_info{};
18997 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18998 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18999 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19000 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19001
19002 VkCommandBuffer command_buffer;
19003 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19004 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19005 command_buffer_allocate_info.commandPool = command_pool;
19006 command_buffer_allocate_info.commandBufferCount = 1;
19007 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19008 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
19009
19010 VkCommandBuffer secondary_command_buffer;
19011 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19012 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
19013
19014 VkQueue queue = VK_NULL_HANDLE;
19015 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19016
19017 uint32_t qfi = 0;
19018 VkBufferCreateInfo buff_create_info = {};
19019 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19020 buff_create_info.size = 1024;
19021 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
19022 buff_create_info.queueFamilyIndexCount = 1;
19023 buff_create_info.pQueueFamilyIndices = &qfi;
19024
19025 VkResult err;
19026 VkBuffer buffer;
19027 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
19028 ASSERT_VK_SUCCESS(err);
19029 VkMemoryAllocateInfo mem_alloc = {};
19030 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19031 mem_alloc.pNext = NULL;
19032 mem_alloc.allocationSize = 1024;
19033 mem_alloc.memoryTypeIndex = 0;
19034
19035 VkMemoryRequirements memReqs;
19036 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
19037 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
19038 if (!pass) {
19039 vkDestroyBuffer(m_device->device(), buffer, NULL);
19040 return;
19041 }
19042
19043 VkDeviceMemory mem;
19044 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19045 ASSERT_VK_SUCCESS(err);
19046 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19047 ASSERT_VK_SUCCESS(err);
19048
19049 VkCommandBufferInheritanceInfo hinfo = {};
19050 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
19051 hinfo.renderPass = VK_NULL_HANDLE;
19052 hinfo.subpass = 0;
19053 hinfo.framebuffer = VK_NULL_HANDLE;
19054 hinfo.occlusionQueryEnable = VK_FALSE;
19055 hinfo.queryFlags = 0;
19056 hinfo.pipelineStatistics = 0;
19057
19058 {
19059 VkCommandBufferBeginInfo begin_info{};
19060 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19061 begin_info.pInheritanceInfo = &hinfo;
19062 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
19063
19064 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
19065 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
19066
19067 vkEndCommandBuffer(secondary_command_buffer);
19068
19069 begin_info.pInheritanceInfo = nullptr;
19070 vkBeginCommandBuffer(command_buffer, &begin_info);
19071
19072 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
19073 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
19074
19075 vkEndCommandBuffer(command_buffer);
19076 }
19077 {
19078 VkSubmitInfo submit_info{};
19079 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19080 submit_info.commandBufferCount = 1;
19081 submit_info.pCommandBuffers = &command_buffer;
19082 submit_info.signalSemaphoreCount = 0;
19083 submit_info.pSignalSemaphores = nullptr;
19084 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19085 }
19086
19087 vkQueueWaitIdle(queue);
19088
19089 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
19090 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
19091 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
19092 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19093 vkDestroyBuffer(m_device->device(), buffer, NULL);
19094 vkFreeMemory(m_device->device(), mem, NULL);
19095
19096 m_errorMonitor->VerifyNotFound();
19097}
19098
19099// This is a positive test. No errors should be generated.
19100TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
19101 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
19102
19103 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019104 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019105
19106 m_errorMonitor->ExpectSuccess();
19107
19108 VkQueryPool query_pool;
19109 VkQueryPoolCreateInfo query_pool_create_info{};
19110 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
19111 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
19112 query_pool_create_info.queryCount = 1;
19113 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
19114
19115 VkCommandPool command_pool;
19116 VkCommandPoolCreateInfo pool_create_info{};
19117 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19118 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19119 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19120 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19121
19122 VkCommandBuffer command_buffer[2];
19123 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19124 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19125 command_buffer_allocate_info.commandPool = command_pool;
19126 command_buffer_allocate_info.commandBufferCount = 2;
19127 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19128 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19129
19130 VkQueue queue = VK_NULL_HANDLE;
19131 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19132
19133 uint32_t qfi = 0;
19134 VkBufferCreateInfo buff_create_info = {};
19135 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19136 buff_create_info.size = 1024;
19137 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
19138 buff_create_info.queueFamilyIndexCount = 1;
19139 buff_create_info.pQueueFamilyIndices = &qfi;
19140
19141 VkResult err;
19142 VkBuffer buffer;
19143 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
19144 ASSERT_VK_SUCCESS(err);
19145 VkMemoryAllocateInfo mem_alloc = {};
19146 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19147 mem_alloc.pNext = NULL;
19148 mem_alloc.allocationSize = 1024;
19149 mem_alloc.memoryTypeIndex = 0;
19150
19151 VkMemoryRequirements memReqs;
19152 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
19153 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
19154 if (!pass) {
19155 vkDestroyBuffer(m_device->device(), buffer, NULL);
19156 return;
19157 }
19158
19159 VkDeviceMemory mem;
19160 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19161 ASSERT_VK_SUCCESS(err);
19162 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19163 ASSERT_VK_SUCCESS(err);
19164
19165 {
19166 VkCommandBufferBeginInfo begin_info{};
19167 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19168 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19169
19170 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
19171 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
19172
19173 vkEndCommandBuffer(command_buffer[0]);
19174
19175 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19176
19177 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
19178
19179 vkEndCommandBuffer(command_buffer[1]);
19180 }
19181 {
19182 VkSubmitInfo submit_info{};
19183 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19184 submit_info.commandBufferCount = 2;
19185 submit_info.pCommandBuffers = command_buffer;
19186 submit_info.signalSemaphoreCount = 0;
19187 submit_info.pSignalSemaphores = nullptr;
19188 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19189 }
19190
19191 vkQueueWaitIdle(queue);
19192
19193 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
19194 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
19195 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19196 vkDestroyBuffer(m_device->device(), buffer, NULL);
19197 vkFreeMemory(m_device->device(), mem, NULL);
19198
19199 m_errorMonitor->VerifyNotFound();
19200}
19201
Tony Barbourc46924f2016-11-04 11:49:52 -060019202TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019203 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
19204
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019205 ASSERT_NO_FATAL_FAILURE(InitState());
19206 VkEvent event;
19207 VkEventCreateInfo event_create_info{};
19208 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
19209 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
19210
19211 VkCommandPool command_pool;
19212 VkCommandPoolCreateInfo pool_create_info{};
19213 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19214 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19215 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19216 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19217
19218 VkCommandBuffer command_buffer;
19219 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19220 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19221 command_buffer_allocate_info.commandPool = command_pool;
19222 command_buffer_allocate_info.commandBufferCount = 1;
19223 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19224 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
19225
19226 VkQueue queue = VK_NULL_HANDLE;
19227 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
19228
19229 {
19230 VkCommandBufferBeginInfo begin_info{};
19231 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19232 vkBeginCommandBuffer(command_buffer, &begin_info);
19233
19234 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019235 vkEndCommandBuffer(command_buffer);
19236 }
19237 {
19238 VkSubmitInfo submit_info{};
19239 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19240 submit_info.commandBufferCount = 1;
19241 submit_info.pCommandBuffers = &command_buffer;
19242 submit_info.signalSemaphoreCount = 0;
19243 submit_info.pSignalSemaphores = nullptr;
19244 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19245 }
19246 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19248 "that is already in use by a "
19249 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019250 vkSetEvent(m_device->device(), event);
19251 m_errorMonitor->VerifyFound();
19252 }
19253
19254 vkQueueWaitIdle(queue);
19255
19256 vkDestroyEvent(m_device->device(), event, nullptr);
19257 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
19258 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19259}
19260
19261// This is a positive test. No errors should be generated.
19262TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019263 TEST_DESCRIPTION(
19264 "Two command buffers with two separate fences are each "
19265 "run through a Submit & WaitForFences cycle 3 times. This "
19266 "previously revealed a bug so running this positive test "
19267 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019268 m_errorMonitor->ExpectSuccess();
19269
19270 ASSERT_NO_FATAL_FAILURE(InitState());
19271 VkQueue queue = VK_NULL_HANDLE;
19272 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
19273
19274 static const uint32_t NUM_OBJECTS = 2;
19275 static const uint32_t NUM_FRAMES = 3;
19276 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
19277 VkFence fences[NUM_OBJECTS] = {};
19278
19279 VkCommandPool cmd_pool;
19280 VkCommandPoolCreateInfo cmd_pool_ci = {};
19281 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19282 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
19283 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19284 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
19285 ASSERT_VK_SUCCESS(err);
19286
19287 VkCommandBufferAllocateInfo cmd_buf_info = {};
19288 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19289 cmd_buf_info.commandPool = cmd_pool;
19290 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19291 cmd_buf_info.commandBufferCount = 1;
19292
19293 VkFenceCreateInfo fence_ci = {};
19294 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19295 fence_ci.pNext = nullptr;
19296 fence_ci.flags = 0;
19297
19298 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
19299 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
19300 ASSERT_VK_SUCCESS(err);
19301 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
19302 ASSERT_VK_SUCCESS(err);
19303 }
19304
19305 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
19306 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
19307 // Create empty cmd buffer
19308 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
19309 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19310
19311 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
19312 ASSERT_VK_SUCCESS(err);
19313 err = vkEndCommandBuffer(cmd_buffers[obj]);
19314 ASSERT_VK_SUCCESS(err);
19315
19316 VkSubmitInfo submit_info = {};
19317 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19318 submit_info.commandBufferCount = 1;
19319 submit_info.pCommandBuffers = &cmd_buffers[obj];
19320 // Submit cmd buffer and wait for fence
19321 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
19322 ASSERT_VK_SUCCESS(err);
19323 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
19324 ASSERT_VK_SUCCESS(err);
19325 err = vkResetFences(m_device->device(), 1, &fences[obj]);
19326 ASSERT_VK_SUCCESS(err);
19327 }
19328 }
19329 m_errorMonitor->VerifyNotFound();
19330 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
19331 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
19332 vkDestroyFence(m_device->device(), fences[i], nullptr);
19333 }
19334}
19335// This is a positive test. No errors should be generated.
19336TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019337 TEST_DESCRIPTION(
19338 "Two command buffers, each in a separate QueueSubmit call "
19339 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019340
19341 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019342 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019343
19344 m_errorMonitor->ExpectSuccess();
19345
19346 VkSemaphore semaphore;
19347 VkSemaphoreCreateInfo semaphore_create_info{};
19348 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19349 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19350
19351 VkCommandPool command_pool;
19352 VkCommandPoolCreateInfo pool_create_info{};
19353 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19354 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19355 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19356 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19357
19358 VkCommandBuffer command_buffer[2];
19359 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19360 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19361 command_buffer_allocate_info.commandPool = command_pool;
19362 command_buffer_allocate_info.commandBufferCount = 2;
19363 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19364 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19365
19366 VkQueue queue = VK_NULL_HANDLE;
19367 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19368
19369 {
19370 VkCommandBufferBeginInfo begin_info{};
19371 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19372 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19373
19374 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 -070019375 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019376
19377 VkViewport viewport{};
19378 viewport.maxDepth = 1.0f;
19379 viewport.minDepth = 0.0f;
19380 viewport.width = 512;
19381 viewport.height = 512;
19382 viewport.x = 0;
19383 viewport.y = 0;
19384 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19385 vkEndCommandBuffer(command_buffer[0]);
19386 }
19387 {
19388 VkCommandBufferBeginInfo begin_info{};
19389 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19390 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19391
19392 VkViewport viewport{};
19393 viewport.maxDepth = 1.0f;
19394 viewport.minDepth = 0.0f;
19395 viewport.width = 512;
19396 viewport.height = 512;
19397 viewport.x = 0;
19398 viewport.y = 0;
19399 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19400 vkEndCommandBuffer(command_buffer[1]);
19401 }
19402 {
19403 VkSubmitInfo submit_info{};
19404 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19405 submit_info.commandBufferCount = 1;
19406 submit_info.pCommandBuffers = &command_buffer[0];
19407 submit_info.signalSemaphoreCount = 1;
19408 submit_info.pSignalSemaphores = &semaphore;
19409 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19410 }
19411 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019412 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019413 VkSubmitInfo submit_info{};
19414 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19415 submit_info.commandBufferCount = 1;
19416 submit_info.pCommandBuffers = &command_buffer[1];
19417 submit_info.waitSemaphoreCount = 1;
19418 submit_info.pWaitSemaphores = &semaphore;
19419 submit_info.pWaitDstStageMask = flags;
19420 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19421 }
19422
19423 vkQueueWaitIdle(m_device->m_queue);
19424
19425 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19426 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19427 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19428
19429 m_errorMonitor->VerifyNotFound();
19430}
19431
19432// This is a positive test. No errors should be generated.
19433TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019434 TEST_DESCRIPTION(
19435 "Two command buffers, each in a separate QueueSubmit call "
19436 "submitted on separate queues, the second having a fence"
19437 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019438
19439 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019440 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019441
19442 m_errorMonitor->ExpectSuccess();
19443
19444 VkFence fence;
19445 VkFenceCreateInfo fence_create_info{};
19446 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19447 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19448
19449 VkSemaphore semaphore;
19450 VkSemaphoreCreateInfo semaphore_create_info{};
19451 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19452 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19453
19454 VkCommandPool command_pool;
19455 VkCommandPoolCreateInfo pool_create_info{};
19456 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19457 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19458 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19459 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19460
19461 VkCommandBuffer command_buffer[2];
19462 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19463 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19464 command_buffer_allocate_info.commandPool = command_pool;
19465 command_buffer_allocate_info.commandBufferCount = 2;
19466 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19467 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19468
19469 VkQueue queue = VK_NULL_HANDLE;
19470 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19471
19472 {
19473 VkCommandBufferBeginInfo begin_info{};
19474 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19475 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19476
19477 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 -070019478 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019479
19480 VkViewport viewport{};
19481 viewport.maxDepth = 1.0f;
19482 viewport.minDepth = 0.0f;
19483 viewport.width = 512;
19484 viewport.height = 512;
19485 viewport.x = 0;
19486 viewport.y = 0;
19487 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19488 vkEndCommandBuffer(command_buffer[0]);
19489 }
19490 {
19491 VkCommandBufferBeginInfo begin_info{};
19492 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19493 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19494
19495 VkViewport viewport{};
19496 viewport.maxDepth = 1.0f;
19497 viewport.minDepth = 0.0f;
19498 viewport.width = 512;
19499 viewport.height = 512;
19500 viewport.x = 0;
19501 viewport.y = 0;
19502 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19503 vkEndCommandBuffer(command_buffer[1]);
19504 }
19505 {
19506 VkSubmitInfo submit_info{};
19507 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19508 submit_info.commandBufferCount = 1;
19509 submit_info.pCommandBuffers = &command_buffer[0];
19510 submit_info.signalSemaphoreCount = 1;
19511 submit_info.pSignalSemaphores = &semaphore;
19512 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19513 }
19514 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019515 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019516 VkSubmitInfo submit_info{};
19517 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19518 submit_info.commandBufferCount = 1;
19519 submit_info.pCommandBuffers = &command_buffer[1];
19520 submit_info.waitSemaphoreCount = 1;
19521 submit_info.pWaitSemaphores = &semaphore;
19522 submit_info.pWaitDstStageMask = flags;
19523 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19524 }
19525
19526 vkQueueWaitIdle(m_device->m_queue);
19527
19528 vkDestroyFence(m_device->device(), fence, nullptr);
19529 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19530 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19531 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19532
19533 m_errorMonitor->VerifyNotFound();
19534}
19535
19536// This is a positive test. No errors should be generated.
19537TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019538 TEST_DESCRIPTION(
19539 "Two command buffers, each in a separate QueueSubmit call "
19540 "submitted on separate queues, the second having a fence"
19541 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019542
19543 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019544 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019545
19546 m_errorMonitor->ExpectSuccess();
19547
19548 VkFence fence;
19549 VkFenceCreateInfo fence_create_info{};
19550 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19551 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19552
19553 VkSemaphore semaphore;
19554 VkSemaphoreCreateInfo semaphore_create_info{};
19555 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19556 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19557
19558 VkCommandPool command_pool;
19559 VkCommandPoolCreateInfo pool_create_info{};
19560 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19561 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19562 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19563 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19564
19565 VkCommandBuffer command_buffer[2];
19566 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19567 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19568 command_buffer_allocate_info.commandPool = command_pool;
19569 command_buffer_allocate_info.commandBufferCount = 2;
19570 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19571 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19572
19573 VkQueue queue = VK_NULL_HANDLE;
19574 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19575
19576 {
19577 VkCommandBufferBeginInfo begin_info{};
19578 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19579 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19580
19581 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 -070019582 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019583
19584 VkViewport viewport{};
19585 viewport.maxDepth = 1.0f;
19586 viewport.minDepth = 0.0f;
19587 viewport.width = 512;
19588 viewport.height = 512;
19589 viewport.x = 0;
19590 viewport.y = 0;
19591 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19592 vkEndCommandBuffer(command_buffer[0]);
19593 }
19594 {
19595 VkCommandBufferBeginInfo begin_info{};
19596 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19597 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19598
19599 VkViewport viewport{};
19600 viewport.maxDepth = 1.0f;
19601 viewport.minDepth = 0.0f;
19602 viewport.width = 512;
19603 viewport.height = 512;
19604 viewport.x = 0;
19605 viewport.y = 0;
19606 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19607 vkEndCommandBuffer(command_buffer[1]);
19608 }
19609 {
19610 VkSubmitInfo submit_info{};
19611 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19612 submit_info.commandBufferCount = 1;
19613 submit_info.pCommandBuffers = &command_buffer[0];
19614 submit_info.signalSemaphoreCount = 1;
19615 submit_info.pSignalSemaphores = &semaphore;
19616 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19617 }
19618 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019619 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019620 VkSubmitInfo submit_info{};
19621 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19622 submit_info.commandBufferCount = 1;
19623 submit_info.pCommandBuffers = &command_buffer[1];
19624 submit_info.waitSemaphoreCount = 1;
19625 submit_info.pWaitSemaphores = &semaphore;
19626 submit_info.pWaitDstStageMask = flags;
19627 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19628 }
19629
19630 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19631 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19632
19633 vkDestroyFence(m_device->device(), fence, nullptr);
19634 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19635 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19636 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19637
19638 m_errorMonitor->VerifyNotFound();
19639}
19640
19641TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019642 ASSERT_NO_FATAL_FAILURE(InitState());
19643 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
19644 printf("Test requires two queues, skipping\n");
19645 return;
19646 }
19647
19648 VkResult err;
19649
19650 m_errorMonitor->ExpectSuccess();
19651
19652 VkQueue q0 = m_device->m_queue;
19653 VkQueue q1 = nullptr;
19654 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
19655 ASSERT_NE(q1, nullptr);
19656
19657 // An (empty) command buffer. We must have work in the first submission --
19658 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019659 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019660 VkCommandPool pool;
19661 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
19662 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019663 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
19664 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019665 VkCommandBuffer cb;
19666 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
19667 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019668 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019669 err = vkBeginCommandBuffer(cb, &cbbi);
19670 ASSERT_VK_SUCCESS(err);
19671 err = vkEndCommandBuffer(cb);
19672 ASSERT_VK_SUCCESS(err);
19673
19674 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019675 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019676 VkSemaphore s;
19677 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
19678 ASSERT_VK_SUCCESS(err);
19679
19680 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019681 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019682
19683 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
19684 ASSERT_VK_SUCCESS(err);
19685
19686 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019687 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019688 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019689
19690 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
19691 ASSERT_VK_SUCCESS(err);
19692
19693 // Wait for q0 idle
19694 err = vkQueueWaitIdle(q0);
19695 ASSERT_VK_SUCCESS(err);
19696
19697 // Command buffer should have been completed (it was on q0); reset the pool.
19698 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
19699
19700 m_errorMonitor->VerifyNotFound();
19701
19702 // Force device completely idle and clean up resources
19703 vkDeviceWaitIdle(m_device->device());
19704 vkDestroyCommandPool(m_device->device(), pool, nullptr);
19705 vkDestroySemaphore(m_device->device(), s, nullptr);
19706}
19707
19708// This is a positive test. No errors should be generated.
19709TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019710 TEST_DESCRIPTION(
19711 "Two command buffers, each in a separate QueueSubmit call "
19712 "submitted on separate queues, the second having a fence, "
19713 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019714
19715 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019716 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019717
19718 m_errorMonitor->ExpectSuccess();
19719
19720 ASSERT_NO_FATAL_FAILURE(InitState());
19721 VkFence fence;
19722 VkFenceCreateInfo fence_create_info{};
19723 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19724 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19725
19726 VkSemaphore semaphore;
19727 VkSemaphoreCreateInfo semaphore_create_info{};
19728 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19729 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19730
19731 VkCommandPool command_pool;
19732 VkCommandPoolCreateInfo pool_create_info{};
19733 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19734 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19735 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19736 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19737
19738 VkCommandBuffer command_buffer[2];
19739 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19740 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19741 command_buffer_allocate_info.commandPool = command_pool;
19742 command_buffer_allocate_info.commandBufferCount = 2;
19743 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19744 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19745
19746 VkQueue queue = VK_NULL_HANDLE;
19747 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19748
19749 {
19750 VkCommandBufferBeginInfo begin_info{};
19751 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19752 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19753
19754 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019755 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019756
19757 VkViewport viewport{};
19758 viewport.maxDepth = 1.0f;
19759 viewport.minDepth = 0.0f;
19760 viewport.width = 512;
19761 viewport.height = 512;
19762 viewport.x = 0;
19763 viewport.y = 0;
19764 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19765 vkEndCommandBuffer(command_buffer[0]);
19766 }
19767 {
19768 VkCommandBufferBeginInfo begin_info{};
19769 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19770 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19771
19772 VkViewport viewport{};
19773 viewport.maxDepth = 1.0f;
19774 viewport.minDepth = 0.0f;
19775 viewport.width = 512;
19776 viewport.height = 512;
19777 viewport.x = 0;
19778 viewport.y = 0;
19779 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19780 vkEndCommandBuffer(command_buffer[1]);
19781 }
19782 {
19783 VkSubmitInfo submit_info{};
19784 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19785 submit_info.commandBufferCount = 1;
19786 submit_info.pCommandBuffers = &command_buffer[0];
19787 submit_info.signalSemaphoreCount = 1;
19788 submit_info.pSignalSemaphores = &semaphore;
19789 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19790 }
19791 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019792 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019793 VkSubmitInfo submit_info{};
19794 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19795 submit_info.commandBufferCount = 1;
19796 submit_info.pCommandBuffers = &command_buffer[1];
19797 submit_info.waitSemaphoreCount = 1;
19798 submit_info.pWaitSemaphores = &semaphore;
19799 submit_info.pWaitDstStageMask = flags;
19800 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19801 }
19802
19803 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19804
19805 vkDestroyFence(m_device->device(), fence, nullptr);
19806 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19807 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19808 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19809
19810 m_errorMonitor->VerifyNotFound();
19811}
19812
19813// This is a positive test. No errors should be generated.
19814TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019815 TEST_DESCRIPTION(
19816 "Two command buffers, each in a separate QueueSubmit call "
19817 "on the same queue, sharing a signal/wait semaphore, the "
19818 "second having a fence, "
19819 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019820
19821 m_errorMonitor->ExpectSuccess();
19822
19823 ASSERT_NO_FATAL_FAILURE(InitState());
19824 VkFence fence;
19825 VkFenceCreateInfo fence_create_info{};
19826 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19827 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19828
19829 VkSemaphore semaphore;
19830 VkSemaphoreCreateInfo semaphore_create_info{};
19831 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19832 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19833
19834 VkCommandPool command_pool;
19835 VkCommandPoolCreateInfo pool_create_info{};
19836 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19837 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19838 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19839 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19840
19841 VkCommandBuffer command_buffer[2];
19842 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19843 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19844 command_buffer_allocate_info.commandPool = command_pool;
19845 command_buffer_allocate_info.commandBufferCount = 2;
19846 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19847 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19848
19849 {
19850 VkCommandBufferBeginInfo begin_info{};
19851 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19852 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19853
19854 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 -070019855 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019856
19857 VkViewport viewport{};
19858 viewport.maxDepth = 1.0f;
19859 viewport.minDepth = 0.0f;
19860 viewport.width = 512;
19861 viewport.height = 512;
19862 viewport.x = 0;
19863 viewport.y = 0;
19864 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19865 vkEndCommandBuffer(command_buffer[0]);
19866 }
19867 {
19868 VkCommandBufferBeginInfo begin_info{};
19869 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19870 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19871
19872 VkViewport viewport{};
19873 viewport.maxDepth = 1.0f;
19874 viewport.minDepth = 0.0f;
19875 viewport.width = 512;
19876 viewport.height = 512;
19877 viewport.x = 0;
19878 viewport.y = 0;
19879 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19880 vkEndCommandBuffer(command_buffer[1]);
19881 }
19882 {
19883 VkSubmitInfo submit_info{};
19884 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19885 submit_info.commandBufferCount = 1;
19886 submit_info.pCommandBuffers = &command_buffer[0];
19887 submit_info.signalSemaphoreCount = 1;
19888 submit_info.pSignalSemaphores = &semaphore;
19889 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19890 }
19891 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019892 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019893 VkSubmitInfo submit_info{};
19894 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19895 submit_info.commandBufferCount = 1;
19896 submit_info.pCommandBuffers = &command_buffer[1];
19897 submit_info.waitSemaphoreCount = 1;
19898 submit_info.pWaitSemaphores = &semaphore;
19899 submit_info.pWaitDstStageMask = flags;
19900 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19901 }
19902
19903 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19904
19905 vkDestroyFence(m_device->device(), fence, nullptr);
19906 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19907 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19908 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19909
19910 m_errorMonitor->VerifyNotFound();
19911}
19912
19913// This is a positive test. No errors should be generated.
19914TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019915 TEST_DESCRIPTION(
19916 "Two command buffers, each in a separate QueueSubmit call "
19917 "on the same queue, no fences, followed by a third QueueSubmit with NO "
19918 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019919
19920 m_errorMonitor->ExpectSuccess();
19921
19922 ASSERT_NO_FATAL_FAILURE(InitState());
19923 VkFence fence;
19924 VkFenceCreateInfo fence_create_info{};
19925 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19926 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19927
19928 VkCommandPool command_pool;
19929 VkCommandPoolCreateInfo pool_create_info{};
19930 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19931 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19932 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19933 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19934
19935 VkCommandBuffer command_buffer[2];
19936 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19937 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19938 command_buffer_allocate_info.commandPool = command_pool;
19939 command_buffer_allocate_info.commandBufferCount = 2;
19940 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19941 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19942
19943 {
19944 VkCommandBufferBeginInfo begin_info{};
19945 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19946 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19947
19948 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 -070019949 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019950
19951 VkViewport viewport{};
19952 viewport.maxDepth = 1.0f;
19953 viewport.minDepth = 0.0f;
19954 viewport.width = 512;
19955 viewport.height = 512;
19956 viewport.x = 0;
19957 viewport.y = 0;
19958 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19959 vkEndCommandBuffer(command_buffer[0]);
19960 }
19961 {
19962 VkCommandBufferBeginInfo begin_info{};
19963 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19964 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19965
19966 VkViewport viewport{};
19967 viewport.maxDepth = 1.0f;
19968 viewport.minDepth = 0.0f;
19969 viewport.width = 512;
19970 viewport.height = 512;
19971 viewport.x = 0;
19972 viewport.y = 0;
19973 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19974 vkEndCommandBuffer(command_buffer[1]);
19975 }
19976 {
19977 VkSubmitInfo submit_info{};
19978 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19979 submit_info.commandBufferCount = 1;
19980 submit_info.pCommandBuffers = &command_buffer[0];
19981 submit_info.signalSemaphoreCount = 0;
19982 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
19983 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19984 }
19985 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019986 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019987 VkSubmitInfo submit_info{};
19988 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19989 submit_info.commandBufferCount = 1;
19990 submit_info.pCommandBuffers = &command_buffer[1];
19991 submit_info.waitSemaphoreCount = 0;
19992 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
19993 submit_info.pWaitDstStageMask = flags;
19994 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19995 }
19996
19997 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
19998
19999 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20000 ASSERT_VK_SUCCESS(err);
20001
20002 vkDestroyFence(m_device->device(), fence, nullptr);
20003 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
20004 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20005
20006 m_errorMonitor->VerifyNotFound();
20007}
20008
20009// This is a positive test. No errors should be generated.
20010TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020011 TEST_DESCRIPTION(
20012 "Two command buffers, each in a separate QueueSubmit call "
20013 "on the same queue, the second having a fence, followed "
20014 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020015
20016 m_errorMonitor->ExpectSuccess();
20017
20018 ASSERT_NO_FATAL_FAILURE(InitState());
20019 VkFence fence;
20020 VkFenceCreateInfo fence_create_info{};
20021 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20022 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
20023
20024 VkCommandPool command_pool;
20025 VkCommandPoolCreateInfo pool_create_info{};
20026 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20027 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20028 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20029 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20030
20031 VkCommandBuffer command_buffer[2];
20032 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20033 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20034 command_buffer_allocate_info.commandPool = command_pool;
20035 command_buffer_allocate_info.commandBufferCount = 2;
20036 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20037 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20038
20039 {
20040 VkCommandBufferBeginInfo begin_info{};
20041 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20042 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20043
20044 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 -070020045 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020046
20047 VkViewport viewport{};
20048 viewport.maxDepth = 1.0f;
20049 viewport.minDepth = 0.0f;
20050 viewport.width = 512;
20051 viewport.height = 512;
20052 viewport.x = 0;
20053 viewport.y = 0;
20054 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
20055 vkEndCommandBuffer(command_buffer[0]);
20056 }
20057 {
20058 VkCommandBufferBeginInfo begin_info{};
20059 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20060 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20061
20062 VkViewport viewport{};
20063 viewport.maxDepth = 1.0f;
20064 viewport.minDepth = 0.0f;
20065 viewport.width = 512;
20066 viewport.height = 512;
20067 viewport.x = 0;
20068 viewport.y = 0;
20069 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
20070 vkEndCommandBuffer(command_buffer[1]);
20071 }
20072 {
20073 VkSubmitInfo submit_info{};
20074 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20075 submit_info.commandBufferCount = 1;
20076 submit_info.pCommandBuffers = &command_buffer[0];
20077 submit_info.signalSemaphoreCount = 0;
20078 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
20079 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20080 }
20081 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020082 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020083 VkSubmitInfo submit_info{};
20084 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20085 submit_info.commandBufferCount = 1;
20086 submit_info.pCommandBuffers = &command_buffer[1];
20087 submit_info.waitSemaphoreCount = 0;
20088 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
20089 submit_info.pWaitDstStageMask = flags;
20090 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
20091 }
20092
20093 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20094
20095 vkDestroyFence(m_device->device(), fence, nullptr);
20096 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
20097 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20098
20099 m_errorMonitor->VerifyNotFound();
20100}
20101
20102// This is a positive test. No errors should be generated.
20103TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020104 TEST_DESCRIPTION(
20105 "Two command buffers each in a separate SubmitInfo sent in a single "
20106 "QueueSubmit call followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020107 ASSERT_NO_FATAL_FAILURE(InitState());
20108
20109 m_errorMonitor->ExpectSuccess();
20110
20111 VkFence fence;
20112 VkFenceCreateInfo fence_create_info{};
20113 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20114 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
20115
20116 VkSemaphore semaphore;
20117 VkSemaphoreCreateInfo semaphore_create_info{};
20118 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
20119 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
20120
20121 VkCommandPool command_pool;
20122 VkCommandPoolCreateInfo pool_create_info{};
20123 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20124 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20125 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20126 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20127
20128 VkCommandBuffer command_buffer[2];
20129 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20130 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20131 command_buffer_allocate_info.commandPool = command_pool;
20132 command_buffer_allocate_info.commandBufferCount = 2;
20133 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20134 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20135
20136 {
20137 VkCommandBufferBeginInfo begin_info{};
20138 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20139 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20140
20141 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 -070020142 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020143
20144 VkViewport viewport{};
20145 viewport.maxDepth = 1.0f;
20146 viewport.minDepth = 0.0f;
20147 viewport.width = 512;
20148 viewport.height = 512;
20149 viewport.x = 0;
20150 viewport.y = 0;
20151 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
20152 vkEndCommandBuffer(command_buffer[0]);
20153 }
20154 {
20155 VkCommandBufferBeginInfo begin_info{};
20156 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20157 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20158
20159 VkViewport viewport{};
20160 viewport.maxDepth = 1.0f;
20161 viewport.minDepth = 0.0f;
20162 viewport.width = 512;
20163 viewport.height = 512;
20164 viewport.x = 0;
20165 viewport.y = 0;
20166 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
20167 vkEndCommandBuffer(command_buffer[1]);
20168 }
20169 {
20170 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020171 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020172
20173 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20174 submit_info[0].pNext = NULL;
20175 submit_info[0].commandBufferCount = 1;
20176 submit_info[0].pCommandBuffers = &command_buffer[0];
20177 submit_info[0].signalSemaphoreCount = 1;
20178 submit_info[0].pSignalSemaphores = &semaphore;
20179 submit_info[0].waitSemaphoreCount = 0;
20180 submit_info[0].pWaitSemaphores = NULL;
20181 submit_info[0].pWaitDstStageMask = 0;
20182
20183 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20184 submit_info[1].pNext = NULL;
20185 submit_info[1].commandBufferCount = 1;
20186 submit_info[1].pCommandBuffers = &command_buffer[1];
20187 submit_info[1].waitSemaphoreCount = 1;
20188 submit_info[1].pWaitSemaphores = &semaphore;
20189 submit_info[1].pWaitDstStageMask = flags;
20190 submit_info[1].signalSemaphoreCount = 0;
20191 submit_info[1].pSignalSemaphores = NULL;
20192 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
20193 }
20194
20195 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20196
20197 vkDestroyFence(m_device->device(), fence, nullptr);
20198 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
20199 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20200 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
20201
20202 m_errorMonitor->VerifyNotFound();
20203}
20204
20205TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
20206 m_errorMonitor->ExpectSuccess();
20207
20208 ASSERT_NO_FATAL_FAILURE(InitState());
20209 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20210
Tony Barbour552f6c02016-12-21 14:34:07 -070020211 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020212
20213 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
20214 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
20215 m_errorMonitor->VerifyNotFound();
20216 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
20217 m_errorMonitor->VerifyNotFound();
20218 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
20219 m_errorMonitor->VerifyNotFound();
20220
20221 m_commandBuffer->EndCommandBuffer();
20222 m_errorMonitor->VerifyNotFound();
20223}
20224
20225TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020226 TEST_DESCRIPTION(
20227 "Positive test where we create a renderpass with an "
20228 "attachment that uses LOAD_OP_CLEAR, the first subpass "
20229 "has a valid layout, and a second subpass then uses a "
20230 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020231 m_errorMonitor->ExpectSuccess();
20232 ASSERT_NO_FATAL_FAILURE(InitState());
20233
20234 VkAttachmentReference attach[2] = {};
20235 attach[0].attachment = 0;
20236 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20237 attach[1].attachment = 0;
20238 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
20239 VkSubpassDescription subpasses[2] = {};
20240 // First subpass clears DS attach on load
20241 subpasses[0].pDepthStencilAttachment = &attach[0];
20242 // 2nd subpass reads in DS as input attachment
20243 subpasses[1].inputAttachmentCount = 1;
20244 subpasses[1].pInputAttachments = &attach[1];
20245 VkAttachmentDescription attach_desc = {};
20246 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
20247 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
20248 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
20249 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20250 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20251 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20252 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20253 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
20254 VkRenderPassCreateInfo rpci = {};
20255 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20256 rpci.attachmentCount = 1;
20257 rpci.pAttachments = &attach_desc;
20258 rpci.subpassCount = 2;
20259 rpci.pSubpasses = subpasses;
20260
20261 // Now create RenderPass and verify no errors
20262 VkRenderPass rp;
20263 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
20264 m_errorMonitor->VerifyNotFound();
20265
20266 vkDestroyRenderPass(m_device->device(), rp, NULL);
20267}
20268
20269TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020270 TEST_DESCRIPTION(
20271 "Test that pipeline validation accepts matrices passed "
20272 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020273 m_errorMonitor->ExpectSuccess();
20274
20275 ASSERT_NO_FATAL_FAILURE(InitState());
20276 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20277
20278 VkVertexInputBindingDescription input_binding;
20279 memset(&input_binding, 0, sizeof(input_binding));
20280
20281 VkVertexInputAttributeDescription input_attribs[2];
20282 memset(input_attribs, 0, sizeof(input_attribs));
20283
20284 for (int i = 0; i < 2; i++) {
20285 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
20286 input_attribs[i].location = i;
20287 }
20288
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020289 char const *vsSource =
20290 "#version 450\n"
20291 "\n"
20292 "layout(location=0) in mat2x4 x;\n"
20293 "out gl_PerVertex {\n"
20294 " vec4 gl_Position;\n"
20295 "};\n"
20296 "void main(){\n"
20297 " gl_Position = x[0] + x[1];\n"
20298 "}\n";
20299 char const *fsSource =
20300 "#version 450\n"
20301 "\n"
20302 "layout(location=0) out vec4 color;\n"
20303 "void main(){\n"
20304 " color = vec4(1);\n"
20305 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020306
20307 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20308 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20309
20310 VkPipelineObj pipe(m_device);
20311 pipe.AddColorAttachment();
20312 pipe.AddShader(&vs);
20313 pipe.AddShader(&fs);
20314
20315 pipe.AddVertexInputBindings(&input_binding, 1);
20316 pipe.AddVertexInputAttribs(input_attribs, 2);
20317
20318 VkDescriptorSetObj descriptorSet(m_device);
20319 descriptorSet.AppendDummy();
20320 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20321
20322 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20323
20324 /* expect success */
20325 m_errorMonitor->VerifyNotFound();
20326}
20327
20328TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
20329 m_errorMonitor->ExpectSuccess();
20330
20331 ASSERT_NO_FATAL_FAILURE(InitState());
20332 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20333
20334 VkVertexInputBindingDescription input_binding;
20335 memset(&input_binding, 0, sizeof(input_binding));
20336
20337 VkVertexInputAttributeDescription input_attribs[2];
20338 memset(input_attribs, 0, sizeof(input_attribs));
20339
20340 for (int i = 0; i < 2; i++) {
20341 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
20342 input_attribs[i].location = i;
20343 }
20344
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020345 char const *vsSource =
20346 "#version 450\n"
20347 "\n"
20348 "layout(location=0) in vec4 x[2];\n"
20349 "out gl_PerVertex {\n"
20350 " vec4 gl_Position;\n"
20351 "};\n"
20352 "void main(){\n"
20353 " gl_Position = x[0] + x[1];\n"
20354 "}\n";
20355 char const *fsSource =
20356 "#version 450\n"
20357 "\n"
20358 "layout(location=0) out vec4 color;\n"
20359 "void main(){\n"
20360 " color = vec4(1);\n"
20361 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020362
20363 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20364 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20365
20366 VkPipelineObj pipe(m_device);
20367 pipe.AddColorAttachment();
20368 pipe.AddShader(&vs);
20369 pipe.AddShader(&fs);
20370
20371 pipe.AddVertexInputBindings(&input_binding, 1);
20372 pipe.AddVertexInputAttribs(input_attribs, 2);
20373
20374 VkDescriptorSetObj descriptorSet(m_device);
20375 descriptorSet.AppendDummy();
20376 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20377
20378 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20379
20380 m_errorMonitor->VerifyNotFound();
20381}
20382
20383TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020384 TEST_DESCRIPTION(
20385 "Test that pipeline validation accepts consuming a vertex attribute "
20386 "through multiple vertex shader inputs, each consuming a different "
20387 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020388 m_errorMonitor->ExpectSuccess();
20389
20390 ASSERT_NO_FATAL_FAILURE(InitState());
20391 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20392
20393 VkVertexInputBindingDescription input_binding;
20394 memset(&input_binding, 0, sizeof(input_binding));
20395
20396 VkVertexInputAttributeDescription input_attribs[3];
20397 memset(input_attribs, 0, sizeof(input_attribs));
20398
20399 for (int i = 0; i < 3; i++) {
20400 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
20401 input_attribs[i].location = i;
20402 }
20403
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020404 char const *vsSource =
20405 "#version 450\n"
20406 "\n"
20407 "layout(location=0) in vec4 x;\n"
20408 "layout(location=1) in vec3 y1;\n"
20409 "layout(location=1, component=3) in float y2;\n"
20410 "layout(location=2) in vec4 z;\n"
20411 "out gl_PerVertex {\n"
20412 " vec4 gl_Position;\n"
20413 "};\n"
20414 "void main(){\n"
20415 " gl_Position = x + vec4(y1, y2) + z;\n"
20416 "}\n";
20417 char const *fsSource =
20418 "#version 450\n"
20419 "\n"
20420 "layout(location=0) out vec4 color;\n"
20421 "void main(){\n"
20422 " color = vec4(1);\n"
20423 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020424
20425 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20426 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20427
20428 VkPipelineObj pipe(m_device);
20429 pipe.AddColorAttachment();
20430 pipe.AddShader(&vs);
20431 pipe.AddShader(&fs);
20432
20433 pipe.AddVertexInputBindings(&input_binding, 1);
20434 pipe.AddVertexInputAttribs(input_attribs, 3);
20435
20436 VkDescriptorSetObj descriptorSet(m_device);
20437 descriptorSet.AppendDummy();
20438 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20439
20440 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20441
20442 m_errorMonitor->VerifyNotFound();
20443}
20444
20445TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
20446 m_errorMonitor->ExpectSuccess();
20447
20448 ASSERT_NO_FATAL_FAILURE(InitState());
20449 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20450
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020451 char const *vsSource =
20452 "#version 450\n"
20453 "out gl_PerVertex {\n"
20454 " vec4 gl_Position;\n"
20455 "};\n"
20456 "void main(){\n"
20457 " gl_Position = vec4(0);\n"
20458 "}\n";
20459 char const *fsSource =
20460 "#version 450\n"
20461 "\n"
20462 "layout(location=0) out vec4 color;\n"
20463 "void main(){\n"
20464 " color = vec4(1);\n"
20465 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020466
20467 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20468 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20469
20470 VkPipelineObj pipe(m_device);
20471 pipe.AddColorAttachment();
20472 pipe.AddShader(&vs);
20473 pipe.AddShader(&fs);
20474
20475 VkDescriptorSetObj descriptorSet(m_device);
20476 descriptorSet.AppendDummy();
20477 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20478
20479 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20480
20481 m_errorMonitor->VerifyNotFound();
20482}
20483
20484TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020485 TEST_DESCRIPTION(
20486 "Test that pipeline validation accepts the relaxed type matching rules "
20487 "set out in 14.1.3: fundamental type must match, and producer side must "
20488 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020489 m_errorMonitor->ExpectSuccess();
20490
20491 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
20492
20493 ASSERT_NO_FATAL_FAILURE(InitState());
20494 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20495
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020496 char const *vsSource =
20497 "#version 450\n"
20498 "out gl_PerVertex {\n"
20499 " vec4 gl_Position;\n"
20500 "};\n"
20501 "layout(location=0) out vec3 x;\n"
20502 "layout(location=1) out ivec3 y;\n"
20503 "layout(location=2) out vec3 z;\n"
20504 "void main(){\n"
20505 " gl_Position = vec4(0);\n"
20506 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
20507 "}\n";
20508 char const *fsSource =
20509 "#version 450\n"
20510 "\n"
20511 "layout(location=0) out vec4 color;\n"
20512 "layout(location=0) in float x;\n"
20513 "layout(location=1) flat in int y;\n"
20514 "layout(location=2) in vec2 z;\n"
20515 "void main(){\n"
20516 " color = vec4(1 + x + y + z.x);\n"
20517 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020518
20519 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20520 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20521
20522 VkPipelineObj pipe(m_device);
20523 pipe.AddColorAttachment();
20524 pipe.AddShader(&vs);
20525 pipe.AddShader(&fs);
20526
20527 VkDescriptorSetObj descriptorSet(m_device);
20528 descriptorSet.AppendDummy();
20529 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20530
20531 VkResult err = VK_SUCCESS;
20532 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20533 ASSERT_VK_SUCCESS(err);
20534
20535 m_errorMonitor->VerifyNotFound();
20536}
20537
20538TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020539 TEST_DESCRIPTION(
20540 "Test that pipeline validation accepts per-vertex variables "
20541 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020542 m_errorMonitor->ExpectSuccess();
20543
20544 ASSERT_NO_FATAL_FAILURE(InitState());
20545 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20546
20547 if (!m_device->phy().features().tessellationShader) {
20548 printf("Device does not support tessellation shaders; skipped.\n");
20549 return;
20550 }
20551
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020552 char const *vsSource =
20553 "#version 450\n"
20554 "void main(){}\n";
20555 char const *tcsSource =
20556 "#version 450\n"
20557 "layout(location=0) out int x[];\n"
20558 "layout(vertices=3) out;\n"
20559 "void main(){\n"
20560 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
20561 " gl_TessLevelInner[0] = 1;\n"
20562 " x[gl_InvocationID] = gl_InvocationID;\n"
20563 "}\n";
20564 char const *tesSource =
20565 "#version 450\n"
20566 "layout(triangles, equal_spacing, cw) in;\n"
20567 "layout(location=0) in int x[];\n"
20568 "out gl_PerVertex { vec4 gl_Position; };\n"
20569 "void main(){\n"
20570 " gl_Position.xyz = gl_TessCoord;\n"
20571 " gl_Position.w = x[0] + x[1] + x[2];\n"
20572 "}\n";
20573 char const *fsSource =
20574 "#version 450\n"
20575 "layout(location=0) out vec4 color;\n"
20576 "void main(){\n"
20577 " color = vec4(1);\n"
20578 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020579
20580 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20581 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
20582 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
20583 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20584
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020585 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
20586 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020587
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020588 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020589
20590 VkPipelineObj pipe(m_device);
20591 pipe.SetInputAssembly(&iasci);
20592 pipe.SetTessellation(&tsci);
20593 pipe.AddColorAttachment();
20594 pipe.AddShader(&vs);
20595 pipe.AddShader(&tcs);
20596 pipe.AddShader(&tes);
20597 pipe.AddShader(&fs);
20598
20599 VkDescriptorSetObj descriptorSet(m_device);
20600 descriptorSet.AppendDummy();
20601 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20602
20603 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20604
20605 m_errorMonitor->VerifyNotFound();
20606}
20607
20608TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020609 TEST_DESCRIPTION(
20610 "Test that pipeline validation accepts a user-defined "
20611 "interface block passed into the geometry shader. This "
20612 "is interesting because the 'extra' array level is not "
20613 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020614 m_errorMonitor->ExpectSuccess();
20615
20616 ASSERT_NO_FATAL_FAILURE(InitState());
20617 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20618
20619 if (!m_device->phy().features().geometryShader) {
20620 printf("Device does not support geometry shaders; skipped.\n");
20621 return;
20622 }
20623
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020624 char const *vsSource =
20625 "#version 450\n"
20626 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
20627 "void main(){\n"
20628 " vs_out.x = vec4(1);\n"
20629 "}\n";
20630 char const *gsSource =
20631 "#version 450\n"
20632 "layout(triangles) in;\n"
20633 "layout(triangle_strip, max_vertices=3) out;\n"
20634 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
20635 "out gl_PerVertex { vec4 gl_Position; };\n"
20636 "void main() {\n"
20637 " gl_Position = gs_in[0].x;\n"
20638 " EmitVertex();\n"
20639 "}\n";
20640 char const *fsSource =
20641 "#version 450\n"
20642 "layout(location=0) out vec4 color;\n"
20643 "void main(){\n"
20644 " color = vec4(1);\n"
20645 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020646
20647 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20648 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
20649 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20650
20651 VkPipelineObj pipe(m_device);
20652 pipe.AddColorAttachment();
20653 pipe.AddShader(&vs);
20654 pipe.AddShader(&gs);
20655 pipe.AddShader(&fs);
20656
20657 VkDescriptorSetObj descriptorSet(m_device);
20658 descriptorSet.AppendDummy();
20659 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20660
20661 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20662
20663 m_errorMonitor->VerifyNotFound();
20664}
20665
20666TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020667 TEST_DESCRIPTION(
20668 "Test that pipeline validation accepts basic use of 64bit vertex "
20669 "attributes. This is interesting because they consume multiple "
20670 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020671 m_errorMonitor->ExpectSuccess();
20672
20673 ASSERT_NO_FATAL_FAILURE(InitState());
20674 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20675
20676 if (!m_device->phy().features().shaderFloat64) {
20677 printf("Device does not support 64bit vertex attributes; skipped.\n");
20678 return;
20679 }
20680
20681 VkVertexInputBindingDescription input_bindings[1];
20682 memset(input_bindings, 0, sizeof(input_bindings));
20683
20684 VkVertexInputAttributeDescription input_attribs[4];
20685 memset(input_attribs, 0, sizeof(input_attribs));
20686 input_attribs[0].location = 0;
20687 input_attribs[0].offset = 0;
20688 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
20689 input_attribs[1].location = 2;
20690 input_attribs[1].offset = 32;
20691 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
20692 input_attribs[2].location = 4;
20693 input_attribs[2].offset = 64;
20694 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
20695 input_attribs[3].location = 6;
20696 input_attribs[3].offset = 96;
20697 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
20698
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020699 char const *vsSource =
20700 "#version 450\n"
20701 "\n"
20702 "layout(location=0) in dmat4 x;\n"
20703 "out gl_PerVertex {\n"
20704 " vec4 gl_Position;\n"
20705 "};\n"
20706 "void main(){\n"
20707 " gl_Position = vec4(x[0][0]);\n"
20708 "}\n";
20709 char const *fsSource =
20710 "#version 450\n"
20711 "\n"
20712 "layout(location=0) out vec4 color;\n"
20713 "void main(){\n"
20714 " color = vec4(1);\n"
20715 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020716
20717 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20718 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20719
20720 VkPipelineObj pipe(m_device);
20721 pipe.AddColorAttachment();
20722 pipe.AddShader(&vs);
20723 pipe.AddShader(&fs);
20724
20725 pipe.AddVertexInputBindings(input_bindings, 1);
20726 pipe.AddVertexInputAttribs(input_attribs, 4);
20727
20728 VkDescriptorSetObj descriptorSet(m_device);
20729 descriptorSet.AppendDummy();
20730 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20731
20732 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20733
20734 m_errorMonitor->VerifyNotFound();
20735}
20736
20737TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
20738 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
20739 m_errorMonitor->ExpectSuccess();
20740
20741 ASSERT_NO_FATAL_FAILURE(InitState());
20742
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020743 char const *vsSource =
20744 "#version 450\n"
20745 "\n"
20746 "out gl_PerVertex {\n"
20747 " vec4 gl_Position;\n"
20748 "};\n"
20749 "void main(){\n"
20750 " gl_Position = vec4(1);\n"
20751 "}\n";
20752 char const *fsSource =
20753 "#version 450\n"
20754 "\n"
20755 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
20756 "layout(location=0) out vec4 color;\n"
20757 "void main() {\n"
20758 " color = subpassLoad(x);\n"
20759 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020760
20761 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20762 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20763
20764 VkPipelineObj pipe(m_device);
20765 pipe.AddShader(&vs);
20766 pipe.AddShader(&fs);
20767 pipe.AddColorAttachment();
20768 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20769
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020770 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
20771 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020772 VkDescriptorSetLayout dsl;
20773 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
20774 ASSERT_VK_SUCCESS(err);
20775
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020776 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020777 VkPipelineLayout pl;
20778 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
20779 ASSERT_VK_SUCCESS(err);
20780
20781 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020782 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
20783 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20784 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
20785 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
20786 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 -060020787 };
20788 VkAttachmentReference color = {
20789 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20790 };
20791 VkAttachmentReference input = {
20792 1, VK_IMAGE_LAYOUT_GENERAL,
20793 };
20794
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020795 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020796
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020797 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020798 VkRenderPass rp;
20799 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20800 ASSERT_VK_SUCCESS(err);
20801
20802 // should be OK. would go wrong here if it's going to...
20803 pipe.CreateVKPipeline(pl, rp);
20804
20805 m_errorMonitor->VerifyNotFound();
20806
20807 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20808 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
20809 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
20810}
20811
20812TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020813 TEST_DESCRIPTION(
20814 "Test that pipeline validation accepts a compute pipeline which declares a "
20815 "descriptor-backed resource which is not provided, but the shader does not "
20816 "statically use it. This is interesting because it requires compute pipelines "
20817 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020818 m_errorMonitor->ExpectSuccess();
20819
20820 ASSERT_NO_FATAL_FAILURE(InitState());
20821
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020822 char const *csSource =
20823 "#version 450\n"
20824 "\n"
20825 "layout(local_size_x=1) in;\n"
20826 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
20827 "void main(){\n"
20828 " // x is not used.\n"
20829 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020830
20831 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
20832
20833 VkDescriptorSetObj descriptorSet(m_device);
20834 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20835
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020836 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
20837 nullptr,
20838 0,
20839 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
20840 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
20841 descriptorSet.GetPipelineLayout(),
20842 VK_NULL_HANDLE,
20843 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020844
20845 VkPipeline pipe;
20846 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
20847
20848 m_errorMonitor->VerifyNotFound();
20849
20850 if (err == VK_SUCCESS) {
20851 vkDestroyPipeline(m_device->device(), pipe, nullptr);
20852 }
20853}
20854
20855TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020856 TEST_DESCRIPTION(
20857 "Test that pipeline validation accepts a shader consuming only the "
20858 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020859 m_errorMonitor->ExpectSuccess();
20860
20861 ASSERT_NO_FATAL_FAILURE(InitState());
20862
20863 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020864 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
20865 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
20866 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020867 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020868 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020869 VkDescriptorSetLayout dsl;
20870 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
20871 ASSERT_VK_SUCCESS(err);
20872
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020873 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020874 VkPipelineLayout pl;
20875 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
20876 ASSERT_VK_SUCCESS(err);
20877
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020878 char const *csSource =
20879 "#version 450\n"
20880 "\n"
20881 "layout(local_size_x=1) in;\n"
20882 "layout(set=0, binding=0) uniform sampler s;\n"
20883 "layout(set=0, binding=1) uniform texture2D t;\n"
20884 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
20885 "void main() {\n"
20886 " x = texture(sampler2D(t, s), vec2(0));\n"
20887 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020888 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
20889
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020890 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
20891 nullptr,
20892 0,
20893 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
20894 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
20895 pl,
20896 VK_NULL_HANDLE,
20897 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020898
20899 VkPipeline pipe;
20900 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
20901
20902 m_errorMonitor->VerifyNotFound();
20903
20904 if (err == VK_SUCCESS) {
20905 vkDestroyPipeline(m_device->device(), pipe, nullptr);
20906 }
20907
20908 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
20909 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
20910}
20911
20912TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020913 TEST_DESCRIPTION(
20914 "Test that pipeline validation accepts a shader consuming only the "
20915 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020916 m_errorMonitor->ExpectSuccess();
20917
20918 ASSERT_NO_FATAL_FAILURE(InitState());
20919
20920 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020921 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
20922 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
20923 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020924 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020925 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020926 VkDescriptorSetLayout dsl;
20927 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
20928 ASSERT_VK_SUCCESS(err);
20929
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020930 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020931 VkPipelineLayout pl;
20932 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
20933 ASSERT_VK_SUCCESS(err);
20934
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020935 char const *csSource =
20936 "#version 450\n"
20937 "\n"
20938 "layout(local_size_x=1) in;\n"
20939 "layout(set=0, binding=0) uniform texture2D t;\n"
20940 "layout(set=0, binding=1) uniform sampler s;\n"
20941 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
20942 "void main() {\n"
20943 " x = texture(sampler2D(t, s), vec2(0));\n"
20944 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020945 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
20946
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020947 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
20948 nullptr,
20949 0,
20950 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
20951 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
20952 pl,
20953 VK_NULL_HANDLE,
20954 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020955
20956 VkPipeline pipe;
20957 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
20958
20959 m_errorMonitor->VerifyNotFound();
20960
20961 if (err == VK_SUCCESS) {
20962 vkDestroyPipeline(m_device->device(), pipe, nullptr);
20963 }
20964
20965 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
20966 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
20967}
20968
20969TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020970 TEST_DESCRIPTION(
20971 "Test that pipeline validation accepts a shader consuming "
20972 "both the sampler and the image of a combined image+sampler "
20973 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020974 m_errorMonitor->ExpectSuccess();
20975
20976 ASSERT_NO_FATAL_FAILURE(InitState());
20977
20978 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020979 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
20980 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020981 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020982 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020983 VkDescriptorSetLayout dsl;
20984 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
20985 ASSERT_VK_SUCCESS(err);
20986
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020987 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020988 VkPipelineLayout pl;
20989 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
20990 ASSERT_VK_SUCCESS(err);
20991
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020992 char const *csSource =
20993 "#version 450\n"
20994 "\n"
20995 "layout(local_size_x=1) in;\n"
20996 "layout(set=0, binding=0) uniform texture2D t;\n"
20997 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
20998 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
20999 "void main() {\n"
21000 " x = texture(sampler2D(t, s), vec2(0));\n"
21001 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021002 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
21003
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021004 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
21005 nullptr,
21006 0,
21007 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
21008 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
21009 pl,
21010 VK_NULL_HANDLE,
21011 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021012
21013 VkPipeline pipe;
21014 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
21015
21016 m_errorMonitor->VerifyNotFound();
21017
21018 if (err == VK_SUCCESS) {
21019 vkDestroyPipeline(m_device->device(), pipe, nullptr);
21020 }
21021
21022 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
21023 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
21024}
21025
21026TEST_F(VkPositiveLayerTest, ValidStructPNext) {
21027 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
21028
21029 ASSERT_NO_FATAL_FAILURE(InitState());
21030
21031 // Positive test to check parameter_validation and unique_objects support
21032 // for NV_dedicated_allocation
21033 uint32_t extension_count = 0;
21034 bool supports_nv_dedicated_allocation = false;
21035 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
21036 ASSERT_VK_SUCCESS(err);
21037
21038 if (extension_count > 0) {
21039 std::vector<VkExtensionProperties> available_extensions(extension_count);
21040
21041 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
21042 ASSERT_VK_SUCCESS(err);
21043
21044 for (const auto &extension_props : available_extensions) {
21045 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
21046 supports_nv_dedicated_allocation = true;
21047 }
21048 }
21049 }
21050
21051 if (supports_nv_dedicated_allocation) {
21052 m_errorMonitor->ExpectSuccess();
21053
21054 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
21055 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
21056 dedicated_buffer_create_info.pNext = nullptr;
21057 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
21058
21059 uint32_t queue_family_index = 0;
21060 VkBufferCreateInfo buffer_create_info = {};
21061 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21062 buffer_create_info.pNext = &dedicated_buffer_create_info;
21063 buffer_create_info.size = 1024;
21064 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
21065 buffer_create_info.queueFamilyIndexCount = 1;
21066 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
21067
21068 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070021069 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021070 ASSERT_VK_SUCCESS(err);
21071
21072 VkMemoryRequirements memory_reqs;
21073 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
21074
21075 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
21076 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
21077 dedicated_memory_info.pNext = nullptr;
21078 dedicated_memory_info.buffer = buffer;
21079 dedicated_memory_info.image = VK_NULL_HANDLE;
21080
21081 VkMemoryAllocateInfo memory_info = {};
21082 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21083 memory_info.pNext = &dedicated_memory_info;
21084 memory_info.allocationSize = memory_reqs.size;
21085
21086 bool pass;
21087 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
21088 ASSERT_TRUE(pass);
21089
21090 VkDeviceMemory buffer_memory;
21091 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
21092 ASSERT_VK_SUCCESS(err);
21093
21094 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
21095 ASSERT_VK_SUCCESS(err);
21096
21097 vkDestroyBuffer(m_device->device(), buffer, NULL);
21098 vkFreeMemory(m_device->device(), buffer_memory, NULL);
21099
21100 m_errorMonitor->VerifyNotFound();
21101 }
21102}
21103
21104TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
21105 VkResult err;
21106
21107 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
21108
21109 ASSERT_NO_FATAL_FAILURE(InitState());
21110 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21111
21112 std::vector<const char *> device_extension_names;
21113 auto features = m_device->phy().features();
21114 // Artificially disable support for non-solid fill modes
21115 features.fillModeNonSolid = false;
21116 // The sacrificial device object
21117 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
21118
21119 VkRenderpassObj render_pass(&test_device);
21120
21121 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
21122 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
21123 pipeline_layout_ci.setLayoutCount = 0;
21124 pipeline_layout_ci.pSetLayouts = NULL;
21125
21126 VkPipelineLayout pipeline_layout;
21127 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
21128 ASSERT_VK_SUCCESS(err);
21129
21130 VkPipelineRasterizationStateCreateInfo rs_ci = {};
21131 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
21132 rs_ci.pNext = nullptr;
21133 rs_ci.lineWidth = 1.0f;
21134 rs_ci.rasterizerDiscardEnable = true;
21135
21136 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
21137 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
21138
21139 // Set polygonMode=FILL. No error is expected
21140 m_errorMonitor->ExpectSuccess();
21141 {
21142 VkPipelineObj pipe(&test_device);
21143 pipe.AddShader(&vs);
21144 pipe.AddShader(&fs);
21145 pipe.AddColorAttachment();
21146 // Set polygonMode to a good value
21147 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
21148 pipe.SetRasterization(&rs_ci);
21149 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
21150 }
21151 m_errorMonitor->VerifyNotFound();
21152
21153 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
21154}
21155
21156TEST_F(VkPositiveLayerTest, ValidPushConstants) {
21157 VkResult err;
21158 ASSERT_NO_FATAL_FAILURE(InitState());
21159 ASSERT_NO_FATAL_FAILURE(InitViewport());
21160 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21161
21162 VkPipelineLayout pipeline_layout;
21163 VkPushConstantRange pc_range = {};
21164 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
21165 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
21166 pipeline_layout_ci.pushConstantRangeCount = 1;
21167 pipeline_layout_ci.pPushConstantRanges = &pc_range;
21168
21169 //
21170 // Check for invalid push constant ranges in pipeline layouts.
21171 //
21172 struct PipelineLayoutTestCase {
21173 VkPushConstantRange const range;
21174 char const *msg;
21175 };
21176
21177 // Check for overlapping ranges
21178 const uint32_t ranges_per_test = 5;
21179 struct OverlappingRangeTestCase {
21180 VkPushConstantRange const ranges[ranges_per_test];
21181 char const *msg;
21182 };
21183
21184 // Run some positive tests to make sure overlap checking in the layer is OK
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021185 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos = {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
21186 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
21187 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
21188 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
21189 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
21190 ""},
21191 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
21192 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
21193 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
21194 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
21195 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
21196 ""}}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021197 for (const auto &iter : overlapping_range_tests_pos) {
21198 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
21199 m_errorMonitor->ExpectSuccess();
21200 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
21201 m_errorMonitor->VerifyNotFound();
21202 if (VK_SUCCESS == err) {
21203 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
21204 }
21205 }
21206
21207 //
21208 // CmdPushConstants tests
21209 //
21210 const uint8_t dummy_values[100] = {};
21211
Tony Barbour552f6c02016-12-21 14:34:07 -070021212 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021213
21214 // positive overlapping range tests with cmd
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021215 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
21216 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
21217 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
21218 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
21219 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
21220 }};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021221
21222 // Setup ranges: [0,16) [20,36) [36,44) [44,52) [56,80) [80,92)
21223 const VkPushConstantRange pc_range4[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021224 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
21225 {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 -060021226 };
21227
21228 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range4) / sizeof(VkPushConstantRange);
21229 pipeline_layout_ci.pPushConstantRanges = pc_range4;
21230 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
21231 ASSERT_VK_SUCCESS(err);
21232 for (const auto &iter : cmd_overlap_tests_pos) {
21233 m_errorMonitor->ExpectSuccess();
21234 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021235 iter.range.size, dummy_values);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021236 m_errorMonitor->VerifyNotFound();
21237 }
21238 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
21239
Tony Barbour552f6c02016-12-21 14:34:07 -070021240 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021241}
21242
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021243#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021244TEST_F(VkPositiveLayerTest, LongFenceChain)
21245{
21246 m_errorMonitor->ExpectSuccess();
21247
21248 ASSERT_NO_FATAL_FAILURE(InitState());
21249 VkResult err;
21250
21251 std::vector<VkFence> fences;
21252
21253 const int chainLength = 32768;
21254
21255 for (int i = 0; i < chainLength; i++) {
21256 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
21257 VkFence fence;
21258 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
21259 ASSERT_VK_SUCCESS(err);
21260
21261 fences.push_back(fence);
21262
21263 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
21264 0, nullptr, 0, nullptr };
21265 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
21266 ASSERT_VK_SUCCESS(err);
21267
21268 }
21269
21270 // BOOM, stack overflow.
21271 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
21272
21273 for (auto fence : fences)
21274 vkDestroyFence(m_device->device(), fence, nullptr);
21275
21276 m_errorMonitor->VerifyNotFound();
21277}
21278#endif
21279
Cody Northrop1242dfd2016-07-13 17:24:59 -060021280#if defined(ANDROID) && defined(VALIDATION_APK)
21281static bool initialized = false;
21282static bool active = false;
21283
21284// Convert Intents to argv
21285// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021286std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060021287 std::vector<std::string> args;
21288 JavaVM &vm = *app.activity->vm;
21289 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021290 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060021291
21292 JNIEnv &env = *p_env;
21293 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021294 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060021295 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021296 jmethodID get_string_extra_method =
21297 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060021298 jvalue get_string_extra_args;
21299 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021300 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060021301
21302 std::string args_str;
21303 if (extra_str) {
21304 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
21305 args_str = extra_utf;
21306 env.ReleaseStringUTFChars(extra_str, extra_utf);
21307 env.DeleteLocalRef(extra_str);
21308 }
21309
21310 env.DeleteLocalRef(get_string_extra_args.l);
21311 env.DeleteLocalRef(intent);
21312 vm.DetachCurrentThread();
21313
21314 // split args_str
21315 std::stringstream ss(args_str);
21316 std::string arg;
21317 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021318 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021319 }
21320
21321 return args;
21322}
21323
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021324static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060021325
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021326static void processCommand(struct android_app *app, int32_t cmd) {
21327 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021328 case APP_CMD_INIT_WINDOW: {
21329 if (app->window) {
21330 initialized = true;
21331 }
21332 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060021333 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021334 case APP_CMD_GAINED_FOCUS: {
21335 active = true;
21336 break;
21337 }
21338 case APP_CMD_LOST_FOCUS: {
21339 active = false;
21340 break;
21341 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060021342 }
21343}
21344
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021345void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060021346 app_dummy();
21347
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021348 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060021349
21350 int vulkanSupport = InitVulkan();
21351 if (vulkanSupport == 0) {
21352 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
21353 return;
21354 }
21355
21356 app->onAppCmd = processCommand;
21357 app->onInputEvent = processInput;
21358
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021359 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060021360 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021361 struct android_poll_source *source;
21362 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060021363 if (source) {
21364 source->process(app, source);
21365 }
21366
21367 if (app->destroyRequested != 0) {
21368 VkTestFramework::Finish();
21369 return;
21370 }
21371 }
21372
21373 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021374 // Use the following key to send arguments to gtest, i.e.
21375 // --es args "--gtest_filter=-VkLayerTest.foo"
21376 const char key[] = "args";
21377 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021378
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021379 std::string filter = "";
21380 if (args.size() > 0) {
21381 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
21382 filter += args[0];
21383 } else {
21384 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
21385 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060021386
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021387 int argc = 2;
21388 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
21389 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021390
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021391 // Route output to files until we can override the gtest output
21392 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
21393 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021394
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021395 ::testing::InitGoogleTest(&argc, argv);
21396 VkTestFramework::InitArgs(&argc, argv);
21397 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021398
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021399 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060021400
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021401 if (result != 0) {
21402 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
21403 } else {
21404 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
21405 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060021406
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021407 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060021408
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021409 fclose(stdout);
21410 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021411
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021412 ANativeActivity_finish(app->activity);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021413
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021414 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060021415 }
21416 }
21417}
21418#endif
21419
Tony Barbour300a6082015-04-07 13:44:53 -060021420int main(int argc, char **argv) {
21421 int result;
21422
Cody Northrop8e54a402016-03-08 22:25:52 -070021423#ifdef ANDROID
21424 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021425 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070021426#endif
21427
Tony Barbour300a6082015-04-07 13:44:53 -060021428 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060021429 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060021430
21431 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
21432
21433 result = RUN_ALL_TESTS();
21434
Tony Barbour6918cd52015-04-09 12:58:51 -060021435 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060021436 return result;
21437}