blob: 21ec843f82a4f84767fc92c3a43728f980a312eb [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>
20 */
Tony Barbour65c48b32015-11-17 10:02:56 -070021
Cody Northrop8e54a402016-03-08 22:25:52 -070022#ifdef ANDROID
23#include "vulkan_wrapper.h"
24#else
David Pinedo9316d3b2015-11-06 12:54:48 -070025#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070026#endif
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060027#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060028#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060029#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070030#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060031
Mark Lobodzinski3780e142015-05-14 15:08:13 -050032#define GLM_FORCE_RADIANS
33#include "glm/glm.hpp"
34#include <glm/gtc/matrix_transform.hpp>
35
Dustin Gravesffa90fa2016-05-06 11:20:38 -060036#define PARAMETER_VALIDATION_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060037#define MEM_TRACKER_TESTS 1
38#define OBJ_TRACKER_TESTS 1
39#define DRAW_STATE_TESTS 1
40#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120041#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060042#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060043#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060044
Mark Lobodzinski3780e142015-05-14 15:08:13 -050045//--------------------------------------------------------------------------------------
46// Mesh and VertexFormat Data
47//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070048struct Vertex {
49 float posX, posY, posZ, posW; // Position data
50 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050051};
52
Karl Schultz6addd812016-02-02 17:17:23 -070053#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050054
55typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070056 BsoFailNone = 0x00000000,
57 BsoFailLineWidth = 0x00000001,
58 BsoFailDepthBias = 0x00000002,
59 BsoFailViewport = 0x00000004,
60 BsoFailScissor = 0x00000008,
61 BsoFailBlend = 0x00000010,
62 BsoFailDepthBounds = 0x00000020,
63 BsoFailStencilReadMask = 0x00000040,
64 BsoFailStencilWriteMask = 0x00000080,
65 BsoFailStencilReference = 0x00000100,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050066} BsoFailSelect;
67
68struct vktriangle_vs_uniform {
69 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070070 float mvp[4][4];
71 float position[3][4];
72 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050073};
74
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050075static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120076 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070077 "vec2 vertices[3];\n"
78 "out gl_PerVertex {\n"
79 " vec4 gl_Position;\n"
80 "};\n"
81 "void main() {\n"
82 " vertices[0] = vec2(-1.0, -1.0);\n"
83 " vertices[1] = vec2( 1.0, -1.0);\n"
84 " vertices[2] = vec2( 0.0, 1.0);\n"
85 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
86 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050087
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050088static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120089 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070090 "\n"
91 "layout(location = 0) out vec4 uFragColor;\n"
92 "void main(){\n"
93 " uFragColor = vec4(0,1,0,1);\n"
94 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050095
Karl Schultz6addd812016-02-02 17:17:23 -070096static VKAPI_ATTR VkBool32 VKAPI_CALL
97myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
98 uint64_t srcObject, size_t location, int32_t msgCode,
99 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -0600100
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600101// ********************************************************
102// ErrorMonitor Usage:
103//
104// Call SetDesiredFailureMsg with a string to be compared against all
105// encountered log messages. Passing NULL will match all log messages.
106// logMsg will return true for skipCall only if msg is matched or NULL.
107//
108// Call DesiredMsgFound to determine if the desired failure message
109// was encountered.
110
Tony Barbour300a6082015-04-07 13:44:53 -0600111class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700112 public:
113 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600114 test_platform_thread_create_mutex(&m_mutex);
115 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700116 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700117 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600118 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600119 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600120
Dustin Graves48458142016-04-29 16:11:55 -0600121 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
122
Karl Schultz6addd812016-02-02 17:17:23 -0700123 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200124 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600125 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600126 m_failureMsg.clear();
127 m_otherMsgs.clear();
128 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700129 m_msgFound = VK_FALSE;
130 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600131 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600132 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600133
Karl Schultz6addd812016-02-02 17:17:23 -0700134 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600135 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600136 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600137 if (m_bailout != NULL) {
138 *m_bailout = true;
139 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600140 string errorString(msgString);
141 if (msgFlags & m_msgFlags) {
142 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200143 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
144 m_otherMsgs.push_back(m_failureMsg);
145 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600146 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700147 m_msgFound = VK_TRUE;
148 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600149 } else {
150 m_otherMsgs.push_back(errorString);
151 }
152 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600153 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600154 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600155 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600156
Karl Schultz6addd812016-02-02 17:17:23 -0700157 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600158
Karl Schultz6addd812016-02-02 17:17:23 -0700159 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600160
Karl Schultz6addd812016-02-02 17:17:23 -0700161 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600162
Karl Schultz6addd812016-02-02 17:17:23 -0700163 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600164
Karl Schultz6addd812016-02-02 17:17:23 -0700165 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600166 vector<string> otherMsgs = GetOtherFailureMsgs();
167 cout << "Other error messages logged for this test were:" << endl;
168 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
169 cout << " " << *iter << endl;
170 }
171 }
172
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200173 /* helpers */
174
175 void ExpectSuccess() {
176 // match anything
177 SetDesiredFailureMsg(~0u, "");
178 }
179
180 void VerifyFound() {
181 // Not seeing the desired message is a failure. /Before/ throwing, dump
182 // any other messages.
183 if (!DesiredMsgFound()) {
184 DumpFailureMsgs();
185 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
186 }
187 }
188
189 void VerifyNotFound() {
190 // ExpectSuccess() configured us to match anything. Any error is a
191 // failure.
192 if (DesiredMsgFound()) {
193 DumpFailureMsgs();
194 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
195 }
196 }
197
Karl Schultz6addd812016-02-02 17:17:23 -0700198 private:
199 VkFlags m_msgFlags;
200 string m_desiredMsg;
201 string m_failureMsg;
202 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600203 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700204 bool *m_bailout;
205 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600206};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500207
Karl Schultz6addd812016-02-02 17:17:23 -0700208static VKAPI_ATTR VkBool32 VKAPI_CALL
209myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
210 uint64_t srcObject, size_t location, int32_t msgCode,
211 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
212 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700213 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700214 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600215 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600216 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600217 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600218 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600219}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500220
Karl Schultz6addd812016-02-02 17:17:23 -0700221class VkLayerTest : public VkRenderFramework {
222 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800223 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
224 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700225 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
226 BsoFailSelect failMask);
227 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
228 VkPipelineObj &pipelineobj,
229 VkDescriptorSetObj &descriptorSet,
230 BsoFailSelect failMask);
231 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
232 VkDescriptorSetObj &descriptorSet,
233 BsoFailSelect failMask) {
234 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
235 failMask);
236 }
Tony Barbour300a6082015-04-07 13:44:53 -0600237
Tony Barbourfe3351b2015-07-28 10:17:20 -0600238 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700239 VkResult BeginCommandBuffer() {
240 return BeginCommandBuffer(*m_commandBuffer);
241 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800242 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700243 void Draw(uint32_t vertexCount, uint32_t instanceCount,
244 uint32_t firstVertex, uint32_t firstInstance) {
245 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
246 firstInstance);
247 }
248 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
249 uint32_t firstIndex, int32_t vertexOffset,
250 uint32_t firstInstance) {
251 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
252 vertexOffset, firstInstance);
253 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800254 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700255 void QueueCommandBuffer(const VkFence &fence) {
256 m_commandBuffer->QueueCommandBuffer(fence);
257 }
258 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
259 VkDeviceSize offset, uint32_t binding) {
260 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
261 }
262 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
263 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
264 }
265
266 protected:
267 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600268
269 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600270 std::vector<const char *> instance_layer_names;
271 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600272 std::vector<const char *> instance_extension_names;
273 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600274
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700275 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600276 /*
277 * Since CreateDbgMsgCallback is an instance level extension call
278 * any extension / layer that utilizes that feature also needs
279 * to be enabled at create instance time.
280 */
Karl Schultz6addd812016-02-02 17:17:23 -0700281 // Use Threading layer first to protect others from
282 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700283 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600284 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800285 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700286 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800287 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
288 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600289 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700290 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600291
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700292 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600293 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800294 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700295 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800296 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
297 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600298 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700299 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600300
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600301 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600302 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800303 this->app_info.pApplicationName = "layer_tests";
304 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600305 this->app_info.pEngineName = "unittest";
306 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600307 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600308
Tony Barbour15524c32015-04-29 17:34:29 -0600309 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600310 InitFramework(instance_layer_names, device_layer_names,
311 instance_extension_names, device_extension_names,
312 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600313 }
314
315 virtual void TearDown() {
316 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600317 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600318 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600319 }
320};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500321
Karl Schultz6addd812016-02-02 17:17:23 -0700322VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600323 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600324
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800325 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600326
327 /*
328 * For render test all drawing happens in a single render pass
329 * on a single command buffer.
330 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200331 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800332 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600333 }
334
335 return result;
336}
337
Karl Schultz6addd812016-02-02 17:17:23 -0700338VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600339 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600340
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200341 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800342 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200343 }
Tony Barbour300a6082015-04-07 13:44:53 -0600344
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800345 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600346
347 return result;
348}
349
Karl Schultz6addd812016-02-02 17:17:23 -0700350void VkLayerTest::VKTriangleTest(const char *vertShaderText,
351 const char *fragShaderText,
352 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500353 // Create identity matrix
354 int i;
355 struct vktriangle_vs_uniform data;
356
357 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700358 glm::mat4 View = glm::mat4(1.0f);
359 glm::mat4 Model = glm::mat4(1.0f);
360 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500361 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700362 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500363
364 memcpy(&data.mvp, &MVP[0][0], matrixSize);
365
Karl Schultz6addd812016-02-02 17:17:23 -0700366 static const Vertex tri_data[] = {
367 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
368 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
369 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500370 };
371
Karl Schultz6addd812016-02-02 17:17:23 -0700372 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500373 data.position[i][0] = tri_data[i].posX;
374 data.position[i][1] = tri_data[i].posY;
375 data.position[i][2] = tri_data[i].posZ;
376 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700377 data.color[i][0] = tri_data[i].r;
378 data.color[i][1] = tri_data[i].g;
379 data.color[i][2] = tri_data[i].b;
380 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500381 }
382
383 ASSERT_NO_FATAL_FAILURE(InitState());
384 ASSERT_NO_FATAL_FAILURE(InitViewport());
385
Karl Schultz6addd812016-02-02 17:17:23 -0700386 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
387 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500388
Karl Schultz6addd812016-02-02 17:17:23 -0700389 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
390 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
391 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500392
393 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800394 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500395 pipelineobj.AddShader(&vs);
396 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600397 if (failMask & BsoFailLineWidth) {
398 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600399 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
400 ia_state.sType =
401 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
402 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
403 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600404 }
405 if (failMask & BsoFailDepthBias) {
406 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600407 VkPipelineRasterizationStateCreateInfo rs_state = {};
408 rs_state.sType =
409 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
410 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600411 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600412 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600413 }
Karl Schultz6addd812016-02-02 17:17:23 -0700414 // Viewport and scissors must stay in synch or other errors will occur than
415 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600416 if (failMask & BsoFailViewport) {
417 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600418 m_viewports.clear();
419 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600420 }
421 if (failMask & BsoFailScissor) {
422 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600423 m_scissors.clear();
424 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600425 }
426 if (failMask & BsoFailBlend) {
427 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600428 VkPipelineColorBlendAttachmentState att_state = {};
429 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
430 att_state.blendEnable = VK_TRUE;
431 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600432 }
433 if (failMask & BsoFailDepthBounds) {
434 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
435 }
436 if (failMask & BsoFailStencilReadMask) {
437 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
438 }
439 if (failMask & BsoFailStencilWriteMask) {
440 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
441 }
442 if (failMask & BsoFailStencilReference) {
443 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
444 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500445
446 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700447 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
448 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500449
450 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600451 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500452
Tony Barbourfe3351b2015-07-28 10:17:20 -0600453 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500454
455 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600456 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500457
458 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600459 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500460
Tony Barbourfe3351b2015-07-28 10:17:20 -0600461 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500462}
463
Karl Schultz6addd812016-02-02 17:17:23 -0700464void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
465 VkPipelineObj &pipelineobj,
466 VkDescriptorSetObj &descriptorSet,
467 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500468 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700469 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
470 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500471 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700472 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
473 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500474 }
475
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800476 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700477 // Make sure depthWriteEnable is set so that Depth fail test will work
478 // correctly
479 // Make sure stencilTestEnable is set so that Stencil fail test will work
480 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600481 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800482 stencil.failOp = VK_STENCIL_OP_KEEP;
483 stencil.passOp = VK_STENCIL_OP_KEEP;
484 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
485 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600486
487 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
488 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600489 ds_ci.pNext = NULL;
490 ds_ci.depthTestEnable = VK_FALSE;
491 ds_ci.depthWriteEnable = VK_TRUE;
492 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
493 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600494 if (failMask & BsoFailDepthBounds) {
495 ds_ci.depthBoundsTestEnable = VK_TRUE;
496 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600497 ds_ci.stencilTestEnable = VK_TRUE;
498 ds_ci.front = stencil;
499 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600500
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600501 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600502 pipelineobj.SetViewport(m_viewports);
503 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800504 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700505 VkResult err = pipelineobj.CreateVKPipeline(
506 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600507 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800508 commandBuffer->BindPipeline(pipelineobj);
509 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500510}
511
512// ********************************************************************************************************************
513// ********************************************************************************************************************
514// ********************************************************************************************************************
515// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600516#if PARAMETER_VALIDATION_TESTS
517TEST_F(VkLayerTest, RequiredParameter) {
518 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
519 "pointer, array, and array count parameters");
520
521 ASSERT_NO_FATAL_FAILURE(InitState());
522
523 m_errorMonitor->SetDesiredFailureMsg(
524 VK_DEBUG_REPORT_ERROR_BIT_EXT,
525 "required parameter pFeatures specified as NULL");
526 // Specify NULL for a pointer to a handle
527 // Expected to trigger an error with
528 // parameter_validation::validate_required_pointer
529 vkGetPhysicalDeviceFeatures(gpu(), NULL);
530 m_errorMonitor->VerifyFound();
531
532 m_errorMonitor->SetDesiredFailureMsg(
533 VK_DEBUG_REPORT_ERROR_BIT_EXT,
534 "required parameter pPhysicalDeviceCount specified as NULL");
535 // Specify NULL for pointer to array count
536 // Expected to trigger an error with parameter_validation::validate_array
537 vkEnumeratePhysicalDevices(instance(), NULL, NULL);
538 m_errorMonitor->VerifyFound();
539
540 m_errorMonitor->SetDesiredFailureMsg(
541 VK_DEBUG_REPORT_ERROR_BIT_EXT,
542 "parameter viewportCount must be greater than 0");
543 // Specify 0 for a required array count
544 // Expected to trigger an error with parameter_validation::validate_array
545 VkViewport view_port = {};
546 m_commandBuffer->SetViewport(0, 0, &view_port);
547 m_errorMonitor->VerifyFound();
548
549 m_errorMonitor->SetDesiredFailureMsg(
550 VK_DEBUG_REPORT_ERROR_BIT_EXT,
551 "required parameter pViewports specified as NULL");
552 // Specify NULL for a required array
553 // Expected to trigger an error with parameter_validation::validate_array
554 m_commandBuffer->SetViewport(0, 1, NULL);
555 m_errorMonitor->VerifyFound();
556
557 m_errorMonitor->SetDesiredFailureMsg(
558 VK_DEBUG_REPORT_ERROR_BIT_EXT,
559 "required parameter memory specified as VK_NULL_HANDLE");
560 // Specify VK_NULL_HANDLE for a required handle
561 // Expected to trigger an error with
562 // parameter_validation::validate_required_handle
563 vkUnmapMemory(device(), VK_NULL_HANDLE);
564 m_errorMonitor->VerifyFound();
565
566 m_errorMonitor->SetDesiredFailureMsg(
567 VK_DEBUG_REPORT_ERROR_BIT_EXT,
568 "required parameter pFences[0] specified as VK_NULL_HANDLE");
569 // Specify VK_NULL_HANDLE for a required handle array entry
570 // Expected to trigger an error with
571 // parameter_validation::validate_required_handle_array
572 VkFence fence = VK_NULL_HANDLE;
573 vkResetFences(device(), 1, &fence);
574 m_errorMonitor->VerifyFound();
575
576 m_errorMonitor->SetDesiredFailureMsg(
577 VK_DEBUG_REPORT_ERROR_BIT_EXT,
578 "required parameter pAllocateInfo specified as NULL");
579 // Specify NULL for a required struct pointer
580 // Expected to trigger an error with
581 // parameter_validation::validate_struct_type
582 VkDeviceMemory memory = VK_NULL_HANDLE;
583 vkAllocateMemory(device(), NULL, NULL, &memory);
584 m_errorMonitor->VerifyFound();
585
586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
587 "value of faceMask must not be 0");
588 // Specify 0 for a required VkFlags parameter
589 // Expected to trigger an error with parameter_validation::validate_flags
590 m_commandBuffer->SetStencilReference(0, 0);
591 m_errorMonitor->VerifyFound();
592
593 m_errorMonitor->SetDesiredFailureMsg(
594 VK_DEBUG_REPORT_ERROR_BIT_EXT,
595 "value of pSubmits[i].pWaitDstStageMask[0] must not be 0");
596 // Specify 0 for a required VkFlags array entry
597 // Expected to trigger an error with
598 // parameter_validation::validate_flags_array
599 VkSemaphore semaphore = VK_NULL_HANDLE;
600 VkPipelineStageFlags stageFlags = 0;
601 VkSubmitInfo submitInfo = {};
602 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
603 submitInfo.waitSemaphoreCount = 1;
604 submitInfo.pWaitSemaphores = &semaphore;
605 submitInfo.pWaitDstStageMask = &stageFlags;
606 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
607 m_errorMonitor->VerifyFound();
608}
609#endif // PARAMETER_VALIDATION_TESTS
610
Tobin Ehlis0788f522015-05-26 16:11:58 -0600611#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700612#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800613TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500614{
615 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500616 VkFenceCreateInfo fenceInfo = {};
617 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
618 fenceInfo.pNext = NULL;
619 fenceInfo.flags = 0;
620
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600622
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500623 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600624
625 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
626 vk_testing::Buffer buffer;
627 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500628
Tony Barbourfe3351b2015-07-28 10:17:20 -0600629 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800630 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600631 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500632
633 testFence.init(*m_device, fenceInfo);
634
635 // Bypass framework since it does the waits automatically
636 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600637 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800638 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
639 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800640 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600641 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700642 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800643 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800644 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800645 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600646 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600647
648 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500649 ASSERT_VK_SUCCESS( err );
650
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500651 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800652 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500653
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200654 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500655}
656
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800657TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500658{
659 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500660 VkFenceCreateInfo fenceInfo = {};
661 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
662 fenceInfo.pNext = NULL;
663 fenceInfo.flags = 0;
664
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600666
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500667 ASSERT_NO_FATAL_FAILURE(InitState());
668 ASSERT_NO_FATAL_FAILURE(InitViewport());
669 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
670
Tony Barbourfe3351b2015-07-28 10:17:20 -0600671 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800672 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600673 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500674
675 testFence.init(*m_device, fenceInfo);
676
677 // Bypass framework since it does the waits automatically
678 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600679 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800680 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
681 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800682 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600683 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700684 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800685 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800686 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800687 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600688 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600689
690 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500691 ASSERT_VK_SUCCESS( err );
692
Jon Ashburnf19916e2016-01-11 13:12:43 -0700693 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800694 VkCommandBufferBeginInfo info = {};
695 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
696 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600697 info.renderPass = VK_NULL_HANDLE;
698 info.subpass = 0;
699 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800700 info.occlusionQueryEnable = VK_FALSE;
701 info.queryFlags = 0;
702 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600703
704 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800705 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500706
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200707 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500708}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700709#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200710
Mark Lobodzinski152fe252016-05-03 16:49:15 -0600711// This is a positive test. No failures are expected.
712TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
713 VkResult err;
714 bool pass;
715
716 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
717 "the buffer, create an image, and bind the same memory to "
718 "it");
719
720 m_errorMonitor->ExpectSuccess();
721
722 ASSERT_NO_FATAL_FAILURE(InitState());
723
724 VkBuffer buffer;
725 VkImage image;
726 VkDeviceMemory mem;
727 VkMemoryRequirements mem_reqs;
728
729 VkBufferCreateInfo buf_info = {};
730 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
731 buf_info.pNext = NULL;
732 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
733 buf_info.size = 256;
734 buf_info.queueFamilyIndexCount = 0;
735 buf_info.pQueueFamilyIndices = NULL;
736 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
737 buf_info.flags = 0;
738 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
739 ASSERT_VK_SUCCESS(err);
740
741 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
742
743 VkMemoryAllocateInfo alloc_info = {};
744 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
745 alloc_info.pNext = NULL;
746 alloc_info.memoryTypeIndex = 0;
747
748 // Ensure memory is big enough for both bindings
749 alloc_info.allocationSize = 0x10000;
750
751 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
752 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
753 if (!pass) {
754 vkDestroyBuffer(m_device->device(), buffer, NULL);
755 return;
756 }
757
758 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
759 ASSERT_VK_SUCCESS(err);
760
761 uint8_t *pData;
762 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
763 (void **)&pData);
764 ASSERT_VK_SUCCESS(err);
765
Mark Lobodzinski2abefa92016-05-05 11:45:57 -0600766 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -0600767
768 vkUnmapMemory(m_device->device(), mem);
769
770 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
771 ASSERT_VK_SUCCESS(err);
772
773 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
774 // memory. In fact, it was never used by the GPU.
775 // Just be be sure, wait for idle.
776 vkDestroyBuffer(m_device->device(), buffer, NULL);
777 vkDeviceWaitIdle(m_device->device());
778
779 VkImageCreateInfo image_create_info = {};
780 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
781 image_create_info.pNext = NULL;
782 image_create_info.imageType = VK_IMAGE_TYPE_2D;
783 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
784 image_create_info.extent.width = 64;
785 image_create_info.extent.height = 64;
786 image_create_info.extent.depth = 1;
787 image_create_info.mipLevels = 1;
788 image_create_info.arrayLayers = 1;
789 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
790 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
791 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
792 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
793 image_create_info.queueFamilyIndexCount = 0;
794 image_create_info.pQueueFamilyIndices = NULL;
795 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
796 image_create_info.flags = 0;
797
798 VkMemoryAllocateInfo mem_alloc = {};
799 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
800 mem_alloc.pNext = NULL;
801 mem_alloc.allocationSize = 0;
802 mem_alloc.memoryTypeIndex = 0;
803
804 /* Create a mappable image. It will be the texture if linear images are ok
805 * to be textures or it will be the staging image if they are not.
806 */
807 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
808 ASSERT_VK_SUCCESS(err);
809
810 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
811
812 mem_alloc.allocationSize = mem_reqs.size;
813
814 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
815 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
816 if (!pass) {
817 vkDestroyImage(m_device->device(), image, NULL);
818 return;
819 }
820
821 // VALDIATION FAILURE:
822 err = vkBindImageMemory(m_device->device(), image, mem, 0);
823 ASSERT_VK_SUCCESS(err);
824
825 m_errorMonitor->VerifyNotFound();
826
827 vkDestroyBuffer(m_device->device(), buffer, NULL);
828 vkDestroyImage(m_device->device(), image, NULL);
829}
830
Ian Elliott1c32c772016-04-28 14:47:13 -0600831TEST_F(VkLayerTest, EnableWsiBeforeUse) {
832 VkResult err;
833 bool pass;
834
Ian Elliott489eec02016-05-05 14:12:44 -0600835// FIXME: After we turn on this code for non-Linux platforms, uncomment the
836// following declaration (which is temporarily being moved below):
837// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -0600838 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
839 VkSwapchainCreateInfoKHR swapchain_create_info = {};
840 uint32_t swapchain_image_count = 0;
841// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
842 uint32_t image_index = 0;
843// VkPresentInfoKHR present_info = {};
844
845 ASSERT_NO_FATAL_FAILURE(InitState());
846
Ian Elliott3f06ce52016-04-29 14:46:21 -0600847#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
848#if defined(VK_USE_PLATFORM_ANDROID_KHR)
849 // Use the functions from the VK_KHR_android_surface extension without
850 // enabling that extension:
851
852 // Create a surface:
853 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
854#if 0
855#endif
856 m_errorMonitor->SetDesiredFailureMsg(
857 VK_DEBUG_REPORT_ERROR_BIT_EXT,
858 "extension was not enabled for this");
859 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
860 &surface);
861 pass = (err != VK_SUCCESS);
862 ASSERT_TRUE(pass);
863 m_errorMonitor->VerifyFound();
864#endif // VK_USE_PLATFORM_ANDROID_KHR
865
866
867#if defined(VK_USE_PLATFORM_MIR_KHR)
868 // Use the functions from the VK_KHR_mir_surface extension without enabling
869 // that extension:
870
871 // Create a surface:
872 VkMirSurfaceCreateInfoKHR mir_create_info = {};
873#if 0
874#endif
875 m_errorMonitor->SetDesiredFailureMsg(
876 VK_DEBUG_REPORT_ERROR_BIT_EXT,
877 "extension was not enabled for this");
878 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
879 pass = (err != VK_SUCCESS);
880 ASSERT_TRUE(pass);
881 m_errorMonitor->VerifyFound();
882
883 // Tell whether an mir_connection supports presentation:
884 MirConnection *mir_connection = NULL;
885 m_errorMonitor->SetDesiredFailureMsg(
886 VK_DEBUG_REPORT_ERROR_BIT_EXT,
887 "extension was not enabled for this");
888 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
889 visual_id);
890 m_errorMonitor->VerifyFound();
891#endif // VK_USE_PLATFORM_MIR_KHR
892
893
894#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
895 // Use the functions from the VK_KHR_wayland_surface extension without
896 // enabling that extension:
897
898 // Create a surface:
899 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
900#if 0
901#endif
902 m_errorMonitor->SetDesiredFailureMsg(
903 VK_DEBUG_REPORT_ERROR_BIT_EXT,
904 "extension was not enabled for this");
905 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
906 &surface);
907 pass = (err != VK_SUCCESS);
908 ASSERT_TRUE(pass);
909 m_errorMonitor->VerifyFound();
910
911 // Tell whether an wayland_display supports presentation:
912 struct wl_display wayland_display = {};
913 m_errorMonitor->SetDesiredFailureMsg(
914 VK_DEBUG_REPORT_ERROR_BIT_EXT,
915 "extension was not enabled for this");
916 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
917 &wayland_display);
918 m_errorMonitor->VerifyFound();
919#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -0600920#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -0600921
922
923#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -0600924// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
925// TO NON-LINUX PLATFORMS:
926VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -0600927 // Use the functions from the VK_KHR_win32_surface extension without
928 // enabling that extension:
929
930 // Create a surface:
931 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
932#if 0
933#endif
934 m_errorMonitor->SetDesiredFailureMsg(
935 VK_DEBUG_REPORT_ERROR_BIT_EXT,
936 "extension was not enabled for this");
937 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
938 &surface);
939 pass = (err != VK_SUCCESS);
940 ASSERT_TRUE(pass);
941 m_errorMonitor->VerifyFound();
942
943 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -0600944 m_errorMonitor->SetDesiredFailureMsg(
945 VK_DEBUG_REPORT_ERROR_BIT_EXT,
946 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -0600947 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -0600948 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -0600949// Set this (for now, until all platforms are supported and tested):
950#define NEED_TO_TEST_THIS_ON_PLATFORM
951#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -0600952
953
Ian Elliott1c32c772016-04-28 14:47:13 -0600954#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -0600955// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
956// TO NON-LINUX PLATFORMS:
957VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -0600958 // Use the functions from the VK_KHR_xcb_surface extension without enabling
959 // that extension:
960
961 // Create a surface:
962 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
963#if 0
964#endif
965 m_errorMonitor->SetDesiredFailureMsg(
966 VK_DEBUG_REPORT_ERROR_BIT_EXT,
967 "extension was not enabled for this");
968 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
969 pass = (err != VK_SUCCESS);
970 ASSERT_TRUE(pass);
971 m_errorMonitor->VerifyFound();
972
973 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -0600974 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -0600975 xcb_visualid_t visual_id = 0;
976 m_errorMonitor->SetDesiredFailureMsg(
977 VK_DEBUG_REPORT_ERROR_BIT_EXT,
978 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -0600979 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -0600980 visual_id);
981 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -0600982// Set this (for now, until all platforms are supported and tested):
983#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -0600984#endif // VK_USE_PLATFORM_XCB_KHR
985
986
Ian Elliott12630812016-04-29 14:35:43 -0600987#if defined(VK_USE_PLATFORM_XLIB_KHR)
988 // Use the functions from the VK_KHR_xlib_surface extension without enabling
989 // that extension:
990
991 // Create a surface:
992 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
993#if 0
994#endif
995 m_errorMonitor->SetDesiredFailureMsg(
996 VK_DEBUG_REPORT_ERROR_BIT_EXT,
997 "extension was not enabled for this");
998 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
999 pass = (err != VK_SUCCESS);
1000 ASSERT_TRUE(pass);
1001 m_errorMonitor->VerifyFound();
1002
1003 // Tell whether an Xlib VisualID supports presentation:
1004 Display *dpy = NULL;
1005 VisualID visual = 0;
1006 m_errorMonitor->SetDesiredFailureMsg(
1007 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1008 "extension was not enabled for this");
1009 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1010 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001011// Set this (for now, until all platforms are supported and tested):
1012#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06001013#endif // VK_USE_PLATFORM_XLIB_KHR
1014
1015
Ian Elliott1c32c772016-04-28 14:47:13 -06001016 // Use the functions from the VK_KHR_surface extension without enabling
1017 // that extension:
1018
Ian Elliott489eec02016-05-05 14:12:44 -06001019#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001020 // Destroy a surface:
1021 m_errorMonitor->SetDesiredFailureMsg(
1022 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1023 "extension was not enabled for this");
1024 vkDestroySurfaceKHR(instance(), surface, NULL);
1025 m_errorMonitor->VerifyFound();
1026
1027 // Check if surface supports presentation:
1028 VkBool32 supported = false;
1029 m_errorMonitor->SetDesiredFailureMsg(
1030 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1031 "extension was not enabled for this");
1032 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1033 pass = (err != VK_SUCCESS);
1034 ASSERT_TRUE(pass);
1035 m_errorMonitor->VerifyFound();
1036
1037 // Check surface capabilities:
1038 VkSurfaceCapabilitiesKHR capabilities = {};
1039 m_errorMonitor->SetDesiredFailureMsg(
1040 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1041 "extension was not enabled for this");
1042 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
1043 &capabilities);
1044 pass = (err != VK_SUCCESS);
1045 ASSERT_TRUE(pass);
1046 m_errorMonitor->VerifyFound();
1047
1048 // Check surface formats:
1049 uint32_t format_count = 0;
1050 VkSurfaceFormatKHR *formats = NULL;
1051 m_errorMonitor->SetDesiredFailureMsg(
1052 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1053 "extension was not enabled for this");
1054 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1055 &format_count, formats);
1056 pass = (err != VK_SUCCESS);
1057 ASSERT_TRUE(pass);
1058 m_errorMonitor->VerifyFound();
1059
1060 // Check surface present modes:
1061 uint32_t present_mode_count = 0;
1062 VkSurfaceFormatKHR *present_modes = NULL;
1063 m_errorMonitor->SetDesiredFailureMsg(
1064 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1065 "extension was not enabled for this");
1066 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1067 &present_mode_count, present_modes);
1068 pass = (err != VK_SUCCESS);
1069 ASSERT_TRUE(pass);
1070 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001071#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001072
1073
1074 // Use the functions from the VK_KHR_swapchain extension without enabling
1075 // that extension:
1076
1077 // Create a swapchain:
1078 m_errorMonitor->SetDesiredFailureMsg(
1079 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1080 "extension was not enabled for this");
1081 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1082 swapchain_create_info.pNext = NULL;
1083#if 0
1084 swapchain_create_info.flags = 0;
1085 swapchain_create_info.surface = 0;
1086 swapchain_create_info.minImageCount = 0;
1087 swapchain_create_info.imageFormat = 0;
1088 swapchain_create_info.imageColorSpace = 0;
1089 swapchain_create_info.imageExtent.width = 0;
1090 swapchain_create_info.imageExtent.height = 0;
1091 swapchain_create_info.imageArrayLayers = 0;
1092 swapchain_create_info.imageUsage = 0;
1093 swapchain_create_info.imageSharingMode = 0;
1094 swapchain_create_info.queueFamilyIndexCount = 0;
1095 swapchain_create_info.preTransform = 0;
1096 swapchain_create_info.compositeAlpha = 0;
1097 swapchain_create_info.presentMode = 0;
1098 swapchain_create_info.clipped = 0;
1099 swapchain_create_info.oldSwapchain = NULL;
1100#endif
1101 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1102 NULL, &swapchain);
1103 pass = (err != VK_SUCCESS);
1104 ASSERT_TRUE(pass);
1105 m_errorMonitor->VerifyFound();
1106
1107 // Get the images from the swapchain:
1108 m_errorMonitor->SetDesiredFailureMsg(
1109 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1110 "extension was not enabled for this");
1111 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
1112 &swapchain_image_count, NULL);
1113 pass = (err != VK_SUCCESS);
1114 ASSERT_TRUE(pass);
1115 m_errorMonitor->VerifyFound();
1116
1117 // Try to acquire an image:
1118 m_errorMonitor->SetDesiredFailureMsg(
1119 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1120 "extension was not enabled for this");
1121 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
1122 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
1123 pass = (err != VK_SUCCESS);
1124 ASSERT_TRUE(pass);
1125 m_errorMonitor->VerifyFound();
1126
1127 // Try to present an image:
1128#if 0 // NOTE: Currently can't test this because a real swapchain is needed
1129 // (as opposed to the fake one we created) in order for the layer to
1130 // lookup the VkDevice used to enable the extension:
1131 m_errorMonitor->SetDesiredFailureMsg(
1132 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1133 "extension was not enabled for this");
1134 present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
1135 present_info.pNext = NULL;
1136#if 0
1137#endif
1138 err = vkQueuePresentKHR(m_device->m_queue, &present_info);
1139 pass = (err != VK_SUCCESS);
1140 ASSERT_TRUE(pass);
1141 m_errorMonitor->VerifyFound();
1142#endif
1143
1144 // Destroy the swapchain:
1145 m_errorMonitor->SetDesiredFailureMsg(
1146 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1147 "extension was not enabled for this");
1148 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1149 m_errorMonitor->VerifyFound();
1150}
1151
Karl Schultz6addd812016-02-02 17:17:23 -07001152TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1153 VkResult err;
1154 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001155
Karl Schultz6addd812016-02-02 17:17:23 -07001156 m_errorMonitor->SetDesiredFailureMsg(
1157 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001158 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
1159
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001160 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001161
1162 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001163 VkImage image;
1164 VkDeviceMemory mem;
1165 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001166
Karl Schultz6addd812016-02-02 17:17:23 -07001167 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1168 const int32_t tex_width = 32;
1169 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001170
Tony Barboureb254902015-07-15 12:50:33 -06001171 VkImageCreateInfo image_create_info = {};
1172 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001173 image_create_info.pNext = NULL;
1174 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1175 image_create_info.format = tex_format;
1176 image_create_info.extent.width = tex_width;
1177 image_create_info.extent.height = tex_height;
1178 image_create_info.extent.depth = 1;
1179 image_create_info.mipLevels = 1;
1180 image_create_info.arrayLayers = 1;
1181 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1182 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1183 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1184 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001185
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001186 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001187 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001188 mem_alloc.pNext = NULL;
1189 mem_alloc.allocationSize = 0;
1190 // Introduce failure, do NOT set memProps to
1191 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
1192 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001193
Chia-I Wuf7458c52015-10-26 21:10:41 +08001194 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001195 ASSERT_VK_SUCCESS(err);
1196
Karl Schultz6addd812016-02-02 17:17:23 -07001197 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001198
Mark Lobodzinski23065352015-05-29 09:32:35 -05001199 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001200
Karl Schultz6addd812016-02-02 17:17:23 -07001201 pass =
1202 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
1203 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1204 if (!pass) { // If we can't find any unmappable memory this test doesn't
1205 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08001206 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06001207 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06001208 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06001209
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001210 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001211 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001212 ASSERT_VK_SUCCESS(err);
1213
1214 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06001215 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001216 ASSERT_VK_SUCCESS(err);
1217
1218 // Map memory as if to initialize the image
1219 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07001220 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
1221 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001222
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001223 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001224
Chia-I Wuf7458c52015-10-26 21:10:41 +08001225 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001226}
1227
Karl Schultz6addd812016-02-02 17:17:23 -07001228TEST_F(VkLayerTest, RebindMemory) {
1229 VkResult err;
1230 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001231
Karl Schultz6addd812016-02-02 17:17:23 -07001232 m_errorMonitor->SetDesiredFailureMsg(
1233 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001234 "which has already been bound to mem object");
1235
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001236 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001237
1238 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001239 VkImage image;
1240 VkDeviceMemory mem1;
1241 VkDeviceMemory mem2;
1242 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001243
Karl Schultz6addd812016-02-02 17:17:23 -07001244 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1245 const int32_t tex_width = 32;
1246 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001247
Tony Barboureb254902015-07-15 12:50:33 -06001248 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001249 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1250 image_create_info.pNext = NULL;
1251 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1252 image_create_info.format = tex_format;
1253 image_create_info.extent.width = tex_width;
1254 image_create_info.extent.height = tex_height;
1255 image_create_info.extent.depth = 1;
1256 image_create_info.mipLevels = 1;
1257 image_create_info.arrayLayers = 1;
1258 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1259 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1260 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1261 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001262
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001263 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001264 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1265 mem_alloc.pNext = NULL;
1266 mem_alloc.allocationSize = 0;
1267 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06001268
Karl Schultz6addd812016-02-02 17:17:23 -07001269 // Introduce failure, do NOT set memProps to
1270 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06001271 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001272 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001273 ASSERT_VK_SUCCESS(err);
1274
Karl Schultz6addd812016-02-02 17:17:23 -07001275 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001276
1277 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001278 pass =
1279 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001280 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001281
1282 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001283 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001284 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001285 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001286 ASSERT_VK_SUCCESS(err);
1287
1288 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06001289 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001290 ASSERT_VK_SUCCESS(err);
1291
Karl Schultz6addd812016-02-02 17:17:23 -07001292 // Introduce validation failure, try to bind a different memory object to
1293 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06001294 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001295
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001296 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001297
Chia-I Wuf7458c52015-10-26 21:10:41 +08001298 vkDestroyImage(m_device->device(), image, NULL);
1299 vkFreeMemory(m_device->device(), mem1, NULL);
1300 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001301}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001302
Karl Schultz6addd812016-02-02 17:17:23 -07001303TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001304 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001305
Karl Schultz6addd812016-02-02 17:17:23 -07001306 m_errorMonitor->SetDesiredFailureMsg(
1307 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
1308 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001309
1310 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001311 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1312 fenceInfo.pNext = NULL;
1313 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06001314
Tony Barbour300a6082015-04-07 13:44:53 -06001315 ASSERT_NO_FATAL_FAILURE(InitState());
1316 ASSERT_NO_FATAL_FAILURE(InitViewport());
1317 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1318
Tony Barbourfe3351b2015-07-28 10:17:20 -06001319 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001320 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1321 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001322 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06001323
1324 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001325
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001326 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001327 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1328 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001329 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001330 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001331 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001332 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001333 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001334 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001335 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001336
1337 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001338 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001339
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001340 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001341}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001342// This is a positive test. We used to expect error in this case but spec now
1343// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07001344TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001345 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001346 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001347 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001348 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1349 fenceInfo.pNext = NULL;
1350
Tony Barbour0b4d9562015-04-09 10:48:04 -06001351 ASSERT_NO_FATAL_FAILURE(InitState());
1352 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08001353 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001354 VkResult result = vkResetFences(m_device->device(), 1, fences);
1355 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06001356
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001357 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06001358}
Tobin Ehlis41376e12015-07-03 08:45:14 -06001359
1360TEST_F(VkLayerTest, InvalidUsageBits)
1361{
Tony Barbourf92621a2016-05-02 14:28:12 -06001362 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001363 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06001364 "Initialize buffer with wrong usage then perform copy expecting errors "
1365 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001367 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001368
1369 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06001370 VkImageObj image(m_device);
1371 // Initialize image with USAGE_INPUT_ATTACHMENT
1372 image.init(128, 128, VK_FORMAT_D32_SFLOAT_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001373 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1374 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06001375
Tony Barbourf92621a2016-05-02 14:28:12 -06001376 VkImageView dsv;
1377 VkImageViewCreateInfo dsvci = {};
1378 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1379 dsvci.image = image.handle();
1380 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
1381 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
1382 dsvci.subresourceRange.layerCount = 1;
1383 dsvci.subresourceRange.baseMipLevel = 0;
1384 dsvci.subresourceRange.levelCount = 1;
1385 dsvci.subresourceRange.aspectMask =
1386 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06001387
Tony Barbourf92621a2016-05-02 14:28:12 -06001388 // Create a view with depth / stencil aspect for image with different usage
1389 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001390
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001391 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06001392
1393 // Initialize buffer with TRANSFER_DST usage
1394 vk_testing::Buffer buffer;
1395 VkMemoryPropertyFlags reqs = 0;
1396 buffer.init_as_dst(*m_device, 128 * 128, reqs);
1397 VkBufferImageCopy region = {};
1398 region.bufferRowLength = 128;
1399 region.bufferImageHeight = 128;
1400 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1401 region.imageSubresource.layerCount = 1;
1402 region.imageExtent.height = 16;
1403 region.imageExtent.width = 16;
1404 region.imageExtent.depth = 1;
1405
1406 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1407 "Invalid usage flag for buffer ");
1408 // Buffer usage not set to TRANSFER_SRC and image usage not set to
1409 // TRANSFER_DST
1410 BeginCommandBuffer();
1411 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1412 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1413 1, &region);
1414 m_errorMonitor->VerifyFound();
1415
1416 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1417 "Invalid usage flag for image ");
1418 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1419 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1420 1, &region);
1421 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06001422}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001423#endif // MEM_TRACKER_TESTS
1424
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06001425#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06001426
1427TEST_F(VkLayerTest, LeakAnObject) {
1428 VkResult err;
1429
1430 TEST_DESCRIPTION(
1431 "Create a fence and destroy its device without first destroying the fence.");
1432
1433 // Note that we have to create a new device since destroying the
1434 // framework's device causes Teardown() to fail and just calling Teardown
1435 // will destroy the errorMonitor.
1436
1437 m_errorMonitor->SetDesiredFailureMsg(
1438 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1439 "OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT object");
1440
1441 ASSERT_NO_FATAL_FAILURE(InitState());
1442
1443 const std::vector<VkQueueFamilyProperties> queue_props =
1444 m_device->queue_props;
1445 std::vector<VkDeviceQueueCreateInfo> queue_info;
1446 queue_info.reserve(queue_props.size());
1447 std::vector<std::vector<float>> queue_priorities;
1448 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
1449 VkDeviceQueueCreateInfo qi = {};
1450 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
1451 qi.pNext = NULL;
1452 qi.queueFamilyIndex = i;
1453 qi.queueCount = queue_props[i].queueCount;
1454 queue_priorities.emplace_back(qi.queueCount, 0.0f);
1455 qi.pQueuePriorities = queue_priorities[i].data();
1456 queue_info.push_back(qi);
1457 }
1458
1459 std::vector<const char *> device_layer_names;
1460 std::vector<const char *> device_extension_names;
1461 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
1462 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
1463 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
1464 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
1465 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
1466 device_layer_names.push_back("VK_LAYER_LUNARG_image");
1467 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
1468
1469 // The sacrificial device object
1470 VkDevice testDevice;
1471 VkDeviceCreateInfo device_create_info = {};
1472 auto features = m_device->phy().features();
1473 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
1474 device_create_info.pNext = NULL;
1475 device_create_info.queueCreateInfoCount = queue_info.size();
1476 device_create_info.pQueueCreateInfos = queue_info.data();
1477 device_create_info.enabledLayerCount = device_layer_names.size();
1478 device_create_info.ppEnabledLayerNames = device_layer_names.data();
1479 device_create_info.pEnabledFeatures = &features;
1480 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
1481 ASSERT_VK_SUCCESS(err);
1482
1483 VkFence fence;
1484 VkFenceCreateInfo fence_create_info = {};
1485 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1486 fence_create_info.pNext = NULL;
1487 fence_create_info.flags = 0;
1488 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
1489 ASSERT_VK_SUCCESS(err);
1490
1491 // Induce failure by not calling vkDestroyFence
1492 vkDestroyDevice(testDevice, NULL);
1493 m_errorMonitor->VerifyFound();
1494}
1495
1496TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
1497
1498 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
1499 "attempt to delete them from another.");
1500
1501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1502 "FreeCommandBuffers is attempting to free Command Buffer");
1503
1504 VkCommandPool command_pool_one;
1505 VkCommandPool command_pool_two;
1506
1507 VkCommandPoolCreateInfo pool_create_info{};
1508 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1509 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1510 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1511
1512 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1513 &command_pool_one);
1514
1515 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1516 &command_pool_two);
1517
1518 VkCommandBuffer command_buffer[9];
1519 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1520 command_buffer_allocate_info.sType =
1521 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1522 command_buffer_allocate_info.commandPool = command_pool_one;
1523 command_buffer_allocate_info.commandBufferCount = 9;
1524 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1525 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1526 command_buffer);
1527
1528 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
1529 &command_buffer[3]);
1530
1531 m_errorMonitor->VerifyFound();
1532
1533 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
1534 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
1535}
1536
1537TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
1538 VkResult err;
1539
1540 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
1541 "attempt to delete them from another.");
1542
1543 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1544 "FreeDescriptorSets is attempting to free descriptorSet");
1545
1546 ASSERT_NO_FATAL_FAILURE(InitState());
1547 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1548
1549 VkDescriptorPoolSize ds_type_count = {};
1550 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
1551 ds_type_count.descriptorCount = 1;
1552
1553 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1554 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1555 ds_pool_ci.pNext = NULL;
1556 ds_pool_ci.flags = 0;
1557 ds_pool_ci.maxSets = 1;
1558 ds_pool_ci.poolSizeCount = 1;
1559 ds_pool_ci.pPoolSizes = &ds_type_count;
1560
1561 VkDescriptorPool ds_pool_one;
1562 err =
1563 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
1564 ASSERT_VK_SUCCESS(err);
1565
1566 // Create a second descriptor pool
1567 VkDescriptorPool ds_pool_two;
1568 err =
1569 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
1570 ASSERT_VK_SUCCESS(err);
1571
1572 VkDescriptorSetLayoutBinding dsl_binding = {};
1573 dsl_binding.binding = 0;
1574 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1575 dsl_binding.descriptorCount = 1;
1576 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1577 dsl_binding.pImmutableSamplers = NULL;
1578
1579 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1580 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1581 ds_layout_ci.pNext = NULL;
1582 ds_layout_ci.bindingCount = 1;
1583 ds_layout_ci.pBindings = &dsl_binding;
1584
1585 VkDescriptorSetLayout ds_layout;
1586 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1587 &ds_layout);
1588 ASSERT_VK_SUCCESS(err);
1589
1590 VkDescriptorSet descriptorSet;
1591 VkDescriptorSetAllocateInfo alloc_info = {};
1592 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1593 alloc_info.descriptorSetCount = 1;
1594 alloc_info.descriptorPool = ds_pool_one;
1595 alloc_info.pSetLayouts = &ds_layout;
1596 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1597 &descriptorSet);
1598 ASSERT_VK_SUCCESS(err);
1599
1600 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
1601
1602 m_errorMonitor->VerifyFound();
1603
1604 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1605 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
1606 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
1607}
1608
1609TEST_F(VkLayerTest, CreateUnknownObject) {
1610 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1611 "Invalid VkImage Object ");
1612
1613 TEST_DESCRIPTION(
1614 "Pass an invalid image object handle into a Vulkan API call.");
1615
1616 ASSERT_NO_FATAL_FAILURE(InitState());
1617
1618 // Pass bogus handle into GetImageMemoryRequirements
1619 VkMemoryRequirements mem_reqs;
1620 uint64_t fakeImageHandle = 0xCADECADE;
1621 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
1622
1623 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
1624
1625 m_errorMonitor->VerifyFound();
1626}
1627
Karl Schultz6addd812016-02-02 17:17:23 -07001628TEST_F(VkLayerTest, PipelineNotBound) {
1629 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001630
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06001631 TEST_DESCRIPTION(
1632 "Pass in an invalid pipeline object handle into a Vulkan API call.");
1633
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001635 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001636
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001637 ASSERT_NO_FATAL_FAILURE(InitState());
1638 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001639
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001640 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001641 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1642 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001643
1644 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001645 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1646 ds_pool_ci.pNext = NULL;
1647 ds_pool_ci.maxSets = 1;
1648 ds_pool_ci.poolSizeCount = 1;
1649 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001650
1651 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001652 err =
1653 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001654 ASSERT_VK_SUCCESS(err);
1655
1656 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001657 dsl_binding.binding = 0;
1658 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1659 dsl_binding.descriptorCount = 1;
1660 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1661 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001662
1663 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001664 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1665 ds_layout_ci.pNext = NULL;
1666 ds_layout_ci.bindingCount = 1;
1667 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001668
1669 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001670 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1671 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001672 ASSERT_VK_SUCCESS(err);
1673
1674 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001675 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001676 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001677 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001678 alloc_info.descriptorPool = ds_pool;
1679 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001680 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1681 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001682 ASSERT_VK_SUCCESS(err);
1683
1684 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001685 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1686 pipeline_layout_ci.pNext = NULL;
1687 pipeline_layout_ci.setLayoutCount = 1;
1688 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001689
1690 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001691 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1692 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001693 ASSERT_VK_SUCCESS(err);
1694
Mark Youngad779052016-01-06 14:26:04 -07001695 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001696
1697 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001698 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1699 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001700
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001701 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001702
Chia-I Wuf7458c52015-10-26 21:10:41 +08001703 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1704 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1705 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001706}
1707
Karl Schultz6addd812016-02-02 17:17:23 -07001708TEST_F(VkLayerTest, BindInvalidMemory) {
1709 VkResult err;
1710 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001711
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001713 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001714
Tobin Ehlisec598302015-09-15 15:02:17 -06001715 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001716
1717 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001718 VkImage image;
1719 VkDeviceMemory mem;
1720 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001721
Karl Schultz6addd812016-02-02 17:17:23 -07001722 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1723 const int32_t tex_width = 32;
1724 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001725
1726 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001727 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1728 image_create_info.pNext = NULL;
1729 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1730 image_create_info.format = tex_format;
1731 image_create_info.extent.width = tex_width;
1732 image_create_info.extent.height = tex_height;
1733 image_create_info.extent.depth = 1;
1734 image_create_info.mipLevels = 1;
1735 image_create_info.arrayLayers = 1;
1736 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1737 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1738 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1739 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001740
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001741 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001742 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1743 mem_alloc.pNext = NULL;
1744 mem_alloc.allocationSize = 0;
1745 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001746
Chia-I Wuf7458c52015-10-26 21:10:41 +08001747 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001748 ASSERT_VK_SUCCESS(err);
1749
Karl Schultz6addd812016-02-02 17:17:23 -07001750 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001751
1752 mem_alloc.allocationSize = mem_reqs.size;
1753
Karl Schultz6addd812016-02-02 17:17:23 -07001754 pass =
1755 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001756 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001757
1758 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001759 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001760 ASSERT_VK_SUCCESS(err);
1761
1762 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001763 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001764
1765 // Try to bind free memory that has been freed
1766 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1767 // This may very well return an error.
1768 (void)err;
1769
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001770 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001771
Chia-I Wuf7458c52015-10-26 21:10:41 +08001772 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001773}
1774
Karl Schultz6addd812016-02-02 17:17:23 -07001775TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1776 VkResult err;
1777 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001778
Karl Schultz6addd812016-02-02 17:17:23 -07001779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1780 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001781
Tobin Ehlisec598302015-09-15 15:02:17 -06001782 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001783
Karl Schultz6addd812016-02-02 17:17:23 -07001784 // Create an image object, allocate memory, destroy the object and then try
1785 // to bind it
1786 VkImage image;
1787 VkDeviceMemory mem;
1788 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001789
Karl Schultz6addd812016-02-02 17:17:23 -07001790 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1791 const int32_t tex_width = 32;
1792 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001793
1794 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001795 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1796 image_create_info.pNext = NULL;
1797 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1798 image_create_info.format = tex_format;
1799 image_create_info.extent.width = tex_width;
1800 image_create_info.extent.height = tex_height;
1801 image_create_info.extent.depth = 1;
1802 image_create_info.mipLevels = 1;
1803 image_create_info.arrayLayers = 1;
1804 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1805 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1806 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1807 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001808
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001809 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001810 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1811 mem_alloc.pNext = NULL;
1812 mem_alloc.allocationSize = 0;
1813 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001814
Chia-I Wuf7458c52015-10-26 21:10:41 +08001815 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001816 ASSERT_VK_SUCCESS(err);
1817
Karl Schultz6addd812016-02-02 17:17:23 -07001818 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001819
1820 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001821 pass =
1822 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001823 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001824
1825 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001826 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001827 ASSERT_VK_SUCCESS(err);
1828
1829 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001830 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001831 ASSERT_VK_SUCCESS(err);
1832
1833 // Now Try to bind memory to this destroyed object
1834 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1835 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001836 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001837
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001838 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001839
Chia-I Wuf7458c52015-10-26 21:10:41 +08001840 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001841}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001842
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001843#endif // OBJ_TRACKER_TESTS
1844
Tobin Ehlis0788f522015-05-26 16:11:58 -06001845#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001846
1847// This is a positive test. No errors should be generated.
1848TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
1849
1850 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1851 "submitted on separate queues followed by a QueueWaitIdle.");
1852
Dustin Graves48458142016-04-29 16:11:55 -06001853 if ((m_device->queue_props.empty()) ||
1854 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001855 return;
1856
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001857 m_errorMonitor->ExpectSuccess();
1858
1859 VkSemaphore semaphore;
1860 VkSemaphoreCreateInfo semaphore_create_info{};
1861 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1862 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1863 &semaphore);
1864
1865 VkCommandPool command_pool;
1866 VkCommandPoolCreateInfo pool_create_info{};
1867 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1868 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1869 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1870 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1871 &command_pool);
1872
1873 VkCommandBuffer command_buffer[2];
1874 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1875 command_buffer_allocate_info.sType =
1876 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1877 command_buffer_allocate_info.commandPool = command_pool;
1878 command_buffer_allocate_info.commandBufferCount = 2;
1879 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1880 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1881 command_buffer);
1882
1883 VkQueue queue = VK_NULL_HANDLE;
1884 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1885 1, &queue);
1886
1887 {
1888 VkCommandBufferBeginInfo begin_info{};
1889 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1890 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1891
1892 vkCmdPipelineBarrier(command_buffer[0],
1893 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1894 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1895 0, nullptr, 0, nullptr);
1896
1897 VkViewport viewport{};
1898 viewport.maxDepth = 1.0f;
1899 viewport.minDepth = 0.0f;
1900 viewport.width = 512;
1901 viewport.height = 512;
1902 viewport.x = 0;
1903 viewport.y = 0;
1904 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1905 vkEndCommandBuffer(command_buffer[0]);
1906 }
1907 {
1908 VkCommandBufferBeginInfo begin_info{};
1909 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1910 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1911
1912 VkViewport viewport{};
1913 viewport.maxDepth = 1.0f;
1914 viewport.minDepth = 0.0f;
1915 viewport.width = 512;
1916 viewport.height = 512;
1917 viewport.x = 0;
1918 viewport.y = 0;
1919 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1920 vkEndCommandBuffer(command_buffer[1]);
1921 }
1922 {
1923 VkSubmitInfo submit_info{};
1924 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1925 submit_info.commandBufferCount = 1;
1926 submit_info.pCommandBuffers = &command_buffer[0];
1927 submit_info.signalSemaphoreCount = 1;
1928 submit_info.pSignalSemaphores = &semaphore;
1929 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1930 }
1931 {
1932 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1933 VkSubmitInfo submit_info{};
1934 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1935 submit_info.commandBufferCount = 1;
1936 submit_info.pCommandBuffers = &command_buffer[1];
1937 submit_info.waitSemaphoreCount = 1;
1938 submit_info.pWaitSemaphores = &semaphore;
1939 submit_info.pWaitDstStageMask = flags;
1940 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1941 }
1942
1943 vkQueueWaitIdle(m_device->m_queue);
1944
1945 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1946 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1947 &command_buffer[0]);
1948 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1949
1950 m_errorMonitor->VerifyNotFound();
1951}
1952
1953// This is a positive test. No errors should be generated.
1954TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
1955
1956 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1957 "submitted on separate queues, the second having a fence"
1958 "followed by a QueueWaitIdle.");
1959
Dustin Graves48458142016-04-29 16:11:55 -06001960 if ((m_device->queue_props.empty()) ||
1961 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001962 return;
1963
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001964 m_errorMonitor->ExpectSuccess();
1965
1966 VkFence fence;
1967 VkFenceCreateInfo fence_create_info{};
1968 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1969 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1970
1971 VkSemaphore semaphore;
1972 VkSemaphoreCreateInfo semaphore_create_info{};
1973 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1974 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1975 &semaphore);
1976
1977 VkCommandPool command_pool;
1978 VkCommandPoolCreateInfo pool_create_info{};
1979 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1980 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1981 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1982 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1983 &command_pool);
1984
1985 VkCommandBuffer command_buffer[2];
1986 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1987 command_buffer_allocate_info.sType =
1988 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1989 command_buffer_allocate_info.commandPool = command_pool;
1990 command_buffer_allocate_info.commandBufferCount = 2;
1991 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1992 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1993 command_buffer);
1994
1995 VkQueue queue = VK_NULL_HANDLE;
1996 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1997 1, &queue);
1998
1999 {
2000 VkCommandBufferBeginInfo begin_info{};
2001 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2002 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2003
2004 vkCmdPipelineBarrier(command_buffer[0],
2005 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2006 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2007 0, nullptr, 0, nullptr);
2008
2009 VkViewport viewport{};
2010 viewport.maxDepth = 1.0f;
2011 viewport.minDepth = 0.0f;
2012 viewport.width = 512;
2013 viewport.height = 512;
2014 viewport.x = 0;
2015 viewport.y = 0;
2016 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2017 vkEndCommandBuffer(command_buffer[0]);
2018 }
2019 {
2020 VkCommandBufferBeginInfo begin_info{};
2021 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2022 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2023
2024 VkViewport viewport{};
2025 viewport.maxDepth = 1.0f;
2026 viewport.minDepth = 0.0f;
2027 viewport.width = 512;
2028 viewport.height = 512;
2029 viewport.x = 0;
2030 viewport.y = 0;
2031 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2032 vkEndCommandBuffer(command_buffer[1]);
2033 }
2034 {
2035 VkSubmitInfo submit_info{};
2036 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2037 submit_info.commandBufferCount = 1;
2038 submit_info.pCommandBuffers = &command_buffer[0];
2039 submit_info.signalSemaphoreCount = 1;
2040 submit_info.pSignalSemaphores = &semaphore;
2041 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2042 }
2043 {
2044 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2045 VkSubmitInfo submit_info{};
2046 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2047 submit_info.commandBufferCount = 1;
2048 submit_info.pCommandBuffers = &command_buffer[1];
2049 submit_info.waitSemaphoreCount = 1;
2050 submit_info.pWaitSemaphores = &semaphore;
2051 submit_info.pWaitDstStageMask = flags;
2052 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2053 }
2054
2055 vkQueueWaitIdle(m_device->m_queue);
2056
2057 vkDestroyFence(m_device->device(), fence, nullptr);
2058 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2059 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2060 &command_buffer[0]);
2061 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2062
2063 m_errorMonitor->VerifyNotFound();
2064}
2065
2066// This is a positive test. No errors should be generated.
2067TEST_F(VkLayerTest,
2068 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
2069
2070 TEST_DESCRIPTION(
2071 "Two command buffers, each in a separate QueueSubmit call "
2072 "submitted on separate queues, the second having a fence"
2073 "followed by two consecutive WaitForFences calls on the same fence.");
2074
Dustin Graves48458142016-04-29 16:11:55 -06002075 if ((m_device->queue_props.empty()) ||
2076 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002077 return;
2078
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002079 m_errorMonitor->ExpectSuccess();
2080
2081 VkFence fence;
2082 VkFenceCreateInfo fence_create_info{};
2083 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2084 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2085
2086 VkSemaphore semaphore;
2087 VkSemaphoreCreateInfo semaphore_create_info{};
2088 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2089 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2090 &semaphore);
2091
2092 VkCommandPool command_pool;
2093 VkCommandPoolCreateInfo pool_create_info{};
2094 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2095 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2096 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2097 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2098 &command_pool);
2099
2100 VkCommandBuffer command_buffer[2];
2101 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2102 command_buffer_allocate_info.sType =
2103 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2104 command_buffer_allocate_info.commandPool = command_pool;
2105 command_buffer_allocate_info.commandBufferCount = 2;
2106 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2107 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2108 command_buffer);
2109
2110 VkQueue queue = VK_NULL_HANDLE;
2111 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2112 1, &queue);
2113
2114 {
2115 VkCommandBufferBeginInfo begin_info{};
2116 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2117 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2118
2119 vkCmdPipelineBarrier(command_buffer[0],
2120 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2121 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2122 0, nullptr, 0, nullptr);
2123
2124 VkViewport viewport{};
2125 viewport.maxDepth = 1.0f;
2126 viewport.minDepth = 0.0f;
2127 viewport.width = 512;
2128 viewport.height = 512;
2129 viewport.x = 0;
2130 viewport.y = 0;
2131 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2132 vkEndCommandBuffer(command_buffer[0]);
2133 }
2134 {
2135 VkCommandBufferBeginInfo begin_info{};
2136 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2137 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2138
2139 VkViewport viewport{};
2140 viewport.maxDepth = 1.0f;
2141 viewport.minDepth = 0.0f;
2142 viewport.width = 512;
2143 viewport.height = 512;
2144 viewport.x = 0;
2145 viewport.y = 0;
2146 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2147 vkEndCommandBuffer(command_buffer[1]);
2148 }
2149 {
2150 VkSubmitInfo submit_info{};
2151 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2152 submit_info.commandBufferCount = 1;
2153 submit_info.pCommandBuffers = &command_buffer[0];
2154 submit_info.signalSemaphoreCount = 1;
2155 submit_info.pSignalSemaphores = &semaphore;
2156 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2157 }
2158 {
2159 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2160 VkSubmitInfo submit_info{};
2161 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2162 submit_info.commandBufferCount = 1;
2163 submit_info.pCommandBuffers = &command_buffer[1];
2164 submit_info.waitSemaphoreCount = 1;
2165 submit_info.pWaitSemaphores = &semaphore;
2166 submit_info.pWaitDstStageMask = flags;
2167 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2168 }
2169
2170 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2171 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2172
2173 vkDestroyFence(m_device->device(), fence, nullptr);
2174 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2175 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2176 &command_buffer[0]);
2177 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2178
2179 m_errorMonitor->VerifyNotFound();
2180}
2181
2182// This is a positive test. No errors should be generated.
2183TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
2184
2185 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2186 "submitted on separate queues, the second having a fence, "
2187 "followed by a WaitForFences call.");
2188
Dustin Graves48458142016-04-29 16:11:55 -06002189 if ((m_device->queue_props.empty()) ||
2190 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002191 return;
2192
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002193 m_errorMonitor->ExpectSuccess();
2194
2195 VkFence fence;
2196 VkFenceCreateInfo fence_create_info{};
2197 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2198 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2199
2200 VkSemaphore semaphore;
2201 VkSemaphoreCreateInfo semaphore_create_info{};
2202 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2203 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2204 &semaphore);
2205
2206 VkCommandPool command_pool;
2207 VkCommandPoolCreateInfo pool_create_info{};
2208 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2209 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2210 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2211 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2212 &command_pool);
2213
2214 VkCommandBuffer command_buffer[2];
2215 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2216 command_buffer_allocate_info.sType =
2217 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2218 command_buffer_allocate_info.commandPool = command_pool;
2219 command_buffer_allocate_info.commandBufferCount = 2;
2220 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2221 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2222 command_buffer);
2223
2224 VkQueue queue = VK_NULL_HANDLE;
2225 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2226 1, &queue);
2227
2228
2229 {
2230 VkCommandBufferBeginInfo begin_info{};
2231 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2232 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2233
2234 vkCmdPipelineBarrier(command_buffer[0],
2235 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2236 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2237 0, nullptr, 0, nullptr);
2238
2239 VkViewport viewport{};
2240 viewport.maxDepth = 1.0f;
2241 viewport.minDepth = 0.0f;
2242 viewport.width = 512;
2243 viewport.height = 512;
2244 viewport.x = 0;
2245 viewport.y = 0;
2246 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2247 vkEndCommandBuffer(command_buffer[0]);
2248 }
2249 {
2250 VkCommandBufferBeginInfo begin_info{};
2251 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2252 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2253
2254 VkViewport viewport{};
2255 viewport.maxDepth = 1.0f;
2256 viewport.minDepth = 0.0f;
2257 viewport.width = 512;
2258 viewport.height = 512;
2259 viewport.x = 0;
2260 viewport.y = 0;
2261 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2262 vkEndCommandBuffer(command_buffer[1]);
2263 }
2264 {
2265 VkSubmitInfo submit_info{};
2266 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2267 submit_info.commandBufferCount = 1;
2268 submit_info.pCommandBuffers = &command_buffer[0];
2269 submit_info.signalSemaphoreCount = 1;
2270 submit_info.pSignalSemaphores = &semaphore;
2271 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2272 }
2273 {
2274 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2275 VkSubmitInfo submit_info{};
2276 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2277 submit_info.commandBufferCount = 1;
2278 submit_info.pCommandBuffers = &command_buffer[1];
2279 submit_info.waitSemaphoreCount = 1;
2280 submit_info.pWaitSemaphores = &semaphore;
2281 submit_info.pWaitDstStageMask = flags;
2282 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2283 }
2284
2285 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2286
2287 vkDestroyFence(m_device->device(), fence, nullptr);
2288 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2289 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2290 &command_buffer[0]);
2291 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2292
2293 m_errorMonitor->VerifyNotFound();
2294}
2295
2296// This is a positive test. No errors should be generated.
2297TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
2298
2299 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2300 "on the same queue, sharing a signal/wait semaphore, the "
2301 "second having a fence, "
2302 "followed by a WaitForFences call.");
2303
2304 m_errorMonitor->ExpectSuccess();
2305
2306 VkFence fence;
2307 VkFenceCreateInfo fence_create_info{};
2308 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2309 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2310
2311 VkSemaphore semaphore;
2312 VkSemaphoreCreateInfo semaphore_create_info{};
2313 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2314 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2315 &semaphore);
2316
2317 VkCommandPool command_pool;
2318 VkCommandPoolCreateInfo pool_create_info{};
2319 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2320 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2321 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2322 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2323 &command_pool);
2324
2325 VkCommandBuffer command_buffer[2];
2326 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2327 command_buffer_allocate_info.sType =
2328 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2329 command_buffer_allocate_info.commandPool = command_pool;
2330 command_buffer_allocate_info.commandBufferCount = 2;
2331 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2332 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2333 command_buffer);
2334
2335 {
2336 VkCommandBufferBeginInfo begin_info{};
2337 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2338 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2339
2340 vkCmdPipelineBarrier(command_buffer[0],
2341 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2342 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2343 0, nullptr, 0, nullptr);
2344
2345 VkViewport viewport{};
2346 viewport.maxDepth = 1.0f;
2347 viewport.minDepth = 0.0f;
2348 viewport.width = 512;
2349 viewport.height = 512;
2350 viewport.x = 0;
2351 viewport.y = 0;
2352 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2353 vkEndCommandBuffer(command_buffer[0]);
2354 }
2355 {
2356 VkCommandBufferBeginInfo begin_info{};
2357 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2358 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2359
2360 VkViewport viewport{};
2361 viewport.maxDepth = 1.0f;
2362 viewport.minDepth = 0.0f;
2363 viewport.width = 512;
2364 viewport.height = 512;
2365 viewport.x = 0;
2366 viewport.y = 0;
2367 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2368 vkEndCommandBuffer(command_buffer[1]);
2369 }
2370 {
2371 VkSubmitInfo submit_info{};
2372 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2373 submit_info.commandBufferCount = 1;
2374 submit_info.pCommandBuffers = &command_buffer[0];
2375 submit_info.signalSemaphoreCount = 1;
2376 submit_info.pSignalSemaphores = &semaphore;
2377 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2378 }
2379 {
2380 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2381 VkSubmitInfo submit_info{};
2382 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2383 submit_info.commandBufferCount = 1;
2384 submit_info.pCommandBuffers = &command_buffer[1];
2385 submit_info.waitSemaphoreCount = 1;
2386 submit_info.pWaitSemaphores = &semaphore;
2387 submit_info.pWaitDstStageMask = flags;
2388 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2389 }
2390
2391 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2392
2393 vkDestroyFence(m_device->device(), fence, nullptr);
2394 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2395 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2396 &command_buffer[0]);
2397 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2398
2399 m_errorMonitor->VerifyNotFound();
2400}
2401
2402// This is a positive test. No errors should be generated.
2403TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
2404
2405 TEST_DESCRIPTION(
2406 "Two command buffers, each in a separate QueueSubmit call "
2407 "on the same queue, no fences, followed by a third QueueSubmit with NO "
2408 "SubmitInfos but with a fence, followed by a WaitForFences call.");
2409
2410 m_errorMonitor->ExpectSuccess();
2411
2412 VkFence fence;
2413 VkFenceCreateInfo fence_create_info{};
2414 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2415 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2416
2417 VkCommandPool command_pool;
2418 VkCommandPoolCreateInfo pool_create_info{};
2419 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2420 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2421 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2422 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2423 &command_pool);
2424
2425 VkCommandBuffer command_buffer[2];
2426 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2427 command_buffer_allocate_info.sType =
2428 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2429 command_buffer_allocate_info.commandPool = command_pool;
2430 command_buffer_allocate_info.commandBufferCount = 2;
2431 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2432 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2433 command_buffer);
2434
2435 {
2436 VkCommandBufferBeginInfo begin_info{};
2437 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2438 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2439
2440 vkCmdPipelineBarrier(command_buffer[0],
2441 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2442 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2443 0, nullptr, 0, nullptr);
2444
2445 VkViewport viewport{};
2446 viewport.maxDepth = 1.0f;
2447 viewport.minDepth = 0.0f;
2448 viewport.width = 512;
2449 viewport.height = 512;
2450 viewport.x = 0;
2451 viewport.y = 0;
2452 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2453 vkEndCommandBuffer(command_buffer[0]);
2454 }
2455 {
2456 VkCommandBufferBeginInfo begin_info{};
2457 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2458 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2459
2460 VkViewport viewport{};
2461 viewport.maxDepth = 1.0f;
2462 viewport.minDepth = 0.0f;
2463 viewport.width = 512;
2464 viewport.height = 512;
2465 viewport.x = 0;
2466 viewport.y = 0;
2467 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2468 vkEndCommandBuffer(command_buffer[1]);
2469 }
2470 {
2471 VkSubmitInfo submit_info{};
2472 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2473 submit_info.commandBufferCount = 1;
2474 submit_info.pCommandBuffers = &command_buffer[0];
2475 submit_info.signalSemaphoreCount = 0;
2476 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2477 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2478 }
2479 {
2480 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2481 VkSubmitInfo submit_info{};
2482 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2483 submit_info.commandBufferCount = 1;
2484 submit_info.pCommandBuffers = &command_buffer[1];
2485 submit_info.waitSemaphoreCount = 0;
2486 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2487 submit_info.pWaitDstStageMask = flags;
2488 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2489 }
2490
2491 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
2492
2493 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2494
2495 vkDestroyFence(m_device->device(), fence, nullptr);
2496 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2497 &command_buffer[0]);
2498 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2499
2500 m_errorMonitor->VerifyNotFound();
2501}
2502
2503// This is a positive test. No errors should be generated.
2504TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
2505
2506 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2507 "on the same queue, the second having a fence, followed "
2508 "by a WaitForFences call.");
2509
2510 m_errorMonitor->ExpectSuccess();
2511
2512 VkFence fence;
2513 VkFenceCreateInfo fence_create_info{};
2514 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2515 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2516
2517 VkCommandPool command_pool;
2518 VkCommandPoolCreateInfo pool_create_info{};
2519 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2520 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2521 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2522 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2523 &command_pool);
2524
2525 VkCommandBuffer command_buffer[2];
2526 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2527 command_buffer_allocate_info.sType =
2528 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2529 command_buffer_allocate_info.commandPool = command_pool;
2530 command_buffer_allocate_info.commandBufferCount = 2;
2531 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2532 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2533 command_buffer);
2534
2535 {
2536 VkCommandBufferBeginInfo begin_info{};
2537 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2538 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2539
2540 vkCmdPipelineBarrier(command_buffer[0],
2541 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2542 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2543 0, nullptr, 0, nullptr);
2544
2545 VkViewport viewport{};
2546 viewport.maxDepth = 1.0f;
2547 viewport.minDepth = 0.0f;
2548 viewport.width = 512;
2549 viewport.height = 512;
2550 viewport.x = 0;
2551 viewport.y = 0;
2552 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2553 vkEndCommandBuffer(command_buffer[0]);
2554 }
2555 {
2556 VkCommandBufferBeginInfo begin_info{};
2557 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2558 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2559
2560 VkViewport viewport{};
2561 viewport.maxDepth = 1.0f;
2562 viewport.minDepth = 0.0f;
2563 viewport.width = 512;
2564 viewport.height = 512;
2565 viewport.x = 0;
2566 viewport.y = 0;
2567 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2568 vkEndCommandBuffer(command_buffer[1]);
2569 }
2570 {
2571 VkSubmitInfo submit_info{};
2572 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2573 submit_info.commandBufferCount = 1;
2574 submit_info.pCommandBuffers = &command_buffer[0];
2575 submit_info.signalSemaphoreCount = 0;
2576 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2577 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2578 }
2579 {
2580 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2581 VkSubmitInfo submit_info{};
2582 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2583 submit_info.commandBufferCount = 1;
2584 submit_info.pCommandBuffers = &command_buffer[1];
2585 submit_info.waitSemaphoreCount = 0;
2586 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2587 submit_info.pWaitDstStageMask = flags;
2588 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2589 }
2590
2591 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2592
2593 vkDestroyFence(m_device->device(), fence, nullptr);
2594 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2595 &command_buffer[0]);
2596 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2597
2598 m_errorMonitor->VerifyNotFound();
2599}
2600
2601// This is a positive test. No errors should be generated.
2602TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
2603
2604 TEST_DESCRIPTION(
2605 "Two command buffers each in a separate SubmitInfo sent in a single "
2606 "QueueSubmit call followed by a WaitForFences call.");
2607
2608 m_errorMonitor->ExpectSuccess();
2609
2610 VkFence fence;
2611 VkFenceCreateInfo fence_create_info{};
2612 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2613 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2614
2615 VkSemaphore semaphore;
2616 VkSemaphoreCreateInfo semaphore_create_info{};
2617 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2618 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2619 &semaphore);
2620
2621 VkCommandPool command_pool;
2622 VkCommandPoolCreateInfo pool_create_info{};
2623 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2624 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2625 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2626 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2627 &command_pool);
2628
2629 VkCommandBuffer command_buffer[2];
2630 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2631 command_buffer_allocate_info.sType =
2632 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2633 command_buffer_allocate_info.commandPool = command_pool;
2634 command_buffer_allocate_info.commandBufferCount = 2;
2635 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2636 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2637 command_buffer);
2638
2639 {
2640 VkCommandBufferBeginInfo begin_info{};
2641 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2642 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2643
2644 vkCmdPipelineBarrier(command_buffer[0],
2645 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2646 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2647 0, nullptr, 0, nullptr);
2648
2649 VkViewport viewport{};
2650 viewport.maxDepth = 1.0f;
2651 viewport.minDepth = 0.0f;
2652 viewport.width = 512;
2653 viewport.height = 512;
2654 viewport.x = 0;
2655 viewport.y = 0;
2656 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2657 vkEndCommandBuffer(command_buffer[0]);
2658 }
2659 {
2660 VkCommandBufferBeginInfo begin_info{};
2661 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2662 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2663
2664 VkViewport viewport{};
2665 viewport.maxDepth = 1.0f;
2666 viewport.minDepth = 0.0f;
2667 viewport.width = 512;
2668 viewport.height = 512;
2669 viewport.x = 0;
2670 viewport.y = 0;
2671 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2672 vkEndCommandBuffer(command_buffer[1]);
2673 }
2674 {
2675 VkSubmitInfo submit_info[2];
2676 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2677
2678 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2679 submit_info[0].pNext = NULL;
2680 submit_info[0].commandBufferCount = 1;
2681 submit_info[0].pCommandBuffers = &command_buffer[0];
2682 submit_info[0].signalSemaphoreCount = 1;
2683 submit_info[0].pSignalSemaphores = &semaphore;
2684 submit_info[0].waitSemaphoreCount = 0;
2685 submit_info[0].pWaitSemaphores = NULL;
2686 submit_info[0].pWaitDstStageMask = 0;
2687
2688 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2689 submit_info[1].pNext = NULL;
2690 submit_info[1].commandBufferCount = 1;
2691 submit_info[1].pCommandBuffers = &command_buffer[1];
2692 submit_info[1].waitSemaphoreCount = 1;
2693 submit_info[1].pWaitSemaphores = &semaphore;
2694 submit_info[1].pWaitDstStageMask = flags;
2695 submit_info[1].signalSemaphoreCount = 0;
2696 submit_info[1].pSignalSemaphores = NULL;
2697 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
2698 }
2699
2700 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2701
2702 vkDestroyFence(m_device->device(), fence, nullptr);
2703 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2704 &command_buffer[0]);
2705 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2706
2707 m_errorMonitor->VerifyNotFound();
2708}
2709
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002710TEST_F(VkLayerTest, DynamicStatesNotBound) {
2711 TEST_DESCRIPTION(
2712 "Run a series of simple draw calls to validate all the different "
2713 "failure cases that can occur when dynamic state is required but not "
2714 "correctly bound."
2715 "Here are the different dynamic state cases verified by this test:\n"
2716 "-Line Width\n-Depth Bias\n-Viewport State\n-Scissor State\n-Blend "
2717 "State\n-Depth Bounds\n-Stencil Read Mask\n-Stencil Write "
2718 "Mask\n-Stencil Reference");
2719
2720 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07002721 m_errorMonitor->SetDesiredFailureMsg(
2722 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002723 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002724 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2725 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002726 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002727 // Dynamic depth bias
Karl Schultz6addd812016-02-02 17:17:23 -07002728 m_errorMonitor->SetDesiredFailureMsg(
2729 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002730 "Dynamic depth bias state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002731 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2732 BsoFailDepthBias);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002733 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002734 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07002735 m_errorMonitor->SetDesiredFailureMsg(
2736 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002737 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002738 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2739 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002740 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002741 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07002742 m_errorMonitor->SetDesiredFailureMsg(
2743 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002744 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002745 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2746 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002747 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002748 // Dynamic blend state
Karl Schultz6addd812016-02-02 17:17:23 -07002749 m_errorMonitor->SetDesiredFailureMsg(
2750 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002751 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002752 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2753 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002754 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002755 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07002756 m_errorMonitor->SetDesiredFailureMsg(
2757 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002758 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002759 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2760 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002761 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002762 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07002763 m_errorMonitor->SetDesiredFailureMsg(
2764 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002765 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002766 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2767 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002768 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002769 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07002770 m_errorMonitor->SetDesiredFailureMsg(
2771 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002772 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002773 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2774 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002775 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002776}
2777
Karl Schultz6addd812016-02-02 17:17:23 -07002778TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002779 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002780
Karl Schultz6addd812016-02-02 17:17:23 -07002781 m_errorMonitor->SetDesiredFailureMsg(
2782 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2783 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
2784 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002785
2786 VkFenceCreateInfo fenceInfo = {};
2787 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2788 fenceInfo.pNext = NULL;
2789 fenceInfo.flags = 0;
2790
2791 ASSERT_NO_FATAL_FAILURE(InitState());
2792 ASSERT_NO_FATAL_FAILURE(InitViewport());
2793 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2794
Karl Schultz6addd812016-02-02 17:17:23 -07002795 // We luck out b/c by default the framework creates CB w/ the
2796 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002797 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002798 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2799 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002800 EndCommandBuffer();
2801
2802 testFence.init(*m_device, fenceInfo);
2803
2804 // Bypass framework since it does the waits automatically
2805 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002806 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002807 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2808 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002809 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002810 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002811 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002812 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002813 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002814 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002815 submit_info.pSignalSemaphores = NULL;
2816
Karl Schultz6addd812016-02-02 17:17:23 -07002817 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
2818 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002819
Karl Schultz6addd812016-02-02 17:17:23 -07002820 // Cause validation error by re-submitting cmd buffer that should only be
2821 // submitted once
2822 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002823
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002824 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002825}
2826
Karl Schultz6addd812016-02-02 17:17:23 -07002827TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002828 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07002829 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002830
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002831 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002832 "Unable to allocate 1 descriptors of "
2833 "type "
2834 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002835
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002836 ASSERT_NO_FATAL_FAILURE(InitState());
2837 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002838
Karl Schultz6addd812016-02-02 17:17:23 -07002839 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
2840 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002841 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002842 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2843 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002844
2845 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002846 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2847 ds_pool_ci.pNext = NULL;
2848 ds_pool_ci.flags = 0;
2849 ds_pool_ci.maxSets = 1;
2850 ds_pool_ci.poolSizeCount = 1;
2851 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002852
2853 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002854 err =
2855 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002856 ASSERT_VK_SUCCESS(err);
2857
2858 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002859 dsl_binding.binding = 0;
2860 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2861 dsl_binding.descriptorCount = 1;
2862 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2863 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002864
2865 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002866 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2867 ds_layout_ci.pNext = NULL;
2868 ds_layout_ci.bindingCount = 1;
2869 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002870
2871 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002872 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2873 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002874 ASSERT_VK_SUCCESS(err);
2875
2876 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002877 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002878 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002879 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002880 alloc_info.descriptorPool = ds_pool;
2881 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002882 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2883 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002884
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002885 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002886
Chia-I Wuf7458c52015-10-26 21:10:41 +08002887 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2888 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002889}
2890
Karl Schultz6addd812016-02-02 17:17:23 -07002891TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
2892 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06002893
Karl Schultz6addd812016-02-02 17:17:23 -07002894 m_errorMonitor->SetDesiredFailureMsg(
2895 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2896 "It is invalid to call vkFreeDescriptorSets() with a pool created "
2897 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002898
Tobin Ehlise735c692015-10-08 13:13:50 -06002899 ASSERT_NO_FATAL_FAILURE(InitState());
2900 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06002901
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002902 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002903 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2904 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06002905
2906 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002907 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2908 ds_pool_ci.pNext = NULL;
2909 ds_pool_ci.maxSets = 1;
2910 ds_pool_ci.poolSizeCount = 1;
2911 ds_pool_ci.flags = 0;
2912 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
2913 // app can only call vkResetDescriptorPool on this pool.;
2914 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06002915
2916 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002917 err =
2918 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06002919 ASSERT_VK_SUCCESS(err);
2920
2921 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002922 dsl_binding.binding = 0;
2923 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2924 dsl_binding.descriptorCount = 1;
2925 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2926 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06002927
2928 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002929 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2930 ds_layout_ci.pNext = NULL;
2931 ds_layout_ci.bindingCount = 1;
2932 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06002933
2934 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002935 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2936 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06002937 ASSERT_VK_SUCCESS(err);
2938
2939 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002940 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002941 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002942 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002943 alloc_info.descriptorPool = ds_pool;
2944 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002945 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2946 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06002947 ASSERT_VK_SUCCESS(err);
2948
2949 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002950 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06002951
Chia-I Wuf7458c52015-10-26 21:10:41 +08002952 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2953 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06002954}
2955
Karl Schultz6addd812016-02-02 17:17:23 -07002956TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002957 // Attempt to clear Descriptor Pool with bad object.
2958 // ObjectTracker should catch this.
2959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2960 "Invalid VkDescriptorPool Object 0xbaad6001");
2961 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
2962 vkResetDescriptorPool(device(), badPool, 0);
2963 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002964}
2965
Karl Schultz6addd812016-02-02 17:17:23 -07002966TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002967 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
2968 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002969 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06002970 // call vkCmdBindDescriptorSets w/ false Descriptor Set
2971 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
2972 VkResult err;
2973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2974 "Invalid VkDescriptorSet Object 0xbaad6001");
2975
2976 ASSERT_NO_FATAL_FAILURE(InitState());
2977
2978 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
2979 layout_bindings[0].binding = 0;
2980 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2981 layout_bindings[0].descriptorCount = 1;
2982 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2983 layout_bindings[0].pImmutableSamplers = NULL;
2984
2985 VkDescriptorSetLayout descriptor_set_layout;
2986 VkDescriptorSetLayoutCreateInfo dslci = {};
2987 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2988 dslci.pNext = NULL;
2989 dslci.bindingCount = 1;
2990 dslci.pBindings = layout_bindings;
2991 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002992 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002993
2994 VkPipelineLayout pipeline_layout;
2995 VkPipelineLayoutCreateInfo plci = {};
2996 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2997 plci.pNext = NULL;
2998 plci.setLayoutCount = 1;
2999 plci.pSetLayouts = &descriptor_set_layout;
3000 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003001 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003002
3003 BeginCommandBuffer();
3004 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3005 pipeline_layout, 0, 1, &badSet, 0, NULL);
3006 m_errorMonitor->VerifyFound();
3007 EndCommandBuffer();
3008 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
3009 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003010}
3011
Karl Schultz6addd812016-02-02 17:17:23 -07003012TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003013 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
3014 // ObjectTracker should catch this.
3015 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
3016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3017 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
3018
3019 VkPipelineLayout pipeline_layout;
3020 VkPipelineLayoutCreateInfo plci = {};
3021 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3022 plci.pNext = NULL;
3023 plci.setLayoutCount = 1;
3024 plci.pSetLayouts = &bad_layout;
3025 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
3026
3027 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003028}
3029
Karl Schultz6addd812016-02-02 17:17:23 -07003030TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003031 // Attempt to bind an invalid Pipeline to a valid Command Buffer
3032 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003033 // Create a valid cmd buffer
3034 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultzbdb75952016-04-19 11:36:49 -06003035 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
3036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3037 "Invalid VkPipeline Object 0xbaad6001");
3038 ASSERT_NO_FATAL_FAILURE(InitState());
3039 BeginCommandBuffer();
3040 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3041 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
3042 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06003043
3044 // Now issue a draw call with no pipeline bound
3045 m_errorMonitor->SetDesiredFailureMsg(
3046 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3047 "At Draw/Dispatch time no valid VkPipeline is bound!");
3048 ASSERT_NO_FATAL_FAILURE(InitState());
3049 BeginCommandBuffer();
3050 Draw(1, 0, 0, 0);
3051 m_errorMonitor->VerifyFound();
3052 // Finally same check once more but with Dispatch/Compute
3053 m_errorMonitor->SetDesiredFailureMsg(
3054 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3055 "At Draw/Dispatch time no valid VkPipeline is bound!");
3056 ASSERT_NO_FATAL_FAILURE(InitState());
3057 BeginCommandBuffer();
3058 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
3059 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003060}
3061
Karl Schultz6addd812016-02-02 17:17:23 -07003062TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
3063 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
3064 // CommandBuffer
3065 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003066
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003067 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003068 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003069
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003070 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06003071 ASSERT_NO_FATAL_FAILURE(InitViewport());
3072 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003073 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003074 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3075 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003076
3077 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003078 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3079 ds_pool_ci.pNext = NULL;
3080 ds_pool_ci.maxSets = 1;
3081 ds_pool_ci.poolSizeCount = 1;
3082 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06003083
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003084 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003085 err =
3086 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003087 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003088
Tony Barboureb254902015-07-15 12:50:33 -06003089 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003090 dsl_binding.binding = 0;
3091 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3092 dsl_binding.descriptorCount = 1;
3093 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3094 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003095
Tony Barboureb254902015-07-15 12:50:33 -06003096 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003097 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3098 ds_layout_ci.pNext = NULL;
3099 ds_layout_ci.bindingCount = 1;
3100 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003101 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003102 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3103 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003104 ASSERT_VK_SUCCESS(err);
3105
3106 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003107 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003108 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003109 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003110 alloc_info.descriptorPool = ds_pool;
3111 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003112 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3113 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003114 ASSERT_VK_SUCCESS(err);
3115
Tony Barboureb254902015-07-15 12:50:33 -06003116 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003117 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3118 pipeline_layout_ci.pNext = NULL;
3119 pipeline_layout_ci.setLayoutCount = 1;
3120 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003121
3122 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003123 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3124 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003125 ASSERT_VK_SUCCESS(err);
3126
Karl Schultz6addd812016-02-02 17:17:23 -07003127 VkShaderObj vs(m_device, bindStateVertShaderText,
3128 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06003129 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07003130 // on more devices
3131 VkShaderObj fs(m_device, bindStateFragShaderText,
3132 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003133
Tony Barbourc95e4ac2015-08-04 17:05:26 -06003134 VkPipelineObj pipe(m_device);
3135 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06003136 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06003137 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06003138 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06003139
3140 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003141 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3142 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3143 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3144 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3145 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003146
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003147 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003148
Chia-I Wuf7458c52015-10-26 21:10:41 +08003149 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3150 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3151 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003152}
3153
Karl Schultz6addd812016-02-02 17:17:23 -07003154TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003155 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07003156 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003157
Karl Schultz6addd812016-02-02 17:17:23 -07003158 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003159 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
3160 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003161
3162 ASSERT_NO_FATAL_FAILURE(InitState());
3163 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003164 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3165 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003166
3167 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003168 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3169 ds_pool_ci.pNext = NULL;
3170 ds_pool_ci.maxSets = 1;
3171 ds_pool_ci.poolSizeCount = 1;
3172 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003173
3174 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003175 err =
3176 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003177 ASSERT_VK_SUCCESS(err);
3178
3179 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003180 dsl_binding.binding = 0;
3181 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3182 dsl_binding.descriptorCount = 1;
3183 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3184 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003185
3186 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003187 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3188 ds_layout_ci.pNext = NULL;
3189 ds_layout_ci.bindingCount = 1;
3190 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003191 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003192 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3193 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003194 ASSERT_VK_SUCCESS(err);
3195
3196 VkDescriptorSet descriptorSet;
3197 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003198 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003199 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003200 alloc_info.descriptorPool = ds_pool;
3201 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003202 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3203 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003204 ASSERT_VK_SUCCESS(err);
3205
Karl Schultz6addd812016-02-02 17:17:23 -07003206 VkBufferView view =
3207 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003208 VkWriteDescriptorSet descriptor_write;
3209 memset(&descriptor_write, 0, sizeof(descriptor_write));
3210 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3211 descriptor_write.dstSet = descriptorSet;
3212 descriptor_write.dstBinding = 0;
3213 descriptor_write.descriptorCount = 1;
3214 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3215 descriptor_write.pTexelBufferView = &view;
3216
3217 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3218
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003219 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003220
3221 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3222 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3223}
3224
Karl Schultz6addd812016-02-02 17:17:23 -07003225TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
3226 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
3227 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07003228 // 1. No dynamicOffset supplied
3229 // 2. Too many dynamicOffsets supplied
3230 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07003231 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003233 " requires 1 dynamicOffsets, but only "
3234 "0 dynamicOffsets are left in "
3235 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003236
3237 ASSERT_NO_FATAL_FAILURE(InitState());
3238 ASSERT_NO_FATAL_FAILURE(InitViewport());
3239 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3240
3241 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003242 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3243 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003244
3245 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003246 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3247 ds_pool_ci.pNext = NULL;
3248 ds_pool_ci.maxSets = 1;
3249 ds_pool_ci.poolSizeCount = 1;
3250 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003251
3252 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003253 err =
3254 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003255 ASSERT_VK_SUCCESS(err);
3256
3257 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003258 dsl_binding.binding = 0;
3259 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3260 dsl_binding.descriptorCount = 1;
3261 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3262 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003263
3264 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003265 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3266 ds_layout_ci.pNext = NULL;
3267 ds_layout_ci.bindingCount = 1;
3268 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003269 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003270 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3271 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003272 ASSERT_VK_SUCCESS(err);
3273
3274 VkDescriptorSet descriptorSet;
3275 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003276 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003277 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003278 alloc_info.descriptorPool = ds_pool;
3279 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003280 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3281 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003282 ASSERT_VK_SUCCESS(err);
3283
3284 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003285 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3286 pipeline_layout_ci.pNext = NULL;
3287 pipeline_layout_ci.setLayoutCount = 1;
3288 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003289
3290 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003291 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3292 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003293 ASSERT_VK_SUCCESS(err);
3294
3295 // Create a buffer to update the descriptor with
3296 uint32_t qfi = 0;
3297 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003298 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3299 buffCI.size = 1024;
3300 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3301 buffCI.queueFamilyIndexCount = 1;
3302 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003303
3304 VkBuffer dyub;
3305 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3306 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003307 // Allocate memory and bind to buffer so we can make it to the appropriate
3308 // error
3309 VkMemoryAllocateInfo mem_alloc = {};
3310 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3311 mem_alloc.pNext = NULL;
3312 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12003313 mem_alloc.memoryTypeIndex = 0;
3314
3315 VkMemoryRequirements memReqs;
3316 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
3317 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
3318 0);
3319 if (!pass) {
3320 vkDestroyBuffer(m_device->device(), dyub, NULL);
3321 return;
3322 }
3323
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003324 VkDeviceMemory mem;
3325 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3326 ASSERT_VK_SUCCESS(err);
3327 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
3328 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003329 // Correctly update descriptor to avoid "NOT_UPDATED" error
3330 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003331 buffInfo.buffer = dyub;
3332 buffInfo.offset = 0;
3333 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003334
3335 VkWriteDescriptorSet descriptor_write;
3336 memset(&descriptor_write, 0, sizeof(descriptor_write));
3337 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3338 descriptor_write.dstSet = descriptorSet;
3339 descriptor_write.dstBinding = 0;
3340 descriptor_write.descriptorCount = 1;
3341 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3342 descriptor_write.pBufferInfo = &buffInfo;
3343
3344 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3345
3346 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003347 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3348 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3349 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003350 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003351 uint32_t pDynOff[2] = {512, 756};
3352 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07003353 m_errorMonitor->SetDesiredFailureMsg(
3354 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07003355 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07003356 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3357 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3358 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12003359 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003360 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3362 " dynamic offset 512 combined with "
3363 "offset 0 and range 1024 that "
3364 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07003365 // Create PSO to be used for draw-time errors below
3366 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003367 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003368 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003369 "out gl_PerVertex { \n"
3370 " vec4 gl_Position;\n"
3371 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003372 "void main(){\n"
3373 " gl_Position = vec4(1);\n"
3374 "}\n";
3375 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003376 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003377 "\n"
3378 "layout(location=0) out vec4 x;\n"
3379 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3380 "void main(){\n"
3381 " x = vec4(bar.y);\n"
3382 "}\n";
3383 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3384 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3385 VkPipelineObj pipe(m_device);
3386 pipe.AddShader(&vs);
3387 pipe.AddShader(&fs);
3388 pipe.AddColorAttachment();
3389 pipe.CreateVKPipeline(pipeline_layout, renderPass());
3390
Karl Schultz6addd812016-02-02 17:17:23 -07003391 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3392 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3393 // This update should succeed, but offset size of 512 will overstep buffer
3394 // /w range 1024 & size 1024
3395 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3396 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3397 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07003398 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003399 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003400
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003401 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06003402 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003403
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003404 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3405 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3406}
3407
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003408TEST_F(VkLayerTest, InvalidPushConstants) {
3409 // Hit push constant error cases:
3410 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
3411 // 2. Incorrectly set push constant size to 0
3412 // 3. Incorrectly set push constant size to non-multiple of 4
3413 // 4. Attempt push constant update that exceeds maxPushConstantSize
3414 VkResult err;
3415 m_errorMonitor->SetDesiredFailureMsg(
3416 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3417 "vkCreatePipelineLayout() call has push constants with offset ");
3418
3419 ASSERT_NO_FATAL_FAILURE(InitState());
3420 ASSERT_NO_FATAL_FAILURE(InitViewport());
3421 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3422
3423 VkPushConstantRange pc_range = {};
3424 pc_range.size = 0xFFFFFFFFu;
3425 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3426 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3427 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3428 pipeline_layout_ci.pushConstantRangeCount = 1;
3429 pipeline_layout_ci.pPushConstantRanges = &pc_range;
3430
3431 VkPipelineLayout pipeline_layout;
3432 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3433 &pipeline_layout);
3434
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003435 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003436 // Now cause errors due to size 0 and non-4 byte aligned size
3437 pc_range.size = 0;
3438 m_errorMonitor->SetDesiredFailureMsg(
3439 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3440 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
3441 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3442 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003443 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003444 pc_range.size = 1;
3445 m_errorMonitor->SetDesiredFailureMsg(
3446 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3447 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
3448 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3449 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003450 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003451 // Cause error due to bad size in vkCmdPushConstants() call
3452 m_errorMonitor->SetDesiredFailureMsg(
3453 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3454 "vkCmdPushConstants() call has push constants with offset ");
3455 pipeline_layout_ci.pushConstantRangeCount = 0;
3456 pipeline_layout_ci.pPushConstantRanges = NULL;
3457 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3458 &pipeline_layout);
3459 ASSERT_VK_SUCCESS(err);
3460 BeginCommandBuffer();
3461 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
3462 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003463 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003464 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3465}
3466
Karl Schultz6addd812016-02-02 17:17:23 -07003467TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003468 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07003469 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003470
3471 ASSERT_NO_FATAL_FAILURE(InitState());
3472 ASSERT_NO_FATAL_FAILURE(InitViewport());
3473 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3474
3475 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
3476 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003477 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3478 ds_type_count[0].descriptorCount = 10;
3479 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3480 ds_type_count[1].descriptorCount = 2;
3481 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3482 ds_type_count[2].descriptorCount = 2;
3483 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
3484 ds_type_count[3].descriptorCount = 5;
3485 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
3486 // type
3487 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3488 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
3489 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003490
3491 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003492 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3493 ds_pool_ci.pNext = NULL;
3494 ds_pool_ci.maxSets = 5;
3495 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
3496 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003497
3498 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003499 err =
3500 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003501 ASSERT_VK_SUCCESS(err);
3502
3503 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
3504 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003505 dsl_binding[0].binding = 0;
3506 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3507 dsl_binding[0].descriptorCount = 5;
3508 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3509 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003510
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003511 // Create layout identical to set0 layout but w/ different stageFlags
3512 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003513 dsl_fs_stage_only.binding = 0;
3514 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3515 dsl_fs_stage_only.descriptorCount = 5;
3516 dsl_fs_stage_only.stageFlags =
3517 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
3518 // bind time
3519 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003520 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003521 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3522 ds_layout_ci.pNext = NULL;
3523 ds_layout_ci.bindingCount = 1;
3524 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003525 static const uint32_t NUM_LAYOUTS = 4;
3526 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003527 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003528 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
3529 // layout for error case
3530 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3531 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003532 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003533 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003534 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3535 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003536 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003537 dsl_binding[0].binding = 0;
3538 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003539 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003540 dsl_binding[1].binding = 1;
3541 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3542 dsl_binding[1].descriptorCount = 2;
3543 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
3544 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003545 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003546 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003547 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3548 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003549 ASSERT_VK_SUCCESS(err);
3550 dsl_binding[0].binding = 0;
3551 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003552 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003553 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07003554 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3555 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003556 ASSERT_VK_SUCCESS(err);
3557 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003558 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003559 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3560 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003561 ASSERT_VK_SUCCESS(err);
3562
3563 static const uint32_t NUM_SETS = 4;
3564 VkDescriptorSet descriptorSet[NUM_SETS] = {};
3565 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003566 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003567 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003568 alloc_info.descriptorPool = ds_pool;
3569 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003570 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3571 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003572 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003573 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003574 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003575 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003576 err =
3577 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003578 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003579
3580 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003581 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3582 pipeline_layout_ci.pNext = NULL;
3583 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
3584 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003585
3586 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003587 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3588 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003589 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003590 // Create pipelineLayout with only one setLayout
3591 pipeline_layout_ci.setLayoutCount = 1;
3592 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003593 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3594 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003595 ASSERT_VK_SUCCESS(err);
3596 // Create pipelineLayout with 2 descriptor setLayout at index 0
3597 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
3598 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07003599 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3600 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003601 ASSERT_VK_SUCCESS(err);
3602 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
3603 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
3604 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07003605 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3606 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003607 ASSERT_VK_SUCCESS(err);
3608 // Create pipelineLayout with UB type, but stageFlags for FS only
3609 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
3610 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003611 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3612 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003613 ASSERT_VK_SUCCESS(err);
3614 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
3615 VkDescriptorSetLayout pl_bad_s0[2] = {};
3616 pl_bad_s0[0] = ds_layout_fs_only;
3617 pl_bad_s0[1] = ds_layout[1];
3618 pipeline_layout_ci.setLayoutCount = 2;
3619 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
3620 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07003621 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3622 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003623 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003624
3625 // Create a buffer to update the descriptor with
3626 uint32_t qfi = 0;
3627 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003628 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3629 buffCI.size = 1024;
3630 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3631 buffCI.queueFamilyIndexCount = 1;
3632 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003633
3634 VkBuffer dyub;
3635 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3636 ASSERT_VK_SUCCESS(err);
3637 // Correctly update descriptor to avoid "NOT_UPDATED" error
3638 static const uint32_t NUM_BUFFS = 5;
3639 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003640 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003641 buffInfo[i].buffer = dyub;
3642 buffInfo[i].offset = 0;
3643 buffInfo[i].range = 1024;
3644 }
Karl Schultz6addd812016-02-02 17:17:23 -07003645 VkImage image;
3646 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3647 const int32_t tex_width = 32;
3648 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003649 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003650 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3651 image_create_info.pNext = NULL;
3652 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3653 image_create_info.format = tex_format;
3654 image_create_info.extent.width = tex_width;
3655 image_create_info.extent.height = tex_height;
3656 image_create_info.extent.depth = 1;
3657 image_create_info.mipLevels = 1;
3658 image_create_info.arrayLayers = 1;
3659 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3660 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3661 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3662 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003663 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3664 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003665
Karl Schultz6addd812016-02-02 17:17:23 -07003666 VkMemoryRequirements memReqs;
3667 VkDeviceMemory imageMem;
3668 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003669 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003670 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3671 memAlloc.pNext = NULL;
3672 memAlloc.allocationSize = 0;
3673 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003674 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
3675 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003676 pass =
3677 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003678 ASSERT_TRUE(pass);
3679 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
3680 ASSERT_VK_SUCCESS(err);
3681 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
3682 ASSERT_VK_SUCCESS(err);
3683
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003684 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003685 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3686 image_view_create_info.image = image;
3687 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
3688 image_view_create_info.format = tex_format;
3689 image_view_create_info.subresourceRange.layerCount = 1;
3690 image_view_create_info.subresourceRange.baseMipLevel = 0;
3691 image_view_create_info.subresourceRange.levelCount = 1;
3692 image_view_create_info.subresourceRange.aspectMask =
3693 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003694
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003695 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07003696 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
3697 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003698 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003699 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003700 imageInfo[0].imageView = view;
3701 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3702 imageInfo[1].imageView = view;
3703 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003704 imageInfo[2].imageView = view;
3705 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3706 imageInfo[3].imageView = view;
3707 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003708
3709 static const uint32_t NUM_SET_UPDATES = 3;
3710 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
3711 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3712 descriptor_write[0].dstSet = descriptorSet[0];
3713 descriptor_write[0].dstBinding = 0;
3714 descriptor_write[0].descriptorCount = 5;
3715 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3716 descriptor_write[0].pBufferInfo = buffInfo;
3717 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3718 descriptor_write[1].dstSet = descriptorSet[1];
3719 descriptor_write[1].dstBinding = 0;
3720 descriptor_write[1].descriptorCount = 2;
3721 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3722 descriptor_write[1].pImageInfo = imageInfo;
3723 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3724 descriptor_write[2].dstSet = descriptorSet[1];
3725 descriptor_write[2].dstBinding = 1;
3726 descriptor_write[2].descriptorCount = 2;
3727 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003728 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003729
3730 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003731
Tobin Ehlis88452832015-12-03 09:40:56 -07003732 // Create PSO to be used for draw-time errors below
3733 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003734 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003735 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003736 "out gl_PerVertex {\n"
3737 " vec4 gl_Position;\n"
3738 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003739 "void main(){\n"
3740 " gl_Position = vec4(1);\n"
3741 "}\n";
3742 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003743 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003744 "\n"
3745 "layout(location=0) out vec4 x;\n"
3746 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3747 "void main(){\n"
3748 " x = vec4(bar.y);\n"
3749 "}\n";
3750 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3751 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003752 VkPipelineObj pipe(m_device);
3753 pipe.AddShader(&vs);
3754 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07003755 pipe.AddColorAttachment();
3756 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07003757
3758 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07003759
Karl Schultz6addd812016-02-02 17:17:23 -07003760 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3761 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3762 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
3763 // of PSO
3764 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
3765 // cmd_pipeline.c
3766 // due to the fact that cmd_alloc_dset_data() has not been called in
3767 // cmd_bind_graphics_pipeline()
3768 // TODO : Want to cause various binding incompatibility issues here to test
3769 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07003770 // First cause various verify_layout_compatibility() fails
3771 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003772 // verify_set_layout_compatibility fail cases:
3773 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07003774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3775 " due to: invalid VkPipelineLayout ");
3776 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3777 VK_PIPELINE_BIND_POINT_GRAPHICS,
3778 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
3779 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003780 m_errorMonitor->VerifyFound();
3781
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003782 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07003783 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3784 " attempting to bind set to index 1");
3785 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3786 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
3787 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003788 m_errorMonitor->VerifyFound();
3789
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003790 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003791 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
3792 // descriptors
3793 m_errorMonitor->SetDesiredFailureMsg(
3794 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003795 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003796 vkCmdBindDescriptorSets(
3797 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3798 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003799 m_errorMonitor->VerifyFound();
3800
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003801 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
3802 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07003803 m_errorMonitor->SetDesiredFailureMsg(
3804 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003805 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07003806 vkCmdBindDescriptorSets(
3807 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3808 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003809 m_errorMonitor->VerifyFound();
3810
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003811 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
3812 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07003813 m_errorMonitor->SetDesiredFailureMsg(
3814 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003815 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003816 vkCmdBindDescriptorSets(
3817 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3818 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003819 m_errorMonitor->VerifyFound();
3820
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003821 // Cause INFO messages due to disturbing previously bound Sets
3822 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07003823 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3824 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3825 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003826 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07003827 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003828 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003829 " previously bound as set #0 was disturbed ");
3830 vkCmdBindDescriptorSets(
3831 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3832 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003833 m_errorMonitor->VerifyFound();
3834
Karl Schultz6addd812016-02-02 17:17:23 -07003835 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3836 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3837 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003838 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003840 " newly bound as set #0 so set #1 and "
3841 "any subsequent sets were disturbed ");
3842 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3843 VK_PIPELINE_BIND_POINT_GRAPHICS,
3844 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003845 m_errorMonitor->VerifyFound();
3846
Tobin Ehlis88452832015-12-03 09:40:56 -07003847 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07003848 // 1. Error due to not binding required set (we actually use same code as
3849 // above to disturb set0)
3850 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3851 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3852 2, &descriptorSet[0], 0, NULL);
3853 vkCmdBindDescriptorSets(
3854 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3855 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
3856 m_errorMonitor->SetDesiredFailureMsg(
3857 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3858 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07003859 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003860 m_errorMonitor->VerifyFound();
3861
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003862 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003863 // 2. Error due to bound set not being compatible with PSO's
3864 // VkPipelineLayout (diff stageFlags in this case)
3865 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3866 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3867 2, &descriptorSet[0], 0, NULL);
3868 m_errorMonitor->SetDesiredFailureMsg(
3869 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3870 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07003871 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003872 m_errorMonitor->VerifyFound();
3873
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003874 // Remaining clean-up
3875 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003876 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003877 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
3878 }
3879 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06003880 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
3881 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003882 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003883 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3884 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3885}
Tobin Ehlis559c6382015-11-05 09:52:49 -07003886
Karl Schultz6addd812016-02-02 17:17:23 -07003887TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003888
Karl Schultz6addd812016-02-02 17:17:23 -07003889 m_errorMonitor->SetDesiredFailureMsg(
3890 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003891 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003892
3893 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003894 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003895 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003896 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003897
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003898 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003899}
3900
Karl Schultz6addd812016-02-02 17:17:23 -07003901TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
3902 VkResult err;
3903 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003904
Karl Schultz6addd812016-02-02 17:17:23 -07003905 m_errorMonitor->SetDesiredFailureMsg(
3906 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07003907 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003908
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003909 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003910
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003911 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003912 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003913 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003914 cmd.commandPool = m_commandPool;
3915 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003916 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06003917
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003918 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06003919 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003920
3921 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003922 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003923 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003924 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003925 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003926 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
3927 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003928 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003929
3930 // The error should be caught by validation of the BeginCommandBuffer call
3931 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
3932
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003933 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003934 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003935}
3936
Karl Schultz6addd812016-02-02 17:17:23 -07003937TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003938 // Cause error due to Begin while recording CB
3939 // Then cause 2 errors for attempting to reset CB w/o having
3940 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
3941 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003943 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003944
3945 ASSERT_NO_FATAL_FAILURE(InitState());
3946
3947 // Calls AllocateCommandBuffers
3948 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
3949
Karl Schultz6addd812016-02-02 17:17:23 -07003950 // Force the failure by setting the Renderpass and Framebuffer fields with
3951 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003952 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003953 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003954 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3955 cmd_buf_info.pNext = NULL;
3956 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003957 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003958
3959 // Begin CB to transition to recording state
3960 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
3961 // Can't re-begin. This should trigger error
3962 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003963 m_errorMonitor->VerifyFound();
3964
Karl Schultz6addd812016-02-02 17:17:23 -07003965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3966 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003967 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
3968 // Reset attempt will trigger error due to incorrect CommandPool state
3969 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003970 m_errorMonitor->VerifyFound();
3971
Karl Schultz6addd812016-02-02 17:17:23 -07003972 m_errorMonitor->SetDesiredFailureMsg(
3973 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3974 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003975 // Transition CB to RECORDED state
3976 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
3977 // Now attempting to Begin will implicitly reset, which triggers error
3978 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003979 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003980}
3981
Karl Schultz6addd812016-02-02 17:17:23 -07003982TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003983 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003984 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003985
Karl Schultz6addd812016-02-02 17:17:23 -07003986 m_errorMonitor->SetDesiredFailureMsg(
3987 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003988 "Invalid Pipeline CreateInfo State: Vtx Shader required");
3989
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003990 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003991 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003992
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003993 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003994 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3995 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003996
3997 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003998 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3999 ds_pool_ci.pNext = NULL;
4000 ds_pool_ci.maxSets = 1;
4001 ds_pool_ci.poolSizeCount = 1;
4002 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004003
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004004 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004005 err =
4006 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004007 ASSERT_VK_SUCCESS(err);
4008
Tony Barboureb254902015-07-15 12:50:33 -06004009 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004010 dsl_binding.binding = 0;
4011 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4012 dsl_binding.descriptorCount = 1;
4013 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4014 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004015
Tony Barboureb254902015-07-15 12:50:33 -06004016 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004017 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4018 ds_layout_ci.pNext = NULL;
4019 ds_layout_ci.bindingCount = 1;
4020 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004021
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004022 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004023 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4024 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004025 ASSERT_VK_SUCCESS(err);
4026
4027 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004028 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004029 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004030 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004031 alloc_info.descriptorPool = ds_pool;
4032 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004033 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4034 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004035 ASSERT_VK_SUCCESS(err);
4036
Tony Barboureb254902015-07-15 12:50:33 -06004037 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004038 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4039 pipeline_layout_ci.setLayoutCount = 1;
4040 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004041
4042 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004043 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4044 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004045 ASSERT_VK_SUCCESS(err);
4046
Tobin Ehlise68360f2015-10-01 11:15:13 -06004047 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07004048 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06004049
4050 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004051 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4052 vp_state_ci.scissorCount = 1;
4053 vp_state_ci.pScissors = &sc;
4054 vp_state_ci.viewportCount = 1;
4055 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004056
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004057 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4058 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4059 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4060 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4061 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4062 rs_state_ci.depthClampEnable = VK_FALSE;
4063 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4064 rs_state_ci.depthBiasEnable = VK_FALSE;
4065
Tony Barboureb254902015-07-15 12:50:33 -06004066 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004067 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4068 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004069 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004070 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4071 gp_ci.layout = pipeline_layout;
4072 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06004073
4074 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004075 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4076 pc_ci.initialDataSize = 0;
4077 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004078
4079 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06004080 VkPipelineCache pipelineCache;
4081
Karl Schultz6addd812016-02-02 17:17:23 -07004082 err =
4083 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06004084 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004085 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4086 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004087
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004088 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004089
Chia-I Wuf7458c52015-10-26 21:10:41 +08004090 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4091 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4092 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4093 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004094}
Tobin Ehlis912df022015-09-17 08:46:18 -06004095/*// TODO : This test should be good, but needs Tess support in compiler to run
4096TEST_F(VkLayerTest, InvalidPatchControlPoints)
4097{
4098 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06004099 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004100
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004102 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
4103primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004104
Tobin Ehlis912df022015-09-17 08:46:18 -06004105 ASSERT_NO_FATAL_FAILURE(InitState());
4106 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06004107
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004108 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06004109 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004110 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004111
4112 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4113 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4114 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004115 ds_pool_ci.poolSizeCount = 1;
4116 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06004117
4118 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004119 err = vkCreateDescriptorPool(m_device->device(),
4120VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06004121 ASSERT_VK_SUCCESS(err);
4122
4123 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08004124 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06004125 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08004126 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004127 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4128 dsl_binding.pImmutableSamplers = NULL;
4129
4130 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004131 ds_layout_ci.sType =
4132VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06004133 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004134 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004135 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06004136
4137 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004138 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4139&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06004140 ASSERT_VK_SUCCESS(err);
4141
4142 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004143 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
4144VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06004145 ASSERT_VK_SUCCESS(err);
4146
4147 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004148 pipeline_layout_ci.sType =
4149VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06004150 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004151 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004152 pipeline_layout_ci.pSetLayouts = &ds_layout;
4153
4154 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004155 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4156&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06004157 ASSERT_VK_SUCCESS(err);
4158
4159 VkPipelineShaderStageCreateInfo shaderStages[3];
4160 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
4161
Karl Schultz6addd812016-02-02 17:17:23 -07004162 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
4163this);
Tobin Ehlis912df022015-09-17 08:46:18 -06004164 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07004165 VkShaderObj
4166tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
4167this);
4168 VkShaderObj
4169te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
4170this);
Tobin Ehlis912df022015-09-17 08:46:18 -06004171
Karl Schultz6addd812016-02-02 17:17:23 -07004172 shaderStages[0].sType =
4173VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004174 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004175 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07004176 shaderStages[1].sType =
4177VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004178 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004179 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07004180 shaderStages[2].sType =
4181VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004182 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004183 shaderStages[2].shader = te.handle();
4184
4185 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004186 iaCI.sType =
4187VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08004188 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06004189
4190 VkPipelineTessellationStateCreateInfo tsCI = {};
4191 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
4192 tsCI.patchControlPoints = 0; // This will cause an error
4193
4194 VkGraphicsPipelineCreateInfo gp_ci = {};
4195 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4196 gp_ci.pNext = NULL;
4197 gp_ci.stageCount = 3;
4198 gp_ci.pStages = shaderStages;
4199 gp_ci.pVertexInputState = NULL;
4200 gp_ci.pInputAssemblyState = &iaCI;
4201 gp_ci.pTessellationState = &tsCI;
4202 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004203 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06004204 gp_ci.pMultisampleState = NULL;
4205 gp_ci.pDepthStencilState = NULL;
4206 gp_ci.pColorBlendState = NULL;
4207 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4208 gp_ci.layout = pipeline_layout;
4209 gp_ci.renderPass = renderPass();
4210
4211 VkPipelineCacheCreateInfo pc_ci = {};
4212 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4213 pc_ci.pNext = NULL;
4214 pc_ci.initialSize = 0;
4215 pc_ci.initialData = 0;
4216 pc_ci.maxSize = 0;
4217
4218 VkPipeline pipeline;
4219 VkPipelineCache pipelineCache;
4220
Karl Schultz6addd812016-02-02 17:17:23 -07004221 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
4222&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06004223 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004224 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4225&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06004226
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004227 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004228
Chia-I Wuf7458c52015-10-26 21:10:41 +08004229 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4230 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4231 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4232 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06004233}
4234*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06004235// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07004236TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07004237 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004238
Karl Schultz6addd812016-02-02 17:17:23 -07004239 m_errorMonitor->SetDesiredFailureMsg(
4240 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004241 "Gfx Pipeline viewport count (1) must match scissor count (0).");
4242
Tobin Ehlise68360f2015-10-01 11:15:13 -06004243 ASSERT_NO_FATAL_FAILURE(InitState());
4244 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004245
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004246 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004247 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4248 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004249
4250 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004251 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4252 ds_pool_ci.maxSets = 1;
4253 ds_pool_ci.poolSizeCount = 1;
4254 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004255
4256 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004257 err =
4258 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004259 ASSERT_VK_SUCCESS(err);
4260
4261 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004262 dsl_binding.binding = 0;
4263 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4264 dsl_binding.descriptorCount = 1;
4265 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004266
4267 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004268 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4269 ds_layout_ci.bindingCount = 1;
4270 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004271
4272 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004273 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4274 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004275 ASSERT_VK_SUCCESS(err);
4276
4277 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004278 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004279 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004280 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004281 alloc_info.descriptorPool = ds_pool;
4282 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004283 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4284 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004285 ASSERT_VK_SUCCESS(err);
4286
4287 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004288 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4289 pipeline_layout_ci.setLayoutCount = 1;
4290 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004291
4292 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004293 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4294 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004295 ASSERT_VK_SUCCESS(err);
4296
4297 VkViewport vp = {}; // Just need dummy vp to point to
4298
4299 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004300 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4301 vp_state_ci.scissorCount = 0;
4302 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
4303 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004304
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004305 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4306 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4307 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4308 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4309 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4310 rs_state_ci.depthClampEnable = VK_FALSE;
4311 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4312 rs_state_ci.depthBiasEnable = VK_FALSE;
4313
Cody Northropeb3a6c12015-10-05 14:44:45 -06004314 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004315 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004316
Karl Schultz6addd812016-02-02 17:17:23 -07004317 VkShaderObj vs(m_device, bindStateVertShaderText,
4318 VK_SHADER_STAGE_VERTEX_BIT, this);
4319 VkShaderObj fs(m_device, bindStateFragShaderText,
4320 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004321 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004322 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004323 shaderStages[0] = vs.GetStageCreateInfo();
4324 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004325
4326 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004327 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4328 gp_ci.stageCount = 2;
4329 gp_ci.pStages = shaderStages;
4330 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004331 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004332 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4333 gp_ci.layout = pipeline_layout;
4334 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004335
4336 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004337 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004338
4339 VkPipeline pipeline;
4340 VkPipelineCache pipelineCache;
4341
Karl Schultz6addd812016-02-02 17:17:23 -07004342 err =
4343 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004344 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004345 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4346 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004347
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004348 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004349
Chia-I Wuf7458c52015-10-26 21:10:41 +08004350 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4351 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4352 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4353 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004354}
Karl Schultz6addd812016-02-02 17:17:23 -07004355// Don't set viewport state in PSO. This is an error b/c we always need this
4356// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06004357// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07004358TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06004359 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07004360 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004361
Karl Schultz6addd812016-02-02 17:17:23 -07004362 m_errorMonitor->SetDesiredFailureMsg(
4363 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004364 "Gfx Pipeline pViewportState is null. Even if ");
4365
Tobin Ehlise68360f2015-10-01 11:15:13 -06004366 ASSERT_NO_FATAL_FAILURE(InitState());
4367 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004368
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004369 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004370 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4371 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004372
4373 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004374 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4375 ds_pool_ci.maxSets = 1;
4376 ds_pool_ci.poolSizeCount = 1;
4377 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004378
4379 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004380 err =
4381 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004382 ASSERT_VK_SUCCESS(err);
4383
4384 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004385 dsl_binding.binding = 0;
4386 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4387 dsl_binding.descriptorCount = 1;
4388 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004389
4390 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004391 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4392 ds_layout_ci.bindingCount = 1;
4393 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004394
4395 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004396 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4397 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004398 ASSERT_VK_SUCCESS(err);
4399
4400 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004401 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004402 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004403 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004404 alloc_info.descriptorPool = ds_pool;
4405 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004406 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4407 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004408 ASSERT_VK_SUCCESS(err);
4409
4410 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004411 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4412 pipeline_layout_ci.setLayoutCount = 1;
4413 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004414
4415 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004416 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4417 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004418 ASSERT_VK_SUCCESS(err);
4419
4420 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4421 // Set scissor as dynamic to avoid second error
4422 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004423 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4424 dyn_state_ci.dynamicStateCount = 1;
4425 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004426
Cody Northropeb3a6c12015-10-05 14:44:45 -06004427 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004428 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004429
Karl Schultz6addd812016-02-02 17:17:23 -07004430 VkShaderObj vs(m_device, bindStateVertShaderText,
4431 VK_SHADER_STAGE_VERTEX_BIT, this);
4432 VkShaderObj fs(m_device, bindStateFragShaderText,
4433 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004434 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004435 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004436 shaderStages[0] = vs.GetStageCreateInfo();
4437 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004438
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004439
4440 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4441 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4442 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4443 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4444 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4445 rs_state_ci.depthClampEnable = VK_FALSE;
4446 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4447 rs_state_ci.depthBiasEnable = VK_FALSE;
4448
Tobin Ehlise68360f2015-10-01 11:15:13 -06004449 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004450 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4451 gp_ci.stageCount = 2;
4452 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004453 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004454 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
4455 // should cause validation error
4456 gp_ci.pDynamicState = &dyn_state_ci;
4457 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4458 gp_ci.layout = pipeline_layout;
4459 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004460
4461 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004462 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004463
4464 VkPipeline pipeline;
4465 VkPipelineCache pipelineCache;
4466
Karl Schultz6addd812016-02-02 17:17:23 -07004467 err =
4468 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004469 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004470 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4471 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004472
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004473 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004474
Chia-I Wuf7458c52015-10-26 21:10:41 +08004475 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4476 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4477 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4478 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004479}
4480// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07004481// Then run second test where dynamic scissor count doesn't match PSO scissor
4482// count
4483TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
4484 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004485
Karl Schultz6addd812016-02-02 17:17:23 -07004486 m_errorMonitor->SetDesiredFailureMsg(
4487 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004488 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
4489
Tobin Ehlise68360f2015-10-01 11:15:13 -06004490 ASSERT_NO_FATAL_FAILURE(InitState());
4491 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004492
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004493 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004494 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4495 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004496
4497 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004498 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4499 ds_pool_ci.maxSets = 1;
4500 ds_pool_ci.poolSizeCount = 1;
4501 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004502
4503 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004504 err =
4505 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004506 ASSERT_VK_SUCCESS(err);
4507
4508 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004509 dsl_binding.binding = 0;
4510 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4511 dsl_binding.descriptorCount = 1;
4512 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004513
4514 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004515 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4516 ds_layout_ci.bindingCount = 1;
4517 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004518
4519 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004520 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4521 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004522 ASSERT_VK_SUCCESS(err);
4523
4524 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004525 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004526 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004527 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004528 alloc_info.descriptorPool = ds_pool;
4529 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004530 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4531 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004532 ASSERT_VK_SUCCESS(err);
4533
4534 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004535 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4536 pipeline_layout_ci.setLayoutCount = 1;
4537 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004538
4539 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004540 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4541 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004542 ASSERT_VK_SUCCESS(err);
4543
4544 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004545 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4546 vp_state_ci.viewportCount = 1;
4547 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
4548 vp_state_ci.scissorCount = 1;
4549 vp_state_ci.pScissors =
4550 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06004551
4552 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4553 // Set scissor as dynamic to avoid that error
4554 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004555 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4556 dyn_state_ci.dynamicStateCount = 1;
4557 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004558
Cody Northropeb3a6c12015-10-05 14:44:45 -06004559 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004560 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004561
Karl Schultz6addd812016-02-02 17:17:23 -07004562 VkShaderObj vs(m_device, bindStateVertShaderText,
4563 VK_SHADER_STAGE_VERTEX_BIT, this);
4564 VkShaderObj fs(m_device, bindStateFragShaderText,
4565 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004566 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004567 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004568 shaderStages[0] = vs.GetStageCreateInfo();
4569 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004570
Cody Northropf6622dc2015-10-06 10:33:21 -06004571 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4572 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4573 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004574 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004575 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004576 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004577 vi_ci.pVertexAttributeDescriptions = nullptr;
4578
4579 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4580 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4581 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4582
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004583 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004584 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06004585 rs_ci.pNext = nullptr;
4586
Mark Youngc89c6312016-03-31 16:03:20 -06004587 VkPipelineColorBlendAttachmentState att = {};
4588 att.blendEnable = VK_FALSE;
4589 att.colorWriteMask = 0xf;
4590
Cody Northropf6622dc2015-10-06 10:33:21 -06004591 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4592 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4593 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004594 cb_ci.attachmentCount = 1;
4595 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06004596
Tobin Ehlise68360f2015-10-01 11:15:13 -06004597 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004598 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4599 gp_ci.stageCount = 2;
4600 gp_ci.pStages = shaderStages;
4601 gp_ci.pVertexInputState = &vi_ci;
4602 gp_ci.pInputAssemblyState = &ia_ci;
4603 gp_ci.pViewportState = &vp_state_ci;
4604 gp_ci.pRasterizationState = &rs_ci;
4605 gp_ci.pColorBlendState = &cb_ci;
4606 gp_ci.pDynamicState = &dyn_state_ci;
4607 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4608 gp_ci.layout = pipeline_layout;
4609 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004610
4611 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004612 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004613
4614 VkPipeline pipeline;
4615 VkPipelineCache pipelineCache;
4616
Karl Schultz6addd812016-02-02 17:17:23 -07004617 err =
4618 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004619 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004620 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4621 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004622
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004623 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004624
Tobin Ehlisd332f282015-10-02 11:00:56 -06004625 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07004626 // First need to successfully create the PSO from above by setting
4627 // pViewports
4628 m_errorMonitor->SetDesiredFailureMsg(
4629 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4630 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
4631 "scissorCount is 1. These counts must match.");
4632
4633 VkViewport vp = {}; // Just need dummy vp to point to
4634 vp_state_ci.pViewports = &vp;
4635 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4636 &gp_ci, NULL, &pipeline);
4637 ASSERT_VK_SUCCESS(err);
4638 BeginCommandBuffer();
4639 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4640 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4641 VkRect2D scissors[2] = {}; // don't care about data
4642 // Count of 2 doesn't match PSO count of 1
4643 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
4644 Draw(1, 0, 0, 0);
4645
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004646 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004647
4648 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4649 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4650 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4651 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4652}
4653// Create PSO w/o non-zero scissorCount but no scissor data
4654// Then run second test where dynamic viewportCount doesn't match PSO
4655// viewportCount
4656TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
4657 VkResult err;
4658
4659 m_errorMonitor->SetDesiredFailureMsg(
4660 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4661 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
4662
4663 ASSERT_NO_FATAL_FAILURE(InitState());
4664 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4665
4666 VkDescriptorPoolSize ds_type_count = {};
4667 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4668 ds_type_count.descriptorCount = 1;
4669
4670 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4671 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4672 ds_pool_ci.maxSets = 1;
4673 ds_pool_ci.poolSizeCount = 1;
4674 ds_pool_ci.pPoolSizes = &ds_type_count;
4675
4676 VkDescriptorPool ds_pool;
4677 err =
4678 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4679 ASSERT_VK_SUCCESS(err);
4680
4681 VkDescriptorSetLayoutBinding dsl_binding = {};
4682 dsl_binding.binding = 0;
4683 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4684 dsl_binding.descriptorCount = 1;
4685 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4686
4687 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4688 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4689 ds_layout_ci.bindingCount = 1;
4690 ds_layout_ci.pBindings = &dsl_binding;
4691
4692 VkDescriptorSetLayout ds_layout;
4693 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4694 &ds_layout);
4695 ASSERT_VK_SUCCESS(err);
4696
4697 VkDescriptorSet descriptorSet;
4698 VkDescriptorSetAllocateInfo alloc_info = {};
4699 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4700 alloc_info.descriptorSetCount = 1;
4701 alloc_info.descriptorPool = ds_pool;
4702 alloc_info.pSetLayouts = &ds_layout;
4703 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4704 &descriptorSet);
4705 ASSERT_VK_SUCCESS(err);
4706
4707 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4708 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4709 pipeline_layout_ci.setLayoutCount = 1;
4710 pipeline_layout_ci.pSetLayouts = &ds_layout;
4711
4712 VkPipelineLayout pipeline_layout;
4713 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4714 &pipeline_layout);
4715 ASSERT_VK_SUCCESS(err);
4716
4717 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4718 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4719 vp_state_ci.scissorCount = 1;
4720 vp_state_ci.pScissors =
4721 NULL; // Null scissor w/ count of 1 should cause error
4722 vp_state_ci.viewportCount = 1;
4723 vp_state_ci.pViewports =
4724 NULL; // vp is dynamic (below) so this won't cause error
4725
4726 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
4727 // Set scissor as dynamic to avoid that error
4728 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4729 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4730 dyn_state_ci.dynamicStateCount = 1;
4731 dyn_state_ci.pDynamicStates = &vp_state;
4732
4733 VkPipelineShaderStageCreateInfo shaderStages[2];
4734 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4735
4736 VkShaderObj vs(m_device, bindStateVertShaderText,
4737 VK_SHADER_STAGE_VERTEX_BIT, this);
4738 VkShaderObj fs(m_device, bindStateFragShaderText,
4739 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004740 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004741 // but add it to be able to run on more devices
4742 shaderStages[0] = vs.GetStageCreateInfo();
4743 shaderStages[1] = fs.GetStageCreateInfo();
4744
4745 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4746 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4747 vi_ci.pNext = nullptr;
4748 vi_ci.vertexBindingDescriptionCount = 0;
4749 vi_ci.pVertexBindingDescriptions = nullptr;
4750 vi_ci.vertexAttributeDescriptionCount = 0;
4751 vi_ci.pVertexAttributeDescriptions = nullptr;
4752
4753 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4754 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4755 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4756
4757 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4758 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4759 rs_ci.pNext = nullptr;
4760
Mark Youngc89c6312016-03-31 16:03:20 -06004761 VkPipelineColorBlendAttachmentState att = {};
4762 att.blendEnable = VK_FALSE;
4763 att.colorWriteMask = 0xf;
4764
Karl Schultz6addd812016-02-02 17:17:23 -07004765 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4766 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4767 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004768 cb_ci.attachmentCount = 1;
4769 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004770
4771 VkGraphicsPipelineCreateInfo gp_ci = {};
4772 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4773 gp_ci.stageCount = 2;
4774 gp_ci.pStages = shaderStages;
4775 gp_ci.pVertexInputState = &vi_ci;
4776 gp_ci.pInputAssemblyState = &ia_ci;
4777 gp_ci.pViewportState = &vp_state_ci;
4778 gp_ci.pRasterizationState = &rs_ci;
4779 gp_ci.pColorBlendState = &cb_ci;
4780 gp_ci.pDynamicState = &dyn_state_ci;
4781 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4782 gp_ci.layout = pipeline_layout;
4783 gp_ci.renderPass = renderPass();
4784
4785 VkPipelineCacheCreateInfo pc_ci = {};
4786 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4787
4788 VkPipeline pipeline;
4789 VkPipelineCache pipelineCache;
4790
4791 err =
4792 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4793 ASSERT_VK_SUCCESS(err);
4794 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4795 &gp_ci, NULL, &pipeline);
4796
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004797 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004798
4799 // Now hit second fail case where we set scissor w/ different count than PSO
4800 // First need to successfully create the PSO from above by setting
4801 // pViewports
4802 m_errorMonitor->SetDesiredFailureMsg(
4803 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4804 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4805 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004806
Tobin Ehlisd332f282015-10-02 11:00:56 -06004807 VkRect2D sc = {}; // Just need dummy vp to point to
4808 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004809 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4810 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004811 ASSERT_VK_SUCCESS(err);
4812 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004813 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4814 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004815 VkViewport viewports[2] = {}; // don't care about data
4816 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004817 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004818 Draw(1, 0, 0, 0);
4819
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004820 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004821
Chia-I Wuf7458c52015-10-26 21:10:41 +08004822 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4823 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4824 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4825 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004826}
4827
Mark Young7394fdd2016-03-31 14:56:43 -06004828TEST_F(VkLayerTest, PSOLineWidthInvalid) {
4829 VkResult err;
4830
4831 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004832 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004833
4834 ASSERT_NO_FATAL_FAILURE(InitState());
4835 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4836
4837 VkDescriptorPoolSize ds_type_count = {};
4838 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4839 ds_type_count.descriptorCount = 1;
4840
4841 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4842 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4843 ds_pool_ci.maxSets = 1;
4844 ds_pool_ci.poolSizeCount = 1;
4845 ds_pool_ci.pPoolSizes = &ds_type_count;
4846
4847 VkDescriptorPool ds_pool;
4848 err =
4849 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4850 ASSERT_VK_SUCCESS(err);
4851
4852 VkDescriptorSetLayoutBinding dsl_binding = {};
4853 dsl_binding.binding = 0;
4854 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4855 dsl_binding.descriptorCount = 1;
4856 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4857
4858 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4859 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4860 ds_layout_ci.bindingCount = 1;
4861 ds_layout_ci.pBindings = &dsl_binding;
4862
4863 VkDescriptorSetLayout ds_layout;
4864 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4865 &ds_layout);
4866 ASSERT_VK_SUCCESS(err);
4867
4868 VkDescriptorSet descriptorSet;
4869 VkDescriptorSetAllocateInfo alloc_info = {};
4870 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4871 alloc_info.descriptorSetCount = 1;
4872 alloc_info.descriptorPool = ds_pool;
4873 alloc_info.pSetLayouts = &ds_layout;
4874 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4875 &descriptorSet);
4876 ASSERT_VK_SUCCESS(err);
4877
4878 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4879 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4880 pipeline_layout_ci.setLayoutCount = 1;
4881 pipeline_layout_ci.pSetLayouts = &ds_layout;
4882
4883 VkPipelineLayout pipeline_layout;
4884 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4885 &pipeline_layout);
4886 ASSERT_VK_SUCCESS(err);
4887
4888 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4889 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4890 vp_state_ci.scissorCount = 1;
4891 vp_state_ci.pScissors = NULL;
4892 vp_state_ci.viewportCount = 1;
4893 vp_state_ci.pViewports = NULL;
4894
4895 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
4896 VK_DYNAMIC_STATE_SCISSOR,
4897 VK_DYNAMIC_STATE_LINE_WIDTH};
4898 // Set scissor as dynamic to avoid that error
4899 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4900 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4901 dyn_state_ci.dynamicStateCount = 2;
4902 dyn_state_ci.pDynamicStates = dynamic_states;
4903
4904 VkPipelineShaderStageCreateInfo shaderStages[2];
4905 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4906
4907 VkShaderObj vs(m_device, bindStateVertShaderText,
4908 VK_SHADER_STAGE_VERTEX_BIT, this);
4909 VkShaderObj fs(m_device, bindStateFragShaderText,
4910 VK_SHADER_STAGE_FRAGMENT_BIT,
4911 this); // TODO - We shouldn't need a fragment shader
4912 // but add it to be able to run on more devices
4913 shaderStages[0] = vs.GetStageCreateInfo();
4914 shaderStages[1] = fs.GetStageCreateInfo();
4915
4916 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4917 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4918 vi_ci.pNext = nullptr;
4919 vi_ci.vertexBindingDescriptionCount = 0;
4920 vi_ci.pVertexBindingDescriptions = nullptr;
4921 vi_ci.vertexAttributeDescriptionCount = 0;
4922 vi_ci.pVertexAttributeDescriptions = nullptr;
4923
4924 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4925 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4926 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4927
4928 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4929 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4930 rs_ci.pNext = nullptr;
4931
Mark Young47107952016-05-02 15:59:55 -06004932 // Check too low (line width of -1.0f).
4933 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06004934
4935 VkPipelineColorBlendAttachmentState att = {};
4936 att.blendEnable = VK_FALSE;
4937 att.colorWriteMask = 0xf;
4938
4939 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4940 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4941 cb_ci.pNext = nullptr;
4942 cb_ci.attachmentCount = 1;
4943 cb_ci.pAttachments = &att;
4944
4945 VkGraphicsPipelineCreateInfo gp_ci = {};
4946 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4947 gp_ci.stageCount = 2;
4948 gp_ci.pStages = shaderStages;
4949 gp_ci.pVertexInputState = &vi_ci;
4950 gp_ci.pInputAssemblyState = &ia_ci;
4951 gp_ci.pViewportState = &vp_state_ci;
4952 gp_ci.pRasterizationState = &rs_ci;
4953 gp_ci.pColorBlendState = &cb_ci;
4954 gp_ci.pDynamicState = &dyn_state_ci;
4955 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4956 gp_ci.layout = pipeline_layout;
4957 gp_ci.renderPass = renderPass();
4958
4959 VkPipelineCacheCreateInfo pc_ci = {};
4960 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4961
4962 VkPipeline pipeline;
4963 VkPipelineCache pipelineCache;
4964
4965 err =
4966 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4967 ASSERT_VK_SUCCESS(err);
4968 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4969 &gp_ci, NULL, &pipeline);
4970
4971 m_errorMonitor->VerifyFound();
4972
4973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4974 "Attempt to set lineWidth to 65536");
4975
4976 // Check too high (line width of 65536.0f).
4977 rs_ci.lineWidth = 65536.0f;
4978
4979 err =
4980 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4981 ASSERT_VK_SUCCESS(err);
4982 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4983 &gp_ci, NULL, &pipeline);
4984
4985 m_errorMonitor->VerifyFound();
4986
4987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004988 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004989
4990 dyn_state_ci.dynamicStateCount = 3;
4991
4992 rs_ci.lineWidth = 1.0f;
4993
4994 err =
4995 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4996 ASSERT_VK_SUCCESS(err);
4997 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4998 &gp_ci, NULL, &pipeline);
4999 BeginCommandBuffer();
5000 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5001 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5002
5003 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06005004 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06005005 m_errorMonitor->VerifyFound();
5006
5007 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5008 "Attempt to set lineWidth to 65536");
5009
5010 // Check too high with dynamic setting.
5011 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
5012 m_errorMonitor->VerifyFound();
5013 EndCommandBuffer();
5014
5015 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5016 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5017 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5018 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5019}
5020
Karl Schultz6addd812016-02-02 17:17:23 -07005021TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005022 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005023 m_errorMonitor->SetDesiredFailureMsg(
5024 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005025 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005026
5027 ASSERT_NO_FATAL_FAILURE(InitState());
5028 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005029
Tony Barbourfe3351b2015-07-28 10:17:20 -06005030 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005031 // Don't care about RenderPass handle b/c error should be flagged before
5032 // that
5033 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
5034 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005035
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005036 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005037}
5038
Karl Schultz6addd812016-02-02 17:17:23 -07005039TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005040 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005041 m_errorMonitor->SetDesiredFailureMsg(
5042 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005043 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005044
5045 ASSERT_NO_FATAL_FAILURE(InitState());
5046 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005047
Tony Barbourfe3351b2015-07-28 10:17:20 -06005048 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005049 // Just create a dummy Renderpass that's non-NULL so we can get to the
5050 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06005051 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005052 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
5053 rp_begin.pNext = NULL;
5054 rp_begin.renderPass = renderPass();
5055 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005056
Karl Schultz6addd812016-02-02 17:17:23 -07005057 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
5058 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005059
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005060 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005061}
5062
Karl Schultz6addd812016-02-02 17:17:23 -07005063TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005064 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07005065 m_errorMonitor->SetDesiredFailureMsg(
5066 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005067 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005068
5069 ASSERT_NO_FATAL_FAILURE(InitState());
5070 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005071
5072 // Renderpass is started here
5073 BeginCommandBuffer();
5074
5075 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005076 vk_testing::Buffer dstBuffer;
5077 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005078
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005079 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005080
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005081 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005082}
5083
Karl Schultz6addd812016-02-02 17:17:23 -07005084TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005085 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07005086 m_errorMonitor->SetDesiredFailureMsg(
5087 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005088 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005089
5090 ASSERT_NO_FATAL_FAILURE(InitState());
5091 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005092
5093 // Renderpass is started here
5094 BeginCommandBuffer();
5095
5096 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005097 vk_testing::Buffer dstBuffer;
5098 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005099
Karl Schultz6addd812016-02-02 17:17:23 -07005100 VkDeviceSize dstOffset = 0;
5101 VkDeviceSize dataSize = 1024;
5102 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005103
Karl Schultz6addd812016-02-02 17:17:23 -07005104 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
5105 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005106
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005107 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005108}
5109
Karl Schultz6addd812016-02-02 17:17:23 -07005110TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005111 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005112 m_errorMonitor->SetDesiredFailureMsg(
5113 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005114 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005115
5116 ASSERT_NO_FATAL_FAILURE(InitState());
5117 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005118
5119 // Renderpass is started here
5120 BeginCommandBuffer();
5121
Michael Lentine0a369f62016-02-03 16:51:46 -06005122 VkClearColorValue clear_color;
5123 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07005124 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
5125 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5126 const int32_t tex_width = 32;
5127 const int32_t tex_height = 32;
5128 VkImageCreateInfo image_create_info = {};
5129 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5130 image_create_info.pNext = NULL;
5131 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5132 image_create_info.format = tex_format;
5133 image_create_info.extent.width = tex_width;
5134 image_create_info.extent.height = tex_height;
5135 image_create_info.extent.depth = 1;
5136 image_create_info.mipLevels = 1;
5137 image_create_info.arrayLayers = 1;
5138 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5139 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
5140 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005141
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005142 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005143 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5144 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005145
Karl Schultz6addd812016-02-02 17:17:23 -07005146 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5147 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005148
Karl Schultz6addd812016-02-02 17:17:23 -07005149 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5150 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005151
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005152 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005153}
5154
Karl Schultz6addd812016-02-02 17:17:23 -07005155TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005156 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005157 m_errorMonitor->SetDesiredFailureMsg(
5158 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005159 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005160
5161 ASSERT_NO_FATAL_FAILURE(InitState());
5162 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005163
5164 // Renderpass is started here
5165 BeginCommandBuffer();
5166
5167 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07005168 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005169 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
5170 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5171 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
5172 image_create_info.extent.width = 64;
5173 image_create_info.extent.height = 64;
5174 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5175 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005176
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005177 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005178 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5179 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005180
Karl Schultz6addd812016-02-02 17:17:23 -07005181 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5182 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005183
Karl Schultz6addd812016-02-02 17:17:23 -07005184 vkCmdClearDepthStencilImage(
5185 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5186 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
5187 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005188
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005189 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005190}
5191
Karl Schultz6addd812016-02-02 17:17:23 -07005192TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005193 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005194 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005195
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005197 "vkCmdClearAttachments: This call "
5198 "must be issued inside an active "
5199 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005200
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005201 ASSERT_NO_FATAL_FAILURE(InitState());
5202 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005203
5204 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005205 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005206 ASSERT_VK_SUCCESS(err);
5207
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005208 VkClearAttachment color_attachment;
5209 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5210 color_attachment.clearValue.color.float32[0] = 0;
5211 color_attachment.clearValue.color.float32[1] = 0;
5212 color_attachment.clearValue.color.float32[2] = 0;
5213 color_attachment.clearValue.color.float32[3] = 0;
5214 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005215 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
5216 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5217 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005218
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005219 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005220}
5221
Karl Schultz9e66a292016-04-21 15:57:51 -06005222TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
5223 // Try to add a buffer memory barrier with no buffer.
5224 m_errorMonitor->SetDesiredFailureMsg(
5225 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5226 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
5227
5228 ASSERT_NO_FATAL_FAILURE(InitState());
5229 BeginCommandBuffer();
5230
5231 VkBufferMemoryBarrier buf_barrier = {};
5232 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5233 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5234 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5235 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5236 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5237 buf_barrier.buffer = VK_NULL_HANDLE;
5238 buf_barrier.offset = 0;
5239 buf_barrier.size = VK_WHOLE_SIZE;
5240 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5241 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
5242 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
5243
5244 m_errorMonitor->VerifyFound();
5245}
5246
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06005247TEST_F(VkLayerTest, InvalidBarriers) {
5248 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
5249
5250 m_errorMonitor->SetDesiredFailureMsg(
5251 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
5252
5253 ASSERT_NO_FATAL_FAILURE(InitState());
5254 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5255
5256 VkMemoryBarrier mem_barrier = {};
5257 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
5258 mem_barrier.pNext = NULL;
5259 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5260 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5261 BeginCommandBuffer();
5262 // BeginCommandBuffer() starts a render pass
5263 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5264 VK_PIPELINE_STAGE_HOST_BIT,
5265 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
5266 &mem_barrier, 0, nullptr, 0, nullptr);
5267 m_errorMonitor->VerifyFound();
5268
5269 m_errorMonitor->SetDesiredFailureMsg(
5270 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5271 "Image Layout cannot be transitioned to UNDEFINED");
5272 VkImageObj image(m_device);
5273 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
5274 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5275 ASSERT_TRUE(image.initialized());
5276 VkImageMemoryBarrier img_barrier = {};
5277 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
5278 img_barrier.pNext = NULL;
5279 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5280 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5281 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5282 // New layout can't be UNDEFINED
5283 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5284 img_barrier.image = image.handle();
5285 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5286 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5287 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5288 img_barrier.subresourceRange.baseArrayLayer = 0;
5289 img_barrier.subresourceRange.baseMipLevel = 0;
5290 img_barrier.subresourceRange.layerCount = 1;
5291 img_barrier.subresourceRange.levelCount = 1;
5292 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5293 VK_PIPELINE_STAGE_HOST_BIT,
5294 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5295 nullptr, 1, &img_barrier);
5296 m_errorMonitor->VerifyFound();
5297 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5298
5299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5300 "Subresource must have the sum of the "
5301 "baseArrayLayer");
5302 // baseArrayLayer + layerCount must be <= image's arrayLayers
5303 img_barrier.subresourceRange.baseArrayLayer = 1;
5304 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5305 VK_PIPELINE_STAGE_HOST_BIT,
5306 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5307 nullptr, 1, &img_barrier);
5308 m_errorMonitor->VerifyFound();
5309 img_barrier.subresourceRange.baseArrayLayer = 0;
5310
5311 m_errorMonitor->SetDesiredFailureMsg(
5312 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5313 "Subresource must have the sum of the baseMipLevel");
5314 // baseMipLevel + levelCount must be <= image's mipLevels
5315 img_barrier.subresourceRange.baseMipLevel = 1;
5316 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5317 VK_PIPELINE_STAGE_HOST_BIT,
5318 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5319 nullptr, 1, &img_barrier);
5320 m_errorMonitor->VerifyFound();
5321 img_barrier.subresourceRange.baseMipLevel = 0;
5322
5323 m_errorMonitor->SetDesiredFailureMsg(
5324 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5325 "Buffer Barriers cannot be used during a render pass");
5326 vk_testing::Buffer buffer;
5327 buffer.init(*m_device, 256);
5328 VkBufferMemoryBarrier buf_barrier = {};
5329 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5330 buf_barrier.pNext = NULL;
5331 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5332 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5333 buf_barrier.buffer = buffer.handle();
5334 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5335 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5336 buf_barrier.offset = 0;
5337 buf_barrier.size = VK_WHOLE_SIZE;
5338 // Can't send buffer barrier during a render pass
5339 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5340 VK_PIPELINE_STAGE_HOST_BIT,
5341 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5342 &buf_barrier, 0, nullptr);
5343 m_errorMonitor->VerifyFound();
5344 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
5345
5346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5347 "which is not less than total size");
5348 buf_barrier.offset = 257;
5349 // Offset greater than total size
5350 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5351 VK_PIPELINE_STAGE_HOST_BIT,
5352 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5353 &buf_barrier, 0, nullptr);
5354 m_errorMonitor->VerifyFound();
5355 buf_barrier.offset = 0;
5356
5357 m_errorMonitor->SetDesiredFailureMsg(
5358 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
5359 buf_barrier.size = 257;
5360 // Size greater than total size
5361 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5362 VK_PIPELINE_STAGE_HOST_BIT,
5363 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5364 &buf_barrier, 0, nullptr);
5365 m_errorMonitor->VerifyFound();
5366 buf_barrier.size = VK_WHOLE_SIZE;
5367
5368 m_errorMonitor->SetDesiredFailureMsg(
5369 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5370 "Image is a depth and stencil format and thus must "
5371 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
5372 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
5373 VkDepthStencilObj ds_image(m_device);
5374 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
5375 ASSERT_TRUE(ds_image.initialized());
5376 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5377 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
5378 img_barrier.image = ds_image.handle();
5379 // Leave aspectMask at COLOR on purpose
5380 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5381 VK_PIPELINE_STAGE_HOST_BIT,
5382 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5383 nullptr, 1, &img_barrier);
5384 m_errorMonitor->VerifyFound();
5385}
5386
Karl Schultz6addd812016-02-02 17:17:23 -07005387TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005388 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005389 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005390
Karl Schultz6addd812016-02-02 17:17:23 -07005391 m_errorMonitor->SetDesiredFailureMsg(
5392 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005393 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
5394
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005395 ASSERT_NO_FATAL_FAILURE(InitState());
5396 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005397 uint32_t qfi = 0;
5398 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005399 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5400 buffCI.size = 1024;
5401 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5402 buffCI.queueFamilyIndexCount = 1;
5403 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005404
5405 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005406 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005407 ASSERT_VK_SUCCESS(err);
5408
5409 BeginCommandBuffer();
5410 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005411 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5412 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005413 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07005414 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
5415 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005416
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005417 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005418
Chia-I Wuf7458c52015-10-26 21:10:41 +08005419 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005420}
5421
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005422TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
5423 // Create an out-of-range queueFamilyIndex
5424 m_errorMonitor->SetDesiredFailureMsg(
5425 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06005426 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005427
5428 ASSERT_NO_FATAL_FAILURE(InitState());
5429 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5430 VkBufferCreateInfo buffCI = {};
5431 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5432 buffCI.size = 1024;
5433 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5434 buffCI.queueFamilyIndexCount = 1;
5435 // Introduce failure by specifying invalid queue_family_index
5436 uint32_t qfi = 777;
5437 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06005438 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005439
5440 VkBuffer ib;
5441 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
5442
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005443 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005444}
5445
Karl Schultz6addd812016-02-02 17:17:23 -07005446TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
5447 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
5448 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005449
Karl Schultz6addd812016-02-02 17:17:23 -07005450 m_errorMonitor->SetDesiredFailureMsg(
5451 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005452 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005453
5454 ASSERT_NO_FATAL_FAILURE(InitState());
5455 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005456
5457 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005458 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005459 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
5460 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005461
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005462 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005463}
5464
Karl Schultz6addd812016-02-02 17:17:23 -07005465TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005466 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07005467 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005468
Karl Schultz6addd812016-02-02 17:17:23 -07005469 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005470 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5471 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
5472 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005473
Tobin Ehlis3b780662015-05-28 12:11:26 -06005474 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005475 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005476 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005477 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5478 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005479
5480 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005481 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5482 ds_pool_ci.pNext = NULL;
5483 ds_pool_ci.maxSets = 1;
5484 ds_pool_ci.poolSizeCount = 1;
5485 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005486
Tobin Ehlis3b780662015-05-28 12:11:26 -06005487 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005488 err =
5489 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005490 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005491 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005492 dsl_binding.binding = 0;
5493 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5494 dsl_binding.descriptorCount = 1;
5495 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5496 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005497
Tony Barboureb254902015-07-15 12:50:33 -06005498 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005499 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5500 ds_layout_ci.pNext = NULL;
5501 ds_layout_ci.bindingCount = 1;
5502 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005503
Tobin Ehlis3b780662015-05-28 12:11:26 -06005504 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005505 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5506 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005507 ASSERT_VK_SUCCESS(err);
5508
5509 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005510 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005511 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005512 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005513 alloc_info.descriptorPool = ds_pool;
5514 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005515 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5516 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005517 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005518
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005519 VkSamplerCreateInfo sampler_ci = {};
5520 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5521 sampler_ci.pNext = NULL;
5522 sampler_ci.magFilter = VK_FILTER_NEAREST;
5523 sampler_ci.minFilter = VK_FILTER_NEAREST;
5524 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5525 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5526 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5527 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5528 sampler_ci.mipLodBias = 1.0;
5529 sampler_ci.anisotropyEnable = VK_FALSE;
5530 sampler_ci.maxAnisotropy = 1;
5531 sampler_ci.compareEnable = VK_FALSE;
5532 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5533 sampler_ci.minLod = 1.0;
5534 sampler_ci.maxLod = 1.0;
5535 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5536 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5537 VkSampler sampler;
5538 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5539 ASSERT_VK_SUCCESS(err);
5540
5541 VkDescriptorImageInfo info = {};
5542 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005543
5544 VkWriteDescriptorSet descriptor_write;
5545 memset(&descriptor_write, 0, sizeof(descriptor_write));
5546 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005547 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005548 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005549 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005550 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005551 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005552
5553 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5554
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005555 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005556
Chia-I Wuf7458c52015-10-26 21:10:41 +08005557 vkDestroySampler(m_device->device(), sampler, NULL);
5558 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5559 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005560}
5561
Karl Schultz6addd812016-02-02 17:17:23 -07005562TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005563 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07005564 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005565
Karl Schultz6addd812016-02-02 17:17:23 -07005566 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005567 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5568 " binding #0 with 1 total descriptors but update of 1 descriptors "
5569 "starting at binding offset of 0 combined with update array element "
5570 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005571
Tobin Ehlis3b780662015-05-28 12:11:26 -06005572 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005573 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005574 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005575 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5576 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005577
5578 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005579 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5580 ds_pool_ci.pNext = NULL;
5581 ds_pool_ci.maxSets = 1;
5582 ds_pool_ci.poolSizeCount = 1;
5583 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005584
Tobin Ehlis3b780662015-05-28 12:11:26 -06005585 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005586 err =
5587 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005588 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005589
Tony Barboureb254902015-07-15 12:50:33 -06005590 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005591 dsl_binding.binding = 0;
5592 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5593 dsl_binding.descriptorCount = 1;
5594 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5595 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005596
5597 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005598 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5599 ds_layout_ci.pNext = NULL;
5600 ds_layout_ci.bindingCount = 1;
5601 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005602
Tobin Ehlis3b780662015-05-28 12:11:26 -06005603 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005604 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5605 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005606 ASSERT_VK_SUCCESS(err);
5607
5608 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005609 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005610 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005611 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005612 alloc_info.descriptorPool = ds_pool;
5613 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005614 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5615 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005616 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005617
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005618 // Correctly update descriptor to avoid "NOT_UPDATED" error
5619 VkDescriptorBufferInfo buff_info = {};
5620 buff_info.buffer =
5621 VkBuffer(0); // Don't care about buffer handle for this test
5622 buff_info.offset = 0;
5623 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005624
5625 VkWriteDescriptorSet descriptor_write;
5626 memset(&descriptor_write, 0, sizeof(descriptor_write));
5627 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005628 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005629 descriptor_write.dstArrayElement =
5630 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08005631 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005632 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5633 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005634
5635 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5636
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005637 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005638
Chia-I Wuf7458c52015-10-26 21:10:41 +08005639 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5640 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005641}
5642
Karl Schultz6addd812016-02-02 17:17:23 -07005643TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
5644 // Create layout w/ count of 1 and attempt update to that layout w/ binding
5645 // index 2
5646 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005647
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5649 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005650
Tobin Ehlis3b780662015-05-28 12:11:26 -06005651 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005652 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005653 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005654 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5655 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005656
5657 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005658 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5659 ds_pool_ci.pNext = NULL;
5660 ds_pool_ci.maxSets = 1;
5661 ds_pool_ci.poolSizeCount = 1;
5662 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005663
Tobin Ehlis3b780662015-05-28 12:11:26 -06005664 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005665 err =
5666 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005667 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005668
Tony Barboureb254902015-07-15 12:50:33 -06005669 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005670 dsl_binding.binding = 0;
5671 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5672 dsl_binding.descriptorCount = 1;
5673 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5674 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005675
5676 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005677 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5678 ds_layout_ci.pNext = NULL;
5679 ds_layout_ci.bindingCount = 1;
5680 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005681 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005682 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5683 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005684 ASSERT_VK_SUCCESS(err);
5685
5686 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005687 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005688 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005689 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005690 alloc_info.descriptorPool = ds_pool;
5691 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005692 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5693 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005694 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005695
Tony Barboureb254902015-07-15 12:50:33 -06005696 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005697 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5698 sampler_ci.pNext = NULL;
5699 sampler_ci.magFilter = VK_FILTER_NEAREST;
5700 sampler_ci.minFilter = VK_FILTER_NEAREST;
5701 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5702 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5703 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5704 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5705 sampler_ci.mipLodBias = 1.0;
5706 sampler_ci.anisotropyEnable = VK_FALSE;
5707 sampler_ci.maxAnisotropy = 1;
5708 sampler_ci.compareEnable = VK_FALSE;
5709 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5710 sampler_ci.minLod = 1.0;
5711 sampler_ci.maxLod = 1.0;
5712 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5713 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005714
Tobin Ehlis3b780662015-05-28 12:11:26 -06005715 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005716 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005717 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005718
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005719 VkDescriptorImageInfo info = {};
5720 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005721
5722 VkWriteDescriptorSet descriptor_write;
5723 memset(&descriptor_write, 0, sizeof(descriptor_write));
5724 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005725 descriptor_write.dstSet = descriptorSet;
5726 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005727 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005728 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005729 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005730 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005731
5732 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5733
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005734 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005735
Chia-I Wuf7458c52015-10-26 21:10:41 +08005736 vkDestroySampler(m_device->device(), sampler, NULL);
5737 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5738 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005739}
5740
Karl Schultz6addd812016-02-02 17:17:23 -07005741TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
5742 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
5743 // types
5744 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005745
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005747 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005748
Tobin Ehlis3b780662015-05-28 12:11:26 -06005749 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005750
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005751 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005752 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5753 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005754
5755 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005756 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5757 ds_pool_ci.pNext = NULL;
5758 ds_pool_ci.maxSets = 1;
5759 ds_pool_ci.poolSizeCount = 1;
5760 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005761
Tobin Ehlis3b780662015-05-28 12:11:26 -06005762 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005763 err =
5764 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005765 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005766 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005767 dsl_binding.binding = 0;
5768 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5769 dsl_binding.descriptorCount = 1;
5770 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5771 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005772
Tony Barboureb254902015-07-15 12:50:33 -06005773 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005774 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5775 ds_layout_ci.pNext = NULL;
5776 ds_layout_ci.bindingCount = 1;
5777 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005778
Tobin Ehlis3b780662015-05-28 12:11:26 -06005779 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005780 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5781 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005782 ASSERT_VK_SUCCESS(err);
5783
5784 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005785 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005786 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005787 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005788 alloc_info.descriptorPool = ds_pool;
5789 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005790 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5791 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005792 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005793
Tony Barboureb254902015-07-15 12:50:33 -06005794 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005795 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5796 sampler_ci.pNext = NULL;
5797 sampler_ci.magFilter = VK_FILTER_NEAREST;
5798 sampler_ci.minFilter = VK_FILTER_NEAREST;
5799 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5800 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5801 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5802 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5803 sampler_ci.mipLodBias = 1.0;
5804 sampler_ci.anisotropyEnable = VK_FALSE;
5805 sampler_ci.maxAnisotropy = 1;
5806 sampler_ci.compareEnable = VK_FALSE;
5807 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5808 sampler_ci.minLod = 1.0;
5809 sampler_ci.maxLod = 1.0;
5810 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5811 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005812 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005813 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005814 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005815
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005816 VkDescriptorImageInfo info = {};
5817 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005818
5819 VkWriteDescriptorSet descriptor_write;
5820 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07005821 descriptor_write.sType =
5822 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005823 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005824 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005825 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005826 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005827 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005828
5829 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5830
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005831 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005832
Chia-I Wuf7458c52015-10-26 21:10:41 +08005833 vkDestroySampler(m_device->device(), sampler, NULL);
5834 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5835 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005836}
5837
Karl Schultz6addd812016-02-02 17:17:23 -07005838TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005839 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07005840 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005841
Karl Schultz6addd812016-02-02 17:17:23 -07005842 m_errorMonitor->SetDesiredFailureMsg(
5843 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005844 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005845
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005846 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005847 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
5848 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005849 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005850 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
5851 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005852
5853 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005854 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5855 ds_pool_ci.pNext = NULL;
5856 ds_pool_ci.maxSets = 1;
5857 ds_pool_ci.poolSizeCount = 1;
5858 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005859
5860 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005861 err =
5862 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005863 ASSERT_VK_SUCCESS(err);
5864
5865 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005866 dsl_binding.binding = 0;
5867 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5868 dsl_binding.descriptorCount = 1;
5869 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5870 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005871
5872 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005873 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5874 ds_layout_ci.pNext = NULL;
5875 ds_layout_ci.bindingCount = 1;
5876 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005877 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005878 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5879 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005880 ASSERT_VK_SUCCESS(err);
5881
5882 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005883 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005884 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005885 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005886 alloc_info.descriptorPool = ds_pool;
5887 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005888 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5889 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005890 ASSERT_VK_SUCCESS(err);
5891
Karl Schultz6addd812016-02-02 17:17:23 -07005892 VkSampler sampler =
5893 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005894
5895 VkDescriptorImageInfo descriptor_info;
5896 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5897 descriptor_info.sampler = sampler;
5898
5899 VkWriteDescriptorSet descriptor_write;
5900 memset(&descriptor_write, 0, sizeof(descriptor_write));
5901 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005902 descriptor_write.dstSet = descriptorSet;
5903 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005904 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005905 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5906 descriptor_write.pImageInfo = &descriptor_info;
5907
5908 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5909
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005910 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005911
Chia-I Wuf7458c52015-10-26 21:10:41 +08005912 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5913 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005914}
5915
Karl Schultz6addd812016-02-02 17:17:23 -07005916TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
5917 // Create a single combined Image/Sampler descriptor and send it an invalid
5918 // imageView
5919 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005920
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5922 "Attempted write update to combined "
5923 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -06005924 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005925
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005926 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005927 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005928 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5929 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005930
5931 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005932 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5933 ds_pool_ci.pNext = NULL;
5934 ds_pool_ci.maxSets = 1;
5935 ds_pool_ci.poolSizeCount = 1;
5936 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005937
5938 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005939 err =
5940 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005941 ASSERT_VK_SUCCESS(err);
5942
5943 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005944 dsl_binding.binding = 0;
5945 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5946 dsl_binding.descriptorCount = 1;
5947 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5948 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005949
5950 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005951 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5952 ds_layout_ci.pNext = NULL;
5953 ds_layout_ci.bindingCount = 1;
5954 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005955 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005956 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5957 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005958 ASSERT_VK_SUCCESS(err);
5959
5960 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005961 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005962 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005963 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005964 alloc_info.descriptorPool = ds_pool;
5965 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005966 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5967 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005968 ASSERT_VK_SUCCESS(err);
5969
5970 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005971 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5972 sampler_ci.pNext = NULL;
5973 sampler_ci.magFilter = VK_FILTER_NEAREST;
5974 sampler_ci.minFilter = VK_FILTER_NEAREST;
5975 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5976 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5977 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5978 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5979 sampler_ci.mipLodBias = 1.0;
5980 sampler_ci.anisotropyEnable = VK_FALSE;
5981 sampler_ci.maxAnisotropy = 1;
5982 sampler_ci.compareEnable = VK_FALSE;
5983 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5984 sampler_ci.minLod = 1.0;
5985 sampler_ci.maxLod = 1.0;
5986 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5987 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005988
5989 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005990 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005991 ASSERT_VK_SUCCESS(err);
5992
Karl Schultz6addd812016-02-02 17:17:23 -07005993 VkImageView view =
5994 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005995
5996 VkDescriptorImageInfo descriptor_info;
5997 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5998 descriptor_info.sampler = sampler;
5999 descriptor_info.imageView = view;
6000
6001 VkWriteDescriptorSet descriptor_write;
6002 memset(&descriptor_write, 0, sizeof(descriptor_write));
6003 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006004 descriptor_write.dstSet = descriptorSet;
6005 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006006 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006007 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6008 descriptor_write.pImageInfo = &descriptor_info;
6009
6010 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6011
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006012 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006013
Chia-I Wuf7458c52015-10-26 21:10:41 +08006014 vkDestroySampler(m_device->device(), sampler, NULL);
6015 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6016 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006017}
6018
Karl Schultz6addd812016-02-02 17:17:23 -07006019TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
6020 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
6021 // into the other
6022 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006023
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006024 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6025 " binding #1 with type "
6026 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
6027 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006028
Tobin Ehlis04356f92015-10-27 16:35:27 -06006029 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006030 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006031 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006032 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6033 ds_type_count[0].descriptorCount = 1;
6034 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
6035 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006036
6037 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006038 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6039 ds_pool_ci.pNext = NULL;
6040 ds_pool_ci.maxSets = 1;
6041 ds_pool_ci.poolSizeCount = 2;
6042 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006043
6044 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006045 err =
6046 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006047 ASSERT_VK_SUCCESS(err);
6048 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006049 dsl_binding[0].binding = 0;
6050 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6051 dsl_binding[0].descriptorCount = 1;
6052 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6053 dsl_binding[0].pImmutableSamplers = NULL;
6054 dsl_binding[1].binding = 1;
6055 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6056 dsl_binding[1].descriptorCount = 1;
6057 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
6058 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006059
6060 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006061 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6062 ds_layout_ci.pNext = NULL;
6063 ds_layout_ci.bindingCount = 2;
6064 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006065
6066 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006067 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6068 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006069 ASSERT_VK_SUCCESS(err);
6070
6071 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006072 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006073 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006074 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006075 alloc_info.descriptorPool = ds_pool;
6076 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006077 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6078 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006079 ASSERT_VK_SUCCESS(err);
6080
6081 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006082 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6083 sampler_ci.pNext = NULL;
6084 sampler_ci.magFilter = VK_FILTER_NEAREST;
6085 sampler_ci.minFilter = VK_FILTER_NEAREST;
6086 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6087 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6088 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6089 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6090 sampler_ci.mipLodBias = 1.0;
6091 sampler_ci.anisotropyEnable = VK_FALSE;
6092 sampler_ci.maxAnisotropy = 1;
6093 sampler_ci.compareEnable = VK_FALSE;
6094 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6095 sampler_ci.minLod = 1.0;
6096 sampler_ci.maxLod = 1.0;
6097 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6098 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006099
6100 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006101 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006102 ASSERT_VK_SUCCESS(err);
6103
6104 VkDescriptorImageInfo info = {};
6105 info.sampler = sampler;
6106
6107 VkWriteDescriptorSet descriptor_write;
6108 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
6109 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006110 descriptor_write.dstSet = descriptorSet;
6111 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08006112 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006113 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6114 descriptor_write.pImageInfo = &info;
6115 // This write update should succeed
6116 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6117 // Now perform a copy update that fails due to type mismatch
6118 VkCopyDescriptorSet copy_ds_update;
6119 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6120 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6121 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06006122 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006123 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006124 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08006125 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006126 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6127
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006128 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006129 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006130 m_errorMonitor->SetDesiredFailureMsg(
6131 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006132 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -06006133 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6134 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6135 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006136 copy_ds_update.srcBinding =
6137 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006138 copy_ds_update.dstSet = descriptorSet;
6139 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06006140 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006141 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6142
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006143 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006144
Tobin Ehlis04356f92015-10-27 16:35:27 -06006145 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006146 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006147 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
6148 "update array offset of 0 and update of "
6149 "5 descriptors oversteps total number "
6150 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006151
Tobin Ehlis04356f92015-10-27 16:35:27 -06006152 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6153 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6154 copy_ds_update.srcSet = descriptorSet;
6155 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006156 copy_ds_update.dstSet = descriptorSet;
6157 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006158 copy_ds_update.descriptorCount =
6159 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06006160 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6161
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006162 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006163
Chia-I Wuf7458c52015-10-26 21:10:41 +08006164 vkDestroySampler(m_device->device(), sampler, NULL);
6165 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6166 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006167}
6168
Karl Schultz6addd812016-02-02 17:17:23 -07006169TEST_F(VkLayerTest, NumSamplesMismatch) {
6170 // Create CommandBuffer where MSAA samples doesn't match RenderPass
6171 // sampleCount
6172 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006173
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006174 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006175 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006176
Tobin Ehlis3b780662015-05-28 12:11:26 -06006177 ASSERT_NO_FATAL_FAILURE(InitState());
6178 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006179 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06006180 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006181 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006182
6183 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006184 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6185 ds_pool_ci.pNext = NULL;
6186 ds_pool_ci.maxSets = 1;
6187 ds_pool_ci.poolSizeCount = 1;
6188 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006189
Tobin Ehlis3b780662015-05-28 12:11:26 -06006190 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006191 err =
6192 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006193 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006194
Tony Barboureb254902015-07-15 12:50:33 -06006195 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08006196 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06006197 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08006198 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006199 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6200 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006201
Tony Barboureb254902015-07-15 12:50:33 -06006202 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6203 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6204 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006205 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006206 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006207
Tobin Ehlis3b780662015-05-28 12:11:26 -06006208 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006209 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6210 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006211 ASSERT_VK_SUCCESS(err);
6212
6213 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006214 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006215 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006216 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006217 alloc_info.descriptorPool = ds_pool;
6218 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006219 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6220 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006221 ASSERT_VK_SUCCESS(err);
6222
Tony Barboureb254902015-07-15 12:50:33 -06006223 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006224 pipe_ms_state_ci.sType =
6225 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6226 pipe_ms_state_ci.pNext = NULL;
6227 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6228 pipe_ms_state_ci.sampleShadingEnable = 0;
6229 pipe_ms_state_ci.minSampleShading = 1.0;
6230 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006231
Tony Barboureb254902015-07-15 12:50:33 -06006232 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006233 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6234 pipeline_layout_ci.pNext = NULL;
6235 pipeline_layout_ci.setLayoutCount = 1;
6236 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006237
6238 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006239 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6240 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006241 ASSERT_VK_SUCCESS(err);
6242
Karl Schultz6addd812016-02-02 17:17:23 -07006243 VkShaderObj vs(m_device, bindStateVertShaderText,
6244 VK_SHADER_STAGE_VERTEX_BIT, this);
6245 VkShaderObj fs(m_device, bindStateFragShaderText,
6246 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006247 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006248 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006249 VkPipelineObj pipe(m_device);
6250 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006251 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006252 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006253 pipe.SetMSAA(&pipe_ms_state_ci);
6254 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006255
Tony Barbourfe3351b2015-07-28 10:17:20 -06006256 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006257 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6258 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006259
Mark Young29927482016-05-04 14:38:51 -06006260 // Render triangle (the error should trigger on the attempt to draw).
6261 Draw(3, 1, 0, 0);
6262
6263 // Finalize recording of the command buffer
6264 EndCommandBuffer();
6265
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006266 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006267
Chia-I Wuf7458c52015-10-26 21:10:41 +08006268 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6269 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6270 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006271}
Mark Young29927482016-05-04 14:38:51 -06006272
Mark Youngc89c6312016-03-31 16:03:20 -06006273TEST_F(VkLayerTest, NumBlendAttachMismatch) {
6274 // Create Pipeline where the number of blend attachments doesn't match the
6275 // number of color attachments. In this case, we don't add any color
6276 // blend attachments even though we have a color attachment.
6277 VkResult err;
6278
6279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -06006280 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -06006281
6282 ASSERT_NO_FATAL_FAILURE(InitState());
6283 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6284 VkDescriptorPoolSize ds_type_count = {};
6285 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6286 ds_type_count.descriptorCount = 1;
6287
6288 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6289 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6290 ds_pool_ci.pNext = NULL;
6291 ds_pool_ci.maxSets = 1;
6292 ds_pool_ci.poolSizeCount = 1;
6293 ds_pool_ci.pPoolSizes = &ds_type_count;
6294
6295 VkDescriptorPool ds_pool;
6296 err =
6297 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6298 ASSERT_VK_SUCCESS(err);
6299
6300 VkDescriptorSetLayoutBinding dsl_binding = {};
6301 dsl_binding.binding = 0;
6302 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6303 dsl_binding.descriptorCount = 1;
6304 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6305 dsl_binding.pImmutableSamplers = NULL;
6306
6307 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6308 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6309 ds_layout_ci.pNext = NULL;
6310 ds_layout_ci.bindingCount = 1;
6311 ds_layout_ci.pBindings = &dsl_binding;
6312
6313 VkDescriptorSetLayout ds_layout;
6314 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6315 &ds_layout);
6316 ASSERT_VK_SUCCESS(err);
6317
6318 VkDescriptorSet descriptorSet;
6319 VkDescriptorSetAllocateInfo alloc_info = {};
6320 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6321 alloc_info.descriptorSetCount = 1;
6322 alloc_info.descriptorPool = ds_pool;
6323 alloc_info.pSetLayouts = &ds_layout;
6324 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6325 &descriptorSet);
6326 ASSERT_VK_SUCCESS(err);
6327
6328 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
6329 pipe_ms_state_ci.sType =
6330 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6331 pipe_ms_state_ci.pNext = NULL;
6332 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6333 pipe_ms_state_ci.sampleShadingEnable = 0;
6334 pipe_ms_state_ci.minSampleShading = 1.0;
6335 pipe_ms_state_ci.pSampleMask = NULL;
6336
6337 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6338 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6339 pipeline_layout_ci.pNext = NULL;
6340 pipeline_layout_ci.setLayoutCount = 1;
6341 pipeline_layout_ci.pSetLayouts = &ds_layout;
6342
6343 VkPipelineLayout pipeline_layout;
6344 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6345 &pipeline_layout);
6346 ASSERT_VK_SUCCESS(err);
6347
6348 VkShaderObj vs(m_device, bindStateVertShaderText,
6349 VK_SHADER_STAGE_VERTEX_BIT, this);
6350 VkShaderObj fs(m_device, bindStateFragShaderText,
6351 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006352 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06006353 // but add it to be able to run on more devices
6354 VkPipelineObj pipe(m_device);
6355 pipe.AddShader(&vs);
6356 pipe.AddShader(&fs);
6357 pipe.SetMSAA(&pipe_ms_state_ci);
6358 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6359
6360 BeginCommandBuffer();
6361 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6362 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6363
Mark Young29927482016-05-04 14:38:51 -06006364 // Render triangle (the error should trigger on the attempt to draw).
6365 Draw(3, 1, 0, 0);
6366
6367 // Finalize recording of the command buffer
6368 EndCommandBuffer();
6369
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006370 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06006371
6372 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6373 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6374 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6375}
Mark Young29927482016-05-04 14:38:51 -06006376
Karl Schultz6addd812016-02-02 17:17:23 -07006377TEST_F(VkLayerTest, ClearCmdNoDraw) {
6378 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
6379 // to issuing a Draw
6380 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006381
Karl Schultz6addd812016-02-02 17:17:23 -07006382 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07006383 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006384 "vkCmdClearAttachments() issued on CB object ");
6385
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006386 ASSERT_NO_FATAL_FAILURE(InitState());
6387 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006388
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006389 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006390 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6391 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006392
6393 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006394 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6395 ds_pool_ci.pNext = NULL;
6396 ds_pool_ci.maxSets = 1;
6397 ds_pool_ci.poolSizeCount = 1;
6398 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006399
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006400 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006401 err =
6402 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006403 ASSERT_VK_SUCCESS(err);
6404
Tony Barboureb254902015-07-15 12:50:33 -06006405 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006406 dsl_binding.binding = 0;
6407 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6408 dsl_binding.descriptorCount = 1;
6409 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6410 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006411
Tony Barboureb254902015-07-15 12:50:33 -06006412 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006413 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6414 ds_layout_ci.pNext = NULL;
6415 ds_layout_ci.bindingCount = 1;
6416 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006417
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006418 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006419 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6420 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006421 ASSERT_VK_SUCCESS(err);
6422
6423 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006424 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006425 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006426 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006427 alloc_info.descriptorPool = ds_pool;
6428 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006429 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6430 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006431 ASSERT_VK_SUCCESS(err);
6432
Tony Barboureb254902015-07-15 12:50:33 -06006433 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006434 pipe_ms_state_ci.sType =
6435 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6436 pipe_ms_state_ci.pNext = NULL;
6437 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6438 pipe_ms_state_ci.sampleShadingEnable = 0;
6439 pipe_ms_state_ci.minSampleShading = 1.0;
6440 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006441
Tony Barboureb254902015-07-15 12:50:33 -06006442 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006443 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6444 pipeline_layout_ci.pNext = NULL;
6445 pipeline_layout_ci.setLayoutCount = 1;
6446 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006447
6448 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006449 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6450 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006451 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006452
Karl Schultz6addd812016-02-02 17:17:23 -07006453 VkShaderObj vs(m_device, bindStateVertShaderText,
6454 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006455 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006456 // on more devices
6457 VkShaderObj fs(m_device, bindStateFragShaderText,
6458 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006459
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006460 VkPipelineObj pipe(m_device);
6461 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006462 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006463 pipe.SetMSAA(&pipe_ms_state_ci);
6464 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006465
6466 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006467
Karl Schultz6addd812016-02-02 17:17:23 -07006468 // Main thing we care about for this test is that the VkImage obj we're
6469 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006470 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006471 VkClearAttachment color_attachment;
6472 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6473 color_attachment.clearValue.color.float32[0] = 1.0;
6474 color_attachment.clearValue.color.float32[1] = 1.0;
6475 color_attachment.clearValue.color.float32[2] = 1.0;
6476 color_attachment.clearValue.color.float32[3] = 1.0;
6477 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006478 VkClearRect clear_rect = {
6479 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006480
Karl Schultz6addd812016-02-02 17:17:23 -07006481 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
6482 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006483
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006484 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006485
Chia-I Wuf7458c52015-10-26 21:10:41 +08006486 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6487 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6488 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006489}
6490
Karl Schultz6addd812016-02-02 17:17:23 -07006491TEST_F(VkLayerTest, VtxBufferBadIndex) {
6492 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006493
Karl Schultz6addd812016-02-02 17:17:23 -07006494 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006495 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07006496 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006497
Tobin Ehlis502480b2015-06-24 15:53:07 -06006498 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06006499 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06006500 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006501
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006502 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006503 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6504 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006505
6506 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006507 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6508 ds_pool_ci.pNext = NULL;
6509 ds_pool_ci.maxSets = 1;
6510 ds_pool_ci.poolSizeCount = 1;
6511 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006512
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006513 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006514 err =
6515 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006516 ASSERT_VK_SUCCESS(err);
6517
Tony Barboureb254902015-07-15 12:50:33 -06006518 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006519 dsl_binding.binding = 0;
6520 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6521 dsl_binding.descriptorCount = 1;
6522 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6523 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006524
Tony Barboureb254902015-07-15 12:50:33 -06006525 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006526 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6527 ds_layout_ci.pNext = NULL;
6528 ds_layout_ci.bindingCount = 1;
6529 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006530
Tobin Ehlis502480b2015-06-24 15:53:07 -06006531 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006532 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6533 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006534 ASSERT_VK_SUCCESS(err);
6535
6536 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006537 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006538 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006539 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006540 alloc_info.descriptorPool = ds_pool;
6541 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006542 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6543 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006544 ASSERT_VK_SUCCESS(err);
6545
Tony Barboureb254902015-07-15 12:50:33 -06006546 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006547 pipe_ms_state_ci.sType =
6548 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6549 pipe_ms_state_ci.pNext = NULL;
6550 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6551 pipe_ms_state_ci.sampleShadingEnable = 0;
6552 pipe_ms_state_ci.minSampleShading = 1.0;
6553 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006554
Tony Barboureb254902015-07-15 12:50:33 -06006555 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006556 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6557 pipeline_layout_ci.pNext = NULL;
6558 pipeline_layout_ci.setLayoutCount = 1;
6559 pipeline_layout_ci.pSetLayouts = &ds_layout;
6560 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006561
Karl Schultz6addd812016-02-02 17:17:23 -07006562 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6563 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006564 ASSERT_VK_SUCCESS(err);
6565
Karl Schultz6addd812016-02-02 17:17:23 -07006566 VkShaderObj vs(m_device, bindStateVertShaderText,
6567 VK_SHADER_STAGE_VERTEX_BIT, this);
6568 VkShaderObj fs(m_device, bindStateFragShaderText,
6569 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006570 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006571 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006572 VkPipelineObj pipe(m_device);
6573 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006574 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006575 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006576 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006577 pipe.SetViewport(m_viewports);
6578 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006579 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006580
6581 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006582 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6583 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006584 // Don't care about actual data, just need to get to draw to flag error
6585 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07006586 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
6587 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006588 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06006589 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006590
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006591 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006592
Chia-I Wuf7458c52015-10-26 21:10:41 +08006593 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6594 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6595 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006596}
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06006597// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
6598TEST_F(VkLayerTest, InvalidImageLayout) {
6599 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
6600 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
6601 "images in the wrong layout when they're copied or transitioned.");
6602 // 3 in ValidateCmdBufImageLayouts
6603 // * -1 Attempt to submit cmd buf w/ deleted image
6604 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
6605 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
6606 m_errorMonitor->SetDesiredFailureMsg(
6607 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6608 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
6609
6610 ASSERT_NO_FATAL_FAILURE(InitState());
6611 // Create src & dst images to use for copy operations
6612 VkImage src_image;
6613 VkImage dst_image;
6614
6615 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6616 const int32_t tex_width = 32;
6617 const int32_t tex_height = 32;
6618
6619 VkImageCreateInfo image_create_info = {};
6620 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6621 image_create_info.pNext = NULL;
6622 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6623 image_create_info.format = tex_format;
6624 image_create_info.extent.width = tex_width;
6625 image_create_info.extent.height = tex_height;
6626 image_create_info.extent.depth = 1;
6627 image_create_info.mipLevels = 1;
6628 image_create_info.arrayLayers = 4;
6629 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6630 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6631 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6632 image_create_info.flags = 0;
6633
6634 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
6635 ASSERT_VK_SUCCESS(err);
6636 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
6637 ASSERT_VK_SUCCESS(err);
6638
6639 BeginCommandBuffer();
6640 VkImageCopy copyRegion;
6641 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6642 copyRegion.srcSubresource.mipLevel = 0;
6643 copyRegion.srcSubresource.baseArrayLayer = 0;
6644 copyRegion.srcSubresource.layerCount = 1;
6645 copyRegion.srcOffset.x = 0;
6646 copyRegion.srcOffset.y = 0;
6647 copyRegion.srcOffset.z = 0;
6648 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6649 copyRegion.dstSubresource.mipLevel = 0;
6650 copyRegion.dstSubresource.baseArrayLayer = 0;
6651 copyRegion.dstSubresource.layerCount = 1;
6652 copyRegion.dstOffset.x = 0;
6653 copyRegion.dstOffset.y = 0;
6654 copyRegion.dstOffset.z = 0;
6655 copyRegion.extent.width = 1;
6656 copyRegion.extent.height = 1;
6657 copyRegion.extent.depth = 1;
6658 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6659 m_errorMonitor->VerifyFound();
6660 // Now cause error due to src image layout changing
6661 m_errorMonitor->SetDesiredFailureMsg(
6662 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6663 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
6664 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6665 m_errorMonitor->VerifyFound();
6666 // Final src error is due to bad layout type
6667 m_errorMonitor->SetDesiredFailureMsg(
6668 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6669 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
6670 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6671 m_errorMonitor->VerifyFound();
6672 // Now verify same checks for dst
6673 m_errorMonitor->SetDesiredFailureMsg(
6674 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6675 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
6676 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6677 m_errorMonitor->VerifyFound();
6678 // Now cause error due to src image layout changing
6679 m_errorMonitor->SetDesiredFailureMsg(
6680 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6681 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
6682 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
6683 m_errorMonitor->VerifyFound();
6684 m_errorMonitor->SetDesiredFailureMsg(
6685 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6686 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
6687 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
6688 m_errorMonitor->VerifyFound();
6689 // Now cause error due to bad image layout transition in PipelineBarrier
6690 VkImageMemoryBarrier image_barrier[1] = {};
6691 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
6692 image_barrier[0].image = src_image;
6693 image_barrier[0].subresourceRange.layerCount = 2;
6694 image_barrier[0].subresourceRange.levelCount = 2;
6695 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6696 m_errorMonitor->SetDesiredFailureMsg(
6697 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6698 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
6699 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
6700 m_errorMonitor->VerifyFound();
6701
6702 // Finally some layout errors at RenderPass create time
6703 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
6704 VkAttachmentReference attach = {};
6705 // perf warning for GENERAL layout w/ non-DS input attachment
6706 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
6707 VkSubpassDescription subpass = {};
6708 subpass.inputAttachmentCount = 1;
6709 subpass.pInputAttachments = &attach;
6710 VkRenderPassCreateInfo rpci = {};
6711 rpci.subpassCount = 1;
6712 rpci.pSubpasses = &subpass;
6713 rpci.attachmentCount = 1;
6714 VkAttachmentDescription attach_desc = {};
6715 attach_desc.format = VK_FORMAT_UNDEFINED;
6716 rpci.pAttachments = &attach_desc;
6717 VkRenderPass rp;
6718 m_errorMonitor->SetDesiredFailureMsg(
6719 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6720 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
6721 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6722 m_errorMonitor->VerifyFound();
6723 // error w/ non-general layout
6724 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
6725
6726 m_errorMonitor->SetDesiredFailureMsg(
6727 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6728 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
6729 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6730 m_errorMonitor->VerifyFound();
6731 subpass.inputAttachmentCount = 0;
6732 subpass.colorAttachmentCount = 1;
6733 subpass.pColorAttachments = &attach;
6734 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
6735 // perf warning for GENERAL layout on color attachment
6736 m_errorMonitor->SetDesiredFailureMsg(
6737 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6738 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
6739 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6740 m_errorMonitor->VerifyFound();
6741 // error w/ non-color opt or GENERAL layout for color attachment
6742 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
6743 m_errorMonitor->SetDesiredFailureMsg(
6744 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6745 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
6746 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6747 m_errorMonitor->VerifyFound();
6748 subpass.colorAttachmentCount = 0;
6749 subpass.pDepthStencilAttachment = &attach;
6750 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
6751 // perf warning for GENERAL layout on DS attachment
6752 m_errorMonitor->SetDesiredFailureMsg(
6753 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6754 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
6755 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6756 m_errorMonitor->VerifyFound();
6757 // error w/ non-ds opt or GENERAL layout for color attachment
6758 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
6759 m_errorMonitor->SetDesiredFailureMsg(
6760 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6761 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
6762 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6763 m_errorMonitor->VerifyFound();
6764
6765 vkDestroyImage(m_device->device(), src_image, NULL);
6766 vkDestroyImage(m_device->device(), dst_image, NULL);
6767}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006768#endif // DRAW_STATE_TESTS
6769
Tobin Ehlis0788f522015-05-26 16:11:58 -06006770#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06006771#if GTEST_IS_THREADSAFE
6772struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006773 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006774 VkEvent event;
6775 bool bailout;
6776};
6777
Karl Schultz6addd812016-02-02 17:17:23 -07006778extern "C" void *AddToCommandBuffer(void *arg) {
6779 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006780
Karl Schultz6addd812016-02-02 17:17:23 -07006781 for (int i = 0; i < 10000; i++) {
6782 vkCmdSetEvent(data->commandBuffer, data->event,
6783 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006784 if (data->bailout) {
6785 break;
6786 }
6787 }
6788 return NULL;
6789}
6790
Karl Schultz6addd812016-02-02 17:17:23 -07006791TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006792 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006793
Karl Schultz6addd812016-02-02 17:17:23 -07006794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6795 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006796
Mike Stroyanaccf7692015-05-12 16:00:45 -06006797 ASSERT_NO_FATAL_FAILURE(InitState());
6798 ASSERT_NO_FATAL_FAILURE(InitViewport());
6799 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6800
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006801 // Calls AllocateCommandBuffers
6802 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006803
6804 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006805 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006806
6807 VkEventCreateInfo event_info;
6808 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006809 VkResult err;
6810
6811 memset(&event_info, 0, sizeof(event_info));
6812 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6813
Chia-I Wuf7458c52015-10-26 21:10:41 +08006814 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006815 ASSERT_VK_SUCCESS(err);
6816
Mike Stroyanaccf7692015-05-12 16:00:45 -06006817 err = vkResetEvent(device(), event);
6818 ASSERT_VK_SUCCESS(err);
6819
6820 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006821 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006822 data.event = event;
6823 data.bailout = false;
6824 m_errorMonitor->SetBailout(&data.bailout);
6825 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006826 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006827 // Add many entries to command buffer from this thread at the same time.
6828 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006829
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006830 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006831 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006832
Mike Stroyan10b8cb72016-01-22 15:22:03 -07006833 m_errorMonitor->SetBailout(NULL);
6834
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006835 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006836
Chia-I Wuf7458c52015-10-26 21:10:41 +08006837 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006838}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006839#endif // GTEST_IS_THREADSAFE
6840#endif // THREADING_TESTS
6841
Chris Forbes9f7ff632015-05-25 11:13:08 +12006842#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006843TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006845 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006846
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006847 ASSERT_NO_FATAL_FAILURE(InitState());
6848 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6849
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006850 VkShaderModule module;
6851 VkShaderModuleCreateInfo moduleCreateInfo;
6852 struct icd_spv_header spv;
6853
6854 spv.magic = ICD_SPV_MAGIC;
6855 spv.version = ICD_SPV_VERSION;
6856 spv.gen_magic = 0;
6857
6858 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6859 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006860 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006861 moduleCreateInfo.codeSize = 4;
6862 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006863 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006864
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006865 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006866}
6867
Karl Schultz6addd812016-02-02 17:17:23 -07006868TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006870 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006871
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006872 ASSERT_NO_FATAL_FAILURE(InitState());
6873 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6874
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006875 VkShaderModule module;
6876 VkShaderModuleCreateInfo moduleCreateInfo;
6877 struct icd_spv_header spv;
6878
6879 spv.magic = ~ICD_SPV_MAGIC;
6880 spv.version = ICD_SPV_VERSION;
6881 spv.gen_magic = 0;
6882
6883 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6884 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006885 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006886 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6887 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006888 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006889
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006890 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006891}
6892
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006893#if 0
6894// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07006895TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006897 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006898
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006899 ASSERT_NO_FATAL_FAILURE(InitState());
6900 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6901
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006902 VkShaderModule module;
6903 VkShaderModuleCreateInfo moduleCreateInfo;
6904 struct icd_spv_header spv;
6905
6906 spv.magic = ICD_SPV_MAGIC;
6907 spv.version = ~ICD_SPV_VERSION;
6908 spv.gen_magic = 0;
6909
6910 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6911 moduleCreateInfo.pNext = NULL;
6912
Karl Schultz6addd812016-02-02 17:17:23 -07006913 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006914 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6915 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006916 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006917
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006918 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006919}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006920#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006921
Karl Schultz6addd812016-02-02 17:17:23 -07006922TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006924 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006925
Chris Forbes9f7ff632015-05-25 11:13:08 +12006926 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006927 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006928
6929 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006930 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006931 "\n"
6932 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006933 "out gl_PerVertex {\n"
6934 " vec4 gl_Position;\n"
6935 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006936 "void main(){\n"
6937 " gl_Position = vec4(1);\n"
6938 " x = 0;\n"
6939 "}\n";
6940 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006941 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006942 "\n"
6943 "layout(location=0) out vec4 color;\n"
6944 "void main(){\n"
6945 " color = vec4(1);\n"
6946 "}\n";
6947
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006948 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6949 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006950
6951 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006952 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006953 pipe.AddShader(&vs);
6954 pipe.AddShader(&fs);
6955
Chris Forbes9f7ff632015-05-25 11:13:08 +12006956 VkDescriptorSetObj descriptorSet(m_device);
6957 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006958 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006959
Tony Barbour5781e8f2015-08-04 16:23:11 -06006960 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006961
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006962 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006963}
Chris Forbes9f7ff632015-05-25 11:13:08 +12006964
Karl Schultz6addd812016-02-02 17:17:23 -07006965TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006966 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006967 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006968
Chris Forbes59cb88d2015-05-25 11:13:13 +12006969 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006970 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006971
6972 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006973 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006974 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006975 "out gl_PerVertex {\n"
6976 " vec4 gl_Position;\n"
6977 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006978 "void main(){\n"
6979 " gl_Position = vec4(1);\n"
6980 "}\n";
6981 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006982 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006983 "\n"
6984 "layout(location=0) in float x;\n"
6985 "layout(location=0) out vec4 color;\n"
6986 "void main(){\n"
6987 " color = vec4(x);\n"
6988 "}\n";
6989
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006990 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6991 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006992
6993 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006994 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006995 pipe.AddShader(&vs);
6996 pipe.AddShader(&fs);
6997
Chris Forbes59cb88d2015-05-25 11:13:13 +12006998 VkDescriptorSetObj descriptorSet(m_device);
6999 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007000 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12007001
Tony Barbour5781e8f2015-08-04 16:23:11 -06007002 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12007003
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007004 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12007005}
7006
Karl Schultz6addd812016-02-02 17:17:23 -07007007TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13007008 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007009 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13007010
7011 ASSERT_NO_FATAL_FAILURE(InitState());
7012 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7013
7014 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007015 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007016 "\n"
7017 "out gl_PerVertex {\n"
7018 " vec4 gl_Position;\n"
7019 "};\n"
7020 "void main(){\n"
7021 " gl_Position = vec4(1);\n"
7022 "}\n";
7023 char const *fsSource =
7024 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007025 "\n"
7026 "in block { layout(location=0) float x; } ins;\n"
7027 "layout(location=0) out vec4 color;\n"
7028 "void main(){\n"
7029 " color = vec4(ins.x);\n"
7030 "}\n";
7031
7032 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7033 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7034
7035 VkPipelineObj pipe(m_device);
7036 pipe.AddColorAttachment();
7037 pipe.AddShader(&vs);
7038 pipe.AddShader(&fs);
7039
7040 VkDescriptorSetObj descriptorSet(m_device);
7041 descriptorSet.AppendDummy();
7042 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7043
7044 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7045
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007046 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13007047}
7048
Karl Schultz6addd812016-02-02 17:17:23 -07007049TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13007050 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13007051 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07007052 "output arr[2] of float32' vs 'ptr to "
7053 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13007054
7055 ASSERT_NO_FATAL_FAILURE(InitState());
7056 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7057
7058 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007059 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13007060 "\n"
7061 "layout(location=0) out float x[2];\n"
7062 "out gl_PerVertex {\n"
7063 " vec4 gl_Position;\n"
7064 "};\n"
7065 "void main(){\n"
7066 " x[0] = 0; x[1] = 0;\n"
7067 " gl_Position = vec4(1);\n"
7068 "}\n";
7069 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007070 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13007071 "\n"
7072 "layout(location=0) in float x[3];\n"
7073 "layout(location=0) out vec4 color;\n"
7074 "void main(){\n"
7075 " color = vec4(x[0] + x[1] + x[2]);\n"
7076 "}\n";
7077
7078 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7079 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7080
7081 VkPipelineObj pipe(m_device);
7082 pipe.AddColorAttachment();
7083 pipe.AddShader(&vs);
7084 pipe.AddShader(&fs);
7085
7086 VkDescriptorSetObj descriptorSet(m_device);
7087 descriptorSet.AppendDummy();
7088 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7089
7090 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7091
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007092 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13007093}
7094
Karl Schultz6addd812016-02-02 17:17:23 -07007095TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007097 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007098
Chris Forbesb56af562015-05-25 11:13:17 +12007099 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12007101
7102 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007103 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007104 "\n"
7105 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007106 "out gl_PerVertex {\n"
7107 " vec4 gl_Position;\n"
7108 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007109 "void main(){\n"
7110 " x = 0;\n"
7111 " gl_Position = vec4(1);\n"
7112 "}\n";
7113 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007114 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007115 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007116 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12007117 "layout(location=0) out vec4 color;\n"
7118 "void main(){\n"
7119 " color = vec4(x);\n"
7120 "}\n";
7121
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007122 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7123 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12007124
7125 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007126 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12007127 pipe.AddShader(&vs);
7128 pipe.AddShader(&fs);
7129
Chris Forbesb56af562015-05-25 11:13:17 +12007130 VkDescriptorSetObj descriptorSet(m_device);
7131 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007132 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12007133
Tony Barbour5781e8f2015-08-04 16:23:11 -06007134 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12007135
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007136 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12007137}
7138
Karl Schultz6addd812016-02-02 17:17:23 -07007139TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13007140 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007141 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13007142
7143 ASSERT_NO_FATAL_FAILURE(InitState());
7144 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7145
7146 char const *vsSource =
7147 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007148 "\n"
7149 "out block { layout(location=0) int x; } outs;\n"
7150 "out gl_PerVertex {\n"
7151 " vec4 gl_Position;\n"
7152 "};\n"
7153 "void main(){\n"
7154 " outs.x = 0;\n"
7155 " gl_Position = vec4(1);\n"
7156 "}\n";
7157 char const *fsSource =
7158 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007159 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007160 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13007161 "layout(location=0) out vec4 color;\n"
7162 "void main(){\n"
7163 " color = vec4(ins.x);\n"
7164 "}\n";
7165
7166 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7167 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7168
7169 VkPipelineObj pipe(m_device);
7170 pipe.AddColorAttachment();
7171 pipe.AddShader(&vs);
7172 pipe.AddShader(&fs);
7173
7174 VkDescriptorSetObj descriptorSet(m_device);
7175 descriptorSet.AppendDummy();
7176 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7177
7178 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7179
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007180 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13007181}
7182
7183TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
7184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7185 "location 0.0 which is not written by vertex shader");
7186
7187 ASSERT_NO_FATAL_FAILURE(InitState());
7188 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7189
7190 char const *vsSource =
7191 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007192 "\n"
7193 "out block { layout(location=1) float x; } outs;\n"
7194 "out gl_PerVertex {\n"
7195 " vec4 gl_Position;\n"
7196 "};\n"
7197 "void main(){\n"
7198 " outs.x = 0;\n"
7199 " gl_Position = vec4(1);\n"
7200 "}\n";
7201 char const *fsSource =
7202 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007203 "\n"
7204 "in block { layout(location=0) float x; } ins;\n"
7205 "layout(location=0) out vec4 color;\n"
7206 "void main(){\n"
7207 " color = vec4(ins.x);\n"
7208 "}\n";
7209
7210 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7211 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7212
7213 VkPipelineObj pipe(m_device);
7214 pipe.AddColorAttachment();
7215 pipe.AddShader(&vs);
7216 pipe.AddShader(&fs);
7217
7218 VkDescriptorSetObj descriptorSet(m_device);
7219 descriptorSet.AppendDummy();
7220 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7221
7222 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7223
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007224 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13007225}
7226
7227TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
7228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7229 "location 0.1 which is not written by vertex shader");
7230
7231 ASSERT_NO_FATAL_FAILURE(InitState());
7232 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7233
7234 char const *vsSource =
7235 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007236 "\n"
7237 "out block { layout(location=0, component=0) float x; } outs;\n"
7238 "out gl_PerVertex {\n"
7239 " vec4 gl_Position;\n"
7240 "};\n"
7241 "void main(){\n"
7242 " outs.x = 0;\n"
7243 " gl_Position = vec4(1);\n"
7244 "}\n";
7245 char const *fsSource =
7246 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007247 "\n"
7248 "in block { layout(location=0, component=1) float x; } ins;\n"
7249 "layout(location=0) out vec4 color;\n"
7250 "void main(){\n"
7251 " color = vec4(ins.x);\n"
7252 "}\n";
7253
7254 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7255 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7256
7257 VkPipelineObj pipe(m_device);
7258 pipe.AddColorAttachment();
7259 pipe.AddShader(&vs);
7260 pipe.AddShader(&fs);
7261
7262 VkDescriptorSetObj descriptorSet(m_device);
7263 descriptorSet.AppendDummy();
7264 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7265
7266 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7267
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007268 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13007269}
7270
Karl Schultz6addd812016-02-02 17:17:23 -07007271TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007273 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007274
Chris Forbesde136e02015-05-25 11:13:28 +12007275 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007276 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12007277
7278 VkVertexInputBindingDescription input_binding;
7279 memset(&input_binding, 0, sizeof(input_binding));
7280
7281 VkVertexInputAttributeDescription input_attrib;
7282 memset(&input_attrib, 0, sizeof(input_attrib));
7283 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7284
7285 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007286 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007287 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007288 "out gl_PerVertex {\n"
7289 " vec4 gl_Position;\n"
7290 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007291 "void main(){\n"
7292 " gl_Position = vec4(1);\n"
7293 "}\n";
7294 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007295 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007296 "\n"
7297 "layout(location=0) out vec4 color;\n"
7298 "void main(){\n"
7299 " color = vec4(1);\n"
7300 "}\n";
7301
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007302 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7303 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12007304
7305 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007306 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12007307 pipe.AddShader(&vs);
7308 pipe.AddShader(&fs);
7309
7310 pipe.AddVertexInputBindings(&input_binding, 1);
7311 pipe.AddVertexInputAttribs(&input_attrib, 1);
7312
Chris Forbesde136e02015-05-25 11:13:28 +12007313 VkDescriptorSetObj descriptorSet(m_device);
7314 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007315 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12007316
Tony Barbour5781e8f2015-08-04 16:23:11 -06007317 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12007318
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007319 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12007320}
7321
Karl Schultz6addd812016-02-02 17:17:23 -07007322TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007324 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13007325
7326 ASSERT_NO_FATAL_FAILURE(InitState());
7327 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7328
7329 VkVertexInputBindingDescription input_binding;
7330 memset(&input_binding, 0, sizeof(input_binding));
7331
7332 VkVertexInputAttributeDescription input_attrib;
7333 memset(&input_attrib, 0, sizeof(input_attrib));
7334 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7335
7336 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007337 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007338 "\n"
7339 "layout(location=1) in float x;\n"
7340 "out gl_PerVertex {\n"
7341 " vec4 gl_Position;\n"
7342 "};\n"
7343 "void main(){\n"
7344 " gl_Position = vec4(x);\n"
7345 "}\n";
7346 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007347 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007348 "\n"
7349 "layout(location=0) out vec4 color;\n"
7350 "void main(){\n"
7351 " color = vec4(1);\n"
7352 "}\n";
7353
7354 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7355 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7356
7357 VkPipelineObj pipe(m_device);
7358 pipe.AddColorAttachment();
7359 pipe.AddShader(&vs);
7360 pipe.AddShader(&fs);
7361
7362 pipe.AddVertexInputBindings(&input_binding, 1);
7363 pipe.AddVertexInputAttribs(&input_attrib, 1);
7364
7365 VkDescriptorSetObj descriptorSet(m_device);
7366 descriptorSet.AppendDummy();
7367 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7368
7369 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7370
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007371 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13007372}
7373
Karl Schultz6addd812016-02-02 17:17:23 -07007374TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
7375 m_errorMonitor->SetDesiredFailureMsg(
7376 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007377 "VS consumes input at location 0 but not provided");
7378
Chris Forbes62e8e502015-05-25 11:13:29 +12007379 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007380 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12007381
7382 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007383 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007384 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007385 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07007386 "out gl_PerVertex {\n"
7387 " vec4 gl_Position;\n"
7388 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007389 "void main(){\n"
7390 " gl_Position = x;\n"
7391 "}\n";
7392 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007393 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007394 "\n"
7395 "layout(location=0) out vec4 color;\n"
7396 "void main(){\n"
7397 " color = vec4(1);\n"
7398 "}\n";
7399
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007400 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7401 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12007402
7403 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007404 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12007405 pipe.AddShader(&vs);
7406 pipe.AddShader(&fs);
7407
Chris Forbes62e8e502015-05-25 11:13:29 +12007408 VkDescriptorSetObj descriptorSet(m_device);
7409 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007410 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12007411
Tony Barbour5781e8f2015-08-04 16:23:11 -06007412 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12007413
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007414 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12007415}
7416
Karl Schultz6addd812016-02-02 17:17:23 -07007417TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
7418 m_errorMonitor->SetDesiredFailureMsg(
7419 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007420 "location 0 does not match VS input type");
7421
Chris Forbesc97d98e2015-05-25 11:13:31 +12007422 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007423 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12007424
7425 VkVertexInputBindingDescription input_binding;
7426 memset(&input_binding, 0, sizeof(input_binding));
7427
7428 VkVertexInputAttributeDescription input_attrib;
7429 memset(&input_attrib, 0, sizeof(input_attrib));
7430 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7431
7432 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007433 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007434 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007435 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007436 "out gl_PerVertex {\n"
7437 " vec4 gl_Position;\n"
7438 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007439 "void main(){\n"
7440 " gl_Position = vec4(x);\n"
7441 "}\n";
7442 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007443 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007444 "\n"
7445 "layout(location=0) out vec4 color;\n"
7446 "void main(){\n"
7447 " color = vec4(1);\n"
7448 "}\n";
7449
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007450 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7451 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12007452
7453 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007454 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12007455 pipe.AddShader(&vs);
7456 pipe.AddShader(&fs);
7457
7458 pipe.AddVertexInputBindings(&input_binding, 1);
7459 pipe.AddVertexInputAttribs(&input_attrib, 1);
7460
Chris Forbesc97d98e2015-05-25 11:13:31 +12007461 VkDescriptorSetObj descriptorSet(m_device);
7462 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007463 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12007464
Tony Barbour5781e8f2015-08-04 16:23:11 -06007465 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12007466
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007467 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12007468}
7469
Chris Forbesc68b43c2016-04-06 11:18:47 +12007470TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
7471 m_errorMonitor->SetDesiredFailureMsg(
7472 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7473 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
7474
7475 ASSERT_NO_FATAL_FAILURE(InitState());
7476 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7477
7478 char const *vsSource =
7479 "#version 450\n"
7480 "\n"
7481 "out gl_PerVertex {\n"
7482 " vec4 gl_Position;\n"
7483 "};\n"
7484 "void main(){\n"
7485 " gl_Position = vec4(1);\n"
7486 "}\n";
7487 char const *fsSource =
7488 "#version 450\n"
7489 "\n"
7490 "layout(location=0) out vec4 color;\n"
7491 "void main(){\n"
7492 " color = vec4(1);\n"
7493 "}\n";
7494
7495 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7496 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7497
7498 VkPipelineObj pipe(m_device);
7499 pipe.AddColorAttachment();
7500 pipe.AddShader(&vs);
7501 pipe.AddShader(&vs);
7502 pipe.AddShader(&fs);
7503
7504 VkDescriptorSetObj descriptorSet(m_device);
7505 descriptorSet.AppendDummy();
7506 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7507
7508 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7509
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007510 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12007511}
7512
Karl Schultz6addd812016-02-02 17:17:23 -07007513TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007514 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007515
7516 ASSERT_NO_FATAL_FAILURE(InitState());
7517 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7518
7519 VkVertexInputBindingDescription input_binding;
7520 memset(&input_binding, 0, sizeof(input_binding));
7521
7522 VkVertexInputAttributeDescription input_attribs[2];
7523 memset(input_attribs, 0, sizeof(input_attribs));
7524
7525 for (int i = 0; i < 2; i++) {
7526 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7527 input_attribs[i].location = i;
7528 }
7529
7530 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007531 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007532 "\n"
7533 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007534 "out gl_PerVertex {\n"
7535 " vec4 gl_Position;\n"
7536 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007537 "void main(){\n"
7538 " gl_Position = x[0] + x[1];\n"
7539 "}\n";
7540 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007541 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007542 "\n"
7543 "layout(location=0) out vec4 color;\n"
7544 "void main(){\n"
7545 " color = vec4(1);\n"
7546 "}\n";
7547
7548 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7549 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7550
7551 VkPipelineObj pipe(m_device);
7552 pipe.AddColorAttachment();
7553 pipe.AddShader(&vs);
7554 pipe.AddShader(&fs);
7555
7556 pipe.AddVertexInputBindings(&input_binding, 1);
7557 pipe.AddVertexInputAttribs(input_attribs, 2);
7558
7559 VkDescriptorSetObj descriptorSet(m_device);
7560 descriptorSet.AppendDummy();
7561 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7562
7563 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7564
7565 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007566 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007567}
7568
Chris Forbes2682b242015-11-24 11:13:14 +13007569TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
7570{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007571 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007572
7573 ASSERT_NO_FATAL_FAILURE(InitState());
7574 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7575
7576 VkVertexInputBindingDescription input_binding;
7577 memset(&input_binding, 0, sizeof(input_binding));
7578
7579 VkVertexInputAttributeDescription input_attribs[2];
7580 memset(input_attribs, 0, sizeof(input_attribs));
7581
7582 for (int i = 0; i < 2; i++) {
7583 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7584 input_attribs[i].location = i;
7585 }
7586
7587 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007588 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007589 "\n"
7590 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07007591 "out gl_PerVertex {\n"
7592 " vec4 gl_Position;\n"
7593 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007594 "void main(){\n"
7595 " gl_Position = x[0] + x[1];\n"
7596 "}\n";
7597 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007598 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007599 "\n"
7600 "layout(location=0) out vec4 color;\n"
7601 "void main(){\n"
7602 " color = vec4(1);\n"
7603 "}\n";
7604
7605 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7606 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7607
7608 VkPipelineObj pipe(m_device);
7609 pipe.AddColorAttachment();
7610 pipe.AddShader(&vs);
7611 pipe.AddShader(&fs);
7612
7613 pipe.AddVertexInputBindings(&input_binding, 1);
7614 pipe.AddVertexInputAttribs(input_attribs, 2);
7615
7616 VkDescriptorSetObj descriptorSet(m_device);
7617 descriptorSet.AppendDummy();
7618 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7619
7620 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7621
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007622 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007623}
Chris Forbes2682b242015-11-24 11:13:14 +13007624
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007625TEST_F(VkLayerTest, CreatePipelineSimplePositive)
7626{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007627 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007628
7629 ASSERT_NO_FATAL_FAILURE(InitState());
7630 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7631
7632 char const *vsSource =
7633 "#version 450\n"
7634 "out gl_PerVertex {\n"
7635 " vec4 gl_Position;\n"
7636 "};\n"
7637 "void main(){\n"
7638 " gl_Position = vec4(0);\n"
7639 "}\n";
7640 char const *fsSource =
7641 "#version 450\n"
7642 "\n"
7643 "layout(location=0) out vec4 color;\n"
7644 "void main(){\n"
7645 " color = vec4(1);\n"
7646 "}\n";
7647
7648 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7649 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7650
7651 VkPipelineObj pipe(m_device);
7652 pipe.AddColorAttachment();
7653 pipe.AddShader(&vs);
7654 pipe.AddShader(&fs);
7655
7656 VkDescriptorSetObj descriptorSet(m_device);
7657 descriptorSet.AppendDummy();
7658 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7659
7660 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7661
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007662 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007663}
7664
Chris Forbes912c9192016-04-05 17:50:35 +12007665TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
7666{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007667 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12007668
7669 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
7670
7671 ASSERT_NO_FATAL_FAILURE(InitState());
7672 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7673
7674 char const *vsSource =
7675 "#version 450\n"
7676 "out gl_PerVertex {\n"
7677 " vec4 gl_Position;\n"
7678 "};\n"
7679 "layout(location=0) out vec3 x;\n"
7680 "layout(location=1) out ivec3 y;\n"
7681 "layout(location=2) out vec3 z;\n"
7682 "void main(){\n"
7683 " gl_Position = vec4(0);\n"
7684 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
7685 "}\n";
7686 char const *fsSource =
7687 "#version 450\n"
7688 "\n"
7689 "layout(location=0) out vec4 color;\n"
7690 "layout(location=0) in float x;\n"
7691 "layout(location=1) flat in int y;\n"
7692 "layout(location=2) in vec2 z;\n"
7693 "void main(){\n"
7694 " color = vec4(1 + x + y + z.x);\n"
7695 "}\n";
7696
7697 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7698 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7699
7700 VkPipelineObj pipe(m_device);
7701 pipe.AddColorAttachment();
7702 pipe.AddShader(&vs);
7703 pipe.AddShader(&fs);
7704
7705 VkDescriptorSetObj descriptorSet(m_device);
7706 descriptorSet.AppendDummy();
7707 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7708
7709 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7710
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007711 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12007712}
7713
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007714TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
7715{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007716 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007717
7718 ASSERT_NO_FATAL_FAILURE(InitState());
7719 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7720
Chris Forbesc1e852d2016-04-04 19:26:42 +12007721 if (!m_device->phy().features().tessellationShader) {
7722 printf("Device does not support tessellation shaders; skipped.\n");
7723 return;
7724 }
7725
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007726 char const *vsSource =
7727 "#version 450\n"
7728 "void main(){}\n";
7729 char const *tcsSource =
7730 "#version 450\n"
7731 "layout(location=0) out int x[];\n"
7732 "layout(vertices=3) out;\n"
7733 "void main(){\n"
7734 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7735 " gl_TessLevelInner[0] = 1;\n"
7736 " x[gl_InvocationID] = gl_InvocationID;\n"
7737 "}\n";
7738 char const *tesSource =
7739 "#version 450\n"
7740 "layout(triangles, equal_spacing, cw) in;\n"
7741 "layout(location=0) in int x[];\n"
7742 "out gl_PerVertex { vec4 gl_Position; };\n"
7743 "void main(){\n"
7744 " gl_Position.xyz = gl_TessCoord;\n"
7745 " gl_Position.w = x[0] + x[1] + x[2];\n"
7746 "}\n";
7747 char const *fsSource =
7748 "#version 450\n"
7749 "layout(location=0) out vec4 color;\n"
7750 "void main(){\n"
7751 " color = vec4(1);\n"
7752 "}\n";
7753
7754 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7755 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7756 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7757 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7758
7759 VkPipelineInputAssemblyStateCreateInfo iasci{
7760 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7761 nullptr,
7762 0,
7763 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7764 VK_FALSE};
7765
Chris Forbesb4cacb62016-04-04 19:15:00 +12007766 VkPipelineTessellationStateCreateInfo tsci{
7767 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7768 nullptr,
7769 0,
7770 3};
7771
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007772 VkPipelineObj pipe(m_device);
7773 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12007774 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007775 pipe.AddColorAttachment();
7776 pipe.AddShader(&vs);
7777 pipe.AddShader(&tcs);
7778 pipe.AddShader(&tes);
7779 pipe.AddShader(&fs);
7780
7781 VkDescriptorSetObj descriptorSet(m_device);
7782 descriptorSet.AppendDummy();
7783 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7784
7785 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7786
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007787 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007788}
7789
Chris Forbesa0ab8152016-04-20 13:34:27 +12007790TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
7791{
7792 m_errorMonitor->ExpectSuccess();
7793
7794 ASSERT_NO_FATAL_FAILURE(InitState());
7795 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7796
7797 if (!m_device->phy().features().geometryShader) {
7798 printf("Device does not support geometry shaders; skipped.\n");
7799 return;
7800 }
7801
7802 char const *vsSource =
7803 "#version 450\n"
7804 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
7805 "void main(){\n"
7806 " vs_out.x = vec4(1);\n"
7807 "}\n";
7808 char const *gsSource =
7809 "#version 450\n"
7810 "layout(triangles) in;\n"
7811 "layout(triangle_strip, max_vertices=3) out;\n"
7812 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
7813 "out gl_PerVertex { vec4 gl_Position; };\n"
7814 "void main() {\n"
7815 " gl_Position = gs_in[0].x;\n"
7816 " EmitVertex();\n"
7817 "}\n";
7818 char const *fsSource =
7819 "#version 450\n"
7820 "layout(location=0) out vec4 color;\n"
7821 "void main(){\n"
7822 " color = vec4(1);\n"
7823 "}\n";
7824
7825 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7826 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
7827 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7828
7829 VkPipelineObj pipe(m_device);
7830 pipe.AddColorAttachment();
7831 pipe.AddShader(&vs);
7832 pipe.AddShader(&gs);
7833 pipe.AddShader(&fs);
7834
7835 VkDescriptorSetObj descriptorSet(m_device);
7836 descriptorSet.AppendDummy();
7837 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7838
7839 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7840
7841 m_errorMonitor->VerifyNotFound();
7842}
7843
Chris Forbesa0193bc2016-04-04 19:19:47 +12007844TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
7845{
7846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7847 "is per-vertex in tessellation control shader stage "
7848 "but per-patch in tessellation evaluation shader stage");
7849
7850 ASSERT_NO_FATAL_FAILURE(InitState());
7851 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7852
Chris Forbesc1e852d2016-04-04 19:26:42 +12007853 if (!m_device->phy().features().tessellationShader) {
7854 printf("Device does not support tessellation shaders; skipped.\n");
7855 return;
7856 }
7857
Chris Forbesa0193bc2016-04-04 19:19:47 +12007858 char const *vsSource =
7859 "#version 450\n"
7860 "void main(){}\n";
7861 char const *tcsSource =
7862 "#version 450\n"
7863 "layout(location=0) out int x[];\n"
7864 "layout(vertices=3) out;\n"
7865 "void main(){\n"
7866 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7867 " gl_TessLevelInner[0] = 1;\n"
7868 " x[gl_InvocationID] = gl_InvocationID;\n"
7869 "}\n";
7870 char const *tesSource =
7871 "#version 450\n"
7872 "layout(triangles, equal_spacing, cw) in;\n"
7873 "layout(location=0) patch in int x;\n"
7874 "out gl_PerVertex { vec4 gl_Position; };\n"
7875 "void main(){\n"
7876 " gl_Position.xyz = gl_TessCoord;\n"
7877 " gl_Position.w = x;\n"
7878 "}\n";
7879 char const *fsSource =
7880 "#version 450\n"
7881 "layout(location=0) out vec4 color;\n"
7882 "void main(){\n"
7883 " color = vec4(1);\n"
7884 "}\n";
7885
7886 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7887 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7888 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7889 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7890
7891 VkPipelineInputAssemblyStateCreateInfo iasci{
7892 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7893 nullptr,
7894 0,
7895 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7896 VK_FALSE};
7897
7898 VkPipelineTessellationStateCreateInfo tsci{
7899 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7900 nullptr,
7901 0,
7902 3};
7903
7904 VkPipelineObj pipe(m_device);
7905 pipe.SetInputAssembly(&iasci);
7906 pipe.SetTessellation(&tsci);
7907 pipe.AddColorAttachment();
7908 pipe.AddShader(&vs);
7909 pipe.AddShader(&tcs);
7910 pipe.AddShader(&tes);
7911 pipe.AddShader(&fs);
7912
7913 VkDescriptorSetObj descriptorSet(m_device);
7914 descriptorSet.AppendDummy();
7915 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7916
7917 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7918
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007919 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12007920}
7921
Karl Schultz6addd812016-02-02 17:17:23 -07007922TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
7923 m_errorMonitor->SetDesiredFailureMsg(
7924 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007925 "Duplicate vertex input binding descriptions for binding 0");
7926
Chris Forbes280ba2c2015-06-12 11:16:41 +12007927 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007928 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007929
7930 /* Two binding descriptions for binding 0 */
7931 VkVertexInputBindingDescription input_bindings[2];
7932 memset(input_bindings, 0, sizeof(input_bindings));
7933
7934 VkVertexInputAttributeDescription input_attrib;
7935 memset(&input_attrib, 0, sizeof(input_attrib));
7936 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7937
7938 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007939 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007940 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007941 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007942 "out gl_PerVertex {\n"
7943 " vec4 gl_Position;\n"
7944 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007945 "void main(){\n"
7946 " gl_Position = vec4(x);\n"
7947 "}\n";
7948 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007949 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007950 "\n"
7951 "layout(location=0) out vec4 color;\n"
7952 "void main(){\n"
7953 " color = vec4(1);\n"
7954 "}\n";
7955
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007956 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7957 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007958
7959 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007960 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007961 pipe.AddShader(&vs);
7962 pipe.AddShader(&fs);
7963
7964 pipe.AddVertexInputBindings(input_bindings, 2);
7965 pipe.AddVertexInputAttribs(&input_attrib, 1);
7966
Chris Forbes280ba2c2015-06-12 11:16:41 +12007967 VkDescriptorSetObj descriptorSet(m_device);
7968 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007969 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007970
Tony Barbour5781e8f2015-08-04 16:23:11 -06007971 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007972
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007973 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007974}
Chris Forbes8f68b562015-05-25 11:13:32 +12007975
Chris Forbes35efec72016-04-21 14:32:08 +12007976TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
7977 m_errorMonitor->ExpectSuccess();
7978
7979 ASSERT_NO_FATAL_FAILURE(InitState());
7980 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7981
7982 if (!m_device->phy().features().tessellationShader) {
7983 printf("Device does not support 64bit vertex attributes; skipped.\n");
7984 return;
7985 }
7986
7987 VkVertexInputBindingDescription input_bindings[1];
7988 memset(input_bindings, 0, sizeof(input_bindings));
7989
7990 VkVertexInputAttributeDescription input_attribs[4];
7991 memset(input_attribs, 0, sizeof(input_attribs));
7992 input_attribs[0].location = 0;
7993 input_attribs[0].offset = 0;
7994 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7995 input_attribs[1].location = 2;
7996 input_attribs[1].offset = 32;
7997 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7998 input_attribs[2].location = 4;
7999 input_attribs[2].offset = 64;
8000 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8001 input_attribs[3].location = 6;
8002 input_attribs[3].offset = 96;
8003 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8004
8005 char const *vsSource =
8006 "#version 450\n"
8007 "\n"
8008 "layout(location=0) in dmat4 x;\n"
8009 "out gl_PerVertex {\n"
8010 " vec4 gl_Position;\n"
8011 "};\n"
8012 "void main(){\n"
8013 " gl_Position = vec4(x[0][0]);\n"
8014 "}\n";
8015 char const *fsSource =
8016 "#version 450\n"
8017 "\n"
8018 "layout(location=0) out vec4 color;\n"
8019 "void main(){\n"
8020 " color = vec4(1);\n"
8021 "}\n";
8022
8023 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8024 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8025
8026 VkPipelineObj pipe(m_device);
8027 pipe.AddColorAttachment();
8028 pipe.AddShader(&vs);
8029 pipe.AddShader(&fs);
8030
8031 pipe.AddVertexInputBindings(input_bindings, 1);
8032 pipe.AddVertexInputAttribs(input_attribs, 4);
8033
8034 VkDescriptorSetObj descriptorSet(m_device);
8035 descriptorSet.AppendDummy();
8036 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8037
8038 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8039
8040 m_errorMonitor->VerifyNotFound();
8041}
8042
Karl Schultz6addd812016-02-02 17:17:23 -07008043TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008044 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008045 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008046
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008047 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008048
8049 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008050 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008051 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008052 "out gl_PerVertex {\n"
8053 " vec4 gl_Position;\n"
8054 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008055 "void main(){\n"
8056 " gl_Position = vec4(1);\n"
8057 "}\n";
8058 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008059 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008060 "\n"
8061 "void main(){\n"
8062 "}\n";
8063
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008064 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8065 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008066
8067 VkPipelineObj pipe(m_device);
8068 pipe.AddShader(&vs);
8069 pipe.AddShader(&fs);
8070
Chia-I Wu08accc62015-07-07 11:50:03 +08008071 /* set up CB 0, not written */
8072 pipe.AddColorAttachment();
8073 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008074
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008075 VkDescriptorSetObj descriptorSet(m_device);
8076 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008077 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008078
Tony Barbour5781e8f2015-08-04 16:23:11 -06008079 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008080
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008081 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008082}
8083
Karl Schultz6addd812016-02-02 17:17:23 -07008084TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07008085 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008086 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008087 "FS writes to output location 1 with no matching attachment");
8088
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008089 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008090
8091 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008092 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008093 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008094 "out gl_PerVertex {\n"
8095 " vec4 gl_Position;\n"
8096 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008097 "void main(){\n"
8098 " gl_Position = vec4(1);\n"
8099 "}\n";
8100 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008101 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008102 "\n"
8103 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008104 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008105 "void main(){\n"
8106 " x = vec4(1);\n"
8107 " y = vec4(1);\n"
8108 "}\n";
8109
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008110 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8111 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008112
8113 VkPipelineObj pipe(m_device);
8114 pipe.AddShader(&vs);
8115 pipe.AddShader(&fs);
8116
Chia-I Wu08accc62015-07-07 11:50:03 +08008117 /* set up CB 0, not written */
8118 pipe.AddColorAttachment();
8119 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008120 /* FS writes CB 1, but we don't configure it */
8121
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008122 VkDescriptorSetObj descriptorSet(m_device);
8123 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008124 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008125
Tony Barbour5781e8f2015-08-04 16:23:11 -06008126 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008127
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008128 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008129}
8130
Karl Schultz6addd812016-02-02 17:17:23 -07008131TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008133 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008134
Chris Forbesa36d69e2015-05-25 11:13:44 +12008135 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008136
8137 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008138 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008139 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008140 "out gl_PerVertex {\n"
8141 " vec4 gl_Position;\n"
8142 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008143 "void main(){\n"
8144 " gl_Position = vec4(1);\n"
8145 "}\n";
8146 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008147 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008148 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008149 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12008150 "void main(){\n"
8151 " x = ivec4(1);\n"
8152 "}\n";
8153
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008154 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8155 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12008156
8157 VkPipelineObj pipe(m_device);
8158 pipe.AddShader(&vs);
8159 pipe.AddShader(&fs);
8160
Chia-I Wu08accc62015-07-07 11:50:03 +08008161 /* set up CB 0; type is UNORM by default */
8162 pipe.AddColorAttachment();
8163 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008164
Chris Forbesa36d69e2015-05-25 11:13:44 +12008165 VkDescriptorSetObj descriptorSet(m_device);
8166 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008167 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12008168
Tony Barbour5781e8f2015-08-04 16:23:11 -06008169 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008170
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008171 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12008172}
Chris Forbes7b1b8932015-06-05 14:43:36 +12008173
Karl Schultz6addd812016-02-02 17:17:23 -07008174TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008176 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008177
Chris Forbes556c76c2015-08-14 12:04:59 +12008178 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12008179
8180 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008181 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008182 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008183 "out gl_PerVertex {\n"
8184 " vec4 gl_Position;\n"
8185 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008186 "void main(){\n"
8187 " gl_Position = vec4(1);\n"
8188 "}\n";
8189 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008190 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008191 "\n"
8192 "layout(location=0) out vec4 x;\n"
8193 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
8194 "void main(){\n"
8195 " x = vec4(bar.y);\n"
8196 "}\n";
8197
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008198 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8199 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12008200
Chris Forbes556c76c2015-08-14 12:04:59 +12008201 VkPipelineObj pipe(m_device);
8202 pipe.AddShader(&vs);
8203 pipe.AddShader(&fs);
8204
8205 /* set up CB 0; type is UNORM by default */
8206 pipe.AddColorAttachment();
8207 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8208
8209 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008210 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12008211
8212 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8213
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008214 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12008215}
8216
Chris Forbes5c59e902016-02-26 16:56:09 +13008217TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
8218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8219 "not declared in layout");
8220
8221 ASSERT_NO_FATAL_FAILURE(InitState());
8222
8223 char const *vsSource =
8224 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13008225 "\n"
8226 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
8227 "out gl_PerVertex {\n"
8228 " vec4 gl_Position;\n"
8229 "};\n"
8230 "void main(){\n"
8231 " gl_Position = vec4(consts.x);\n"
8232 "}\n";
8233 char const *fsSource =
8234 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13008235 "\n"
8236 "layout(location=0) out vec4 x;\n"
8237 "void main(){\n"
8238 " x = vec4(1);\n"
8239 "}\n";
8240
8241 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8242 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8243
8244 VkPipelineObj pipe(m_device);
8245 pipe.AddShader(&vs);
8246 pipe.AddShader(&fs);
8247
8248 /* set up CB 0; type is UNORM by default */
8249 pipe.AddColorAttachment();
8250 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8251
8252 VkDescriptorSetObj descriptorSet(m_device);
8253 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8254
8255 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8256
8257 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008258 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13008259}
8260
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008261#endif // SHADER_CHECKER_TESTS
8262
8263#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06008264TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07008265 m_errorMonitor->SetDesiredFailureMsg(
8266 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008267 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008268
8269 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008270
8271 // Create an image
8272 VkImage image;
8273
Karl Schultz6addd812016-02-02 17:17:23 -07008274 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8275 const int32_t tex_width = 32;
8276 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008277
8278 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008279 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8280 image_create_info.pNext = NULL;
8281 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8282 image_create_info.format = tex_format;
8283 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008284 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07008285 image_create_info.extent.depth = 1;
8286 image_create_info.mipLevels = 1;
8287 image_create_info.arrayLayers = 1;
8288 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8289 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8290 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8291 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008292
8293 // Introduce error by sending down a bogus width extent
8294 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008295 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008296
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008297 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008298}
8299
Mark Youngc48c4c12016-04-11 14:26:49 -06008300TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
8301 m_errorMonitor->SetDesiredFailureMsg(
8302 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8303 "CreateImage extents is 0 for at least one required dimension");
8304
8305 ASSERT_NO_FATAL_FAILURE(InitState());
8306
8307 // Create an image
8308 VkImage image;
8309
8310 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8311 const int32_t tex_width = 32;
8312 const int32_t tex_height = 32;
8313
8314 VkImageCreateInfo image_create_info = {};
8315 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8316 image_create_info.pNext = NULL;
8317 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8318 image_create_info.format = tex_format;
8319 image_create_info.extent.width = tex_width;
8320 image_create_info.extent.height = tex_height;
8321 image_create_info.extent.depth = 1;
8322 image_create_info.mipLevels = 1;
8323 image_create_info.arrayLayers = 1;
8324 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8325 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8326 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8327 image_create_info.flags = 0;
8328
8329 // Introduce error by sending down a bogus width extent
8330 image_create_info.extent.width = 0;
8331 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8332
8333 m_errorMonitor->VerifyFound();
8334}
8335
Karl Schultz6addd812016-02-02 17:17:23 -07008336TEST_F(VkLayerTest, UpdateBufferAlignment) {
8337 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06008338
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008340 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008341
Mike Stroyana3082432015-09-25 13:39:21 -06008342 ASSERT_NO_FATAL_FAILURE(InitState());
8343
8344 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8345 vk_testing::Buffer buffer;
8346 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8347
8348 BeginCommandBuffer();
8349 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008350 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008351 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008352
Mike Stroyana3082432015-09-25 13:39:21 -06008353 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008354 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008355 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008356
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008357 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008358 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008359 EndCommandBuffer();
8360}
8361
Karl Schultz6addd812016-02-02 17:17:23 -07008362TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008363 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008364 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06008365
8366 ASSERT_NO_FATAL_FAILURE(InitState());
8367
8368 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8369 vk_testing::Buffer buffer;
8370 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8371
8372 BeginCommandBuffer();
8373 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008374 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008375 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008376
Mike Stroyana3082432015-09-25 13:39:21 -06008377 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008378 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008379 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008380
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008381 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008382
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008383 m_errorMonitor->VerifyFound();
8384
Mike Stroyana3082432015-09-25 13:39:21 -06008385 EndCommandBuffer();
8386}
8387
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008388#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12008389
Tobin Ehliscde08892015-09-22 10:11:37 -06008390#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07008391TEST_F(VkLayerTest, InvalidImageView) {
8392 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06008393
Karl Schultz6addd812016-02-02 17:17:23 -07008394 m_errorMonitor->SetDesiredFailureMsg(
8395 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008396 "vkCreateImageView called with baseMipLevel 10 ");
8397
Tobin Ehliscde08892015-09-22 10:11:37 -06008398 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06008399
Mike Stroyana3082432015-09-25 13:39:21 -06008400 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07008401 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06008402
Karl Schultz6addd812016-02-02 17:17:23 -07008403 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8404 const int32_t tex_width = 32;
8405 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06008406
8407 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008408 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8409 image_create_info.pNext = NULL;
8410 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8411 image_create_info.format = tex_format;
8412 image_create_info.extent.width = tex_width;
8413 image_create_info.extent.height = tex_height;
8414 image_create_info.extent.depth = 1;
8415 image_create_info.mipLevels = 1;
8416 image_create_info.arrayLayers = 1;
8417 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8418 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8419 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8420 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06008421
Chia-I Wuf7458c52015-10-26 21:10:41 +08008422 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06008423 ASSERT_VK_SUCCESS(err);
8424
8425 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008426 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8427 image_view_create_info.image = image;
8428 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8429 image_view_create_info.format = tex_format;
8430 image_view_create_info.subresourceRange.layerCount = 1;
8431 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
8432 image_view_create_info.subresourceRange.levelCount = 1;
8433 image_view_create_info.subresourceRange.aspectMask =
8434 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06008435
8436 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008437 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8438 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06008439
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008440 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06008441}
Mike Stroyana3082432015-09-25 13:39:21 -06008442
Karl Schultz6addd812016-02-02 17:17:23 -07008443TEST_F(VkLayerTest, InvalidImageViewAspect) {
8444 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008445
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008447 "vkCreateImageView: Color image "
8448 "formats must have ONLY the "
8449 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008450
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008451 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008452
8453 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07008454 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008455
Karl Schultz6addd812016-02-02 17:17:23 -07008456 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8457 const int32_t tex_width = 32;
8458 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008459
8460 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008461 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8462 image_create_info.pNext = NULL;
8463 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8464 image_create_info.format = tex_format;
8465 image_create_info.extent.width = tex_width;
8466 image_create_info.extent.height = tex_height;
8467 image_create_info.extent.depth = 1;
8468 image_create_info.mipLevels = 1;
8469 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8470 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8471 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8472 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008473
Chia-I Wuf7458c52015-10-26 21:10:41 +08008474 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008475 ASSERT_VK_SUCCESS(err);
8476
8477 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008478 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8479 image_view_create_info.image = image;
8480 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8481 image_view_create_info.format = tex_format;
8482 image_view_create_info.subresourceRange.baseMipLevel = 0;
8483 image_view_create_info.subresourceRange.levelCount = 1;
8484 // Cause an error by setting an invalid image aspect
8485 image_view_create_info.subresourceRange.aspectMask =
8486 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008487
8488 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008489 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8490 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008491
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008492 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008493}
8494
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008495TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008496 VkResult err;
8497 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008498
Karl Schultz6addd812016-02-02 17:17:23 -07008499 m_errorMonitor->SetDesiredFailureMsg(
8500 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008501 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008502
Mike Stroyana3082432015-09-25 13:39:21 -06008503 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008504
8505 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008506 VkImage srcImage;
8507 VkImage dstImage;
8508 VkDeviceMemory srcMem;
8509 VkDeviceMemory destMem;
8510 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008511
8512 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008513 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8514 image_create_info.pNext = NULL;
8515 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8516 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8517 image_create_info.extent.width = 32;
8518 image_create_info.extent.height = 32;
8519 image_create_info.extent.depth = 1;
8520 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008521 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07008522 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8523 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8524 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8525 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008526
Karl Schultz6addd812016-02-02 17:17:23 -07008527 err =
8528 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008529 ASSERT_VK_SUCCESS(err);
8530
Karl Schultz6addd812016-02-02 17:17:23 -07008531 err =
8532 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008533 ASSERT_VK_SUCCESS(err);
8534
8535 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008536 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008537 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8538 memAlloc.pNext = NULL;
8539 memAlloc.allocationSize = 0;
8540 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008541
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008542 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008543 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008544 pass =
8545 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008546 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008547 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008548 ASSERT_VK_SUCCESS(err);
8549
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008550 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008551 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008552 pass =
8553 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008554 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008555 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008556 ASSERT_VK_SUCCESS(err);
8557
8558 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8559 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008560 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008561 ASSERT_VK_SUCCESS(err);
8562
8563 BeginCommandBuffer();
8564 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008565 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008566 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008567 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008568 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06008569 copyRegion.srcOffset.x = 0;
8570 copyRegion.srcOffset.y = 0;
8571 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008572 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008573 copyRegion.dstSubresource.mipLevel = 0;
8574 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008575 // Introduce failure by forcing the dst layerCount to differ from src
8576 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008577 copyRegion.dstOffset.x = 0;
8578 copyRegion.dstOffset.y = 0;
8579 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008580 copyRegion.extent.width = 1;
8581 copyRegion.extent.height = 1;
8582 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008583 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8584 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008585 EndCommandBuffer();
8586
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008587 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008588
Chia-I Wuf7458c52015-10-26 21:10:41 +08008589 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008590 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008591 vkFreeMemory(m_device->device(), srcMem, NULL);
8592 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008593}
8594
Karl Schultz6addd812016-02-02 17:17:23 -07008595TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06008596 VkResult err;
8597 bool pass;
8598
8599 // Create color images with different format sizes and try to copy between them
8600 m_errorMonitor->SetDesiredFailureMsg(
8601 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8602 "vkCmdCopyImage called with unmatched source and dest image format sizes");
8603
8604 ASSERT_NO_FATAL_FAILURE(InitState());
8605
8606 // Create two images of different types and try to copy between them
8607 VkImage srcImage;
8608 VkImage dstImage;
8609 VkDeviceMemory srcMem;
8610 VkDeviceMemory destMem;
8611 VkMemoryRequirements memReqs;
8612
8613 VkImageCreateInfo image_create_info = {};
8614 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8615 image_create_info.pNext = NULL;
8616 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8617 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8618 image_create_info.extent.width = 32;
8619 image_create_info.extent.height = 32;
8620 image_create_info.extent.depth = 1;
8621 image_create_info.mipLevels = 1;
8622 image_create_info.arrayLayers = 1;
8623 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8624 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8625 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8626 image_create_info.flags = 0;
8627
8628 err =
8629 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
8630 ASSERT_VK_SUCCESS(err);
8631
8632 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8633 // Introduce failure by creating second image with a different-sized format.
8634 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
8635
8636 err =
8637 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
8638 ASSERT_VK_SUCCESS(err);
8639
8640 // Allocate memory
8641 VkMemoryAllocateInfo memAlloc = {};
8642 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8643 memAlloc.pNext = NULL;
8644 memAlloc.allocationSize = 0;
8645 memAlloc.memoryTypeIndex = 0;
8646
8647 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
8648 memAlloc.allocationSize = memReqs.size;
8649 pass =
8650 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
8651 ASSERT_TRUE(pass);
8652 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
8653 ASSERT_VK_SUCCESS(err);
8654
8655 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
8656 memAlloc.allocationSize = memReqs.size;
8657 pass =
8658 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
8659 ASSERT_TRUE(pass);
8660 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
8661 ASSERT_VK_SUCCESS(err);
8662
8663 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8664 ASSERT_VK_SUCCESS(err);
8665 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
8666 ASSERT_VK_SUCCESS(err);
8667
8668 BeginCommandBuffer();
8669 VkImageCopy copyRegion;
8670 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8671 copyRegion.srcSubresource.mipLevel = 0;
8672 copyRegion.srcSubresource.baseArrayLayer = 0;
8673 copyRegion.srcSubresource.layerCount = 0;
8674 copyRegion.srcOffset.x = 0;
8675 copyRegion.srcOffset.y = 0;
8676 copyRegion.srcOffset.z = 0;
8677 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8678 copyRegion.dstSubresource.mipLevel = 0;
8679 copyRegion.dstSubresource.baseArrayLayer = 0;
8680 copyRegion.dstSubresource.layerCount = 0;
8681 copyRegion.dstOffset.x = 0;
8682 copyRegion.dstOffset.y = 0;
8683 copyRegion.dstOffset.z = 0;
8684 copyRegion.extent.width = 1;
8685 copyRegion.extent.height = 1;
8686 copyRegion.extent.depth = 1;
8687 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8688 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
8689 EndCommandBuffer();
8690
8691 m_errorMonitor->VerifyFound();
8692
8693 vkDestroyImage(m_device->device(), srcImage, NULL);
8694 vkDestroyImage(m_device->device(), dstImage, NULL);
8695 vkFreeMemory(m_device->device(), srcMem, NULL);
8696 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008697}
8698
Karl Schultz6addd812016-02-02 17:17:23 -07008699TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
8700 VkResult err;
8701 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008702
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008703 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008704 m_errorMonitor->SetDesiredFailureMsg(
8705 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008706 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008707
Mike Stroyana3082432015-09-25 13:39:21 -06008708 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008709
8710 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008711 VkImage srcImage;
8712 VkImage dstImage;
8713 VkDeviceMemory srcMem;
8714 VkDeviceMemory destMem;
8715 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008716
8717 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008718 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8719 image_create_info.pNext = NULL;
8720 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8721 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8722 image_create_info.extent.width = 32;
8723 image_create_info.extent.height = 32;
8724 image_create_info.extent.depth = 1;
8725 image_create_info.mipLevels = 1;
8726 image_create_info.arrayLayers = 1;
8727 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8728 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8729 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8730 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008731
Karl Schultz6addd812016-02-02 17:17:23 -07008732 err =
8733 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008734 ASSERT_VK_SUCCESS(err);
8735
Karl Schultzbdb75952016-04-19 11:36:49 -06008736 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8737
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008738 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07008739 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008740 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8741 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008742
Karl Schultz6addd812016-02-02 17:17:23 -07008743 err =
8744 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008745 ASSERT_VK_SUCCESS(err);
8746
8747 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008748 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008749 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8750 memAlloc.pNext = NULL;
8751 memAlloc.allocationSize = 0;
8752 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008753
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008754 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008755 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008756 pass =
8757 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008758 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008759 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008760 ASSERT_VK_SUCCESS(err);
8761
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008762 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008763 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008764 pass =
8765 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008766 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008767 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008768 ASSERT_VK_SUCCESS(err);
8769
8770 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8771 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008772 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008773 ASSERT_VK_SUCCESS(err);
8774
8775 BeginCommandBuffer();
8776 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008777 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008778 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008779 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008780 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008781 copyRegion.srcOffset.x = 0;
8782 copyRegion.srcOffset.y = 0;
8783 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008784 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008785 copyRegion.dstSubresource.mipLevel = 0;
8786 copyRegion.dstSubresource.baseArrayLayer = 0;
8787 copyRegion.dstSubresource.layerCount = 0;
8788 copyRegion.dstOffset.x = 0;
8789 copyRegion.dstOffset.y = 0;
8790 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008791 copyRegion.extent.width = 1;
8792 copyRegion.extent.height = 1;
8793 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008794 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8795 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008796 EndCommandBuffer();
8797
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008798 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008799
Chia-I Wuf7458c52015-10-26 21:10:41 +08008800 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008801 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008802 vkFreeMemory(m_device->device(), srcMem, NULL);
8803 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008804}
8805
Karl Schultz6addd812016-02-02 17:17:23 -07008806TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
8807 VkResult err;
8808 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008809
Karl Schultz6addd812016-02-02 17:17:23 -07008810 m_errorMonitor->SetDesiredFailureMsg(
8811 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008812 "vkCmdResolveImage called with source sample count less than 2.");
8813
Mike Stroyana3082432015-09-25 13:39:21 -06008814 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008815
8816 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008817 VkImage srcImage;
8818 VkImage dstImage;
8819 VkDeviceMemory srcMem;
8820 VkDeviceMemory destMem;
8821 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008822
8823 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008824 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8825 image_create_info.pNext = NULL;
8826 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8827 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8828 image_create_info.extent.width = 32;
8829 image_create_info.extent.height = 1;
8830 image_create_info.extent.depth = 1;
8831 image_create_info.mipLevels = 1;
8832 image_create_info.arrayLayers = 1;
8833 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8834 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8835 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8836 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008837
Karl Schultz6addd812016-02-02 17:17:23 -07008838 err =
8839 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008840 ASSERT_VK_SUCCESS(err);
8841
Karl Schultz6addd812016-02-02 17:17:23 -07008842 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008843
Karl Schultz6addd812016-02-02 17:17:23 -07008844 err =
8845 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008846 ASSERT_VK_SUCCESS(err);
8847
8848 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008849 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008850 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8851 memAlloc.pNext = NULL;
8852 memAlloc.allocationSize = 0;
8853 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008854
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008855 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008856 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008857 pass =
8858 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008859 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008860 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008861 ASSERT_VK_SUCCESS(err);
8862
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008863 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008864 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008865 pass =
8866 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008867 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008868 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008869 ASSERT_VK_SUCCESS(err);
8870
8871 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8872 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008873 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008874 ASSERT_VK_SUCCESS(err);
8875
8876 BeginCommandBuffer();
8877 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008878 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8879 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008880 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008881 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008882 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008883 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008884 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008885 resolveRegion.srcOffset.x = 0;
8886 resolveRegion.srcOffset.y = 0;
8887 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008888 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008889 resolveRegion.dstSubresource.mipLevel = 0;
8890 resolveRegion.dstSubresource.baseArrayLayer = 0;
8891 resolveRegion.dstSubresource.layerCount = 0;
8892 resolveRegion.dstOffset.x = 0;
8893 resolveRegion.dstOffset.y = 0;
8894 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008895 resolveRegion.extent.width = 1;
8896 resolveRegion.extent.height = 1;
8897 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008898 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8899 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008900 EndCommandBuffer();
8901
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008902 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008903
Chia-I Wuf7458c52015-10-26 21:10:41 +08008904 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008905 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008906 vkFreeMemory(m_device->device(), srcMem, NULL);
8907 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008908}
8909
Karl Schultz6addd812016-02-02 17:17:23 -07008910TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
8911 VkResult err;
8912 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008913
Karl Schultz6addd812016-02-02 17:17:23 -07008914 m_errorMonitor->SetDesiredFailureMsg(
8915 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008916 "vkCmdResolveImage called with dest sample count greater than 1.");
8917
Mike Stroyana3082432015-09-25 13:39:21 -06008918 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008919
Chris Forbesa7530692016-05-08 12:35:39 +12008920 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008921 VkImage srcImage;
8922 VkImage dstImage;
8923 VkDeviceMemory srcMem;
8924 VkDeviceMemory destMem;
8925 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008926
8927 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008928 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8929 image_create_info.pNext = NULL;
8930 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8931 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8932 image_create_info.extent.width = 32;
8933 image_create_info.extent.height = 1;
8934 image_create_info.extent.depth = 1;
8935 image_create_info.mipLevels = 1;
8936 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +12008937 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07008938 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8939 // Note: Some implementations expect color attachment usage for any
8940 // multisample surface
8941 image_create_info.usage =
8942 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8943 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008944
Karl Schultz6addd812016-02-02 17:17:23 -07008945 err =
8946 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008947 ASSERT_VK_SUCCESS(err);
8948
Karl Schultz6addd812016-02-02 17:17:23 -07008949 // Note: Some implementations expect color attachment usage for any
8950 // multisample surface
8951 image_create_info.usage =
8952 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008953
Karl Schultz6addd812016-02-02 17:17:23 -07008954 err =
8955 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008956 ASSERT_VK_SUCCESS(err);
8957
8958 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008959 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008960 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8961 memAlloc.pNext = NULL;
8962 memAlloc.allocationSize = 0;
8963 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008964
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008965 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008966 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008967 pass =
8968 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008969 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008970 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008971 ASSERT_VK_SUCCESS(err);
8972
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008973 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008974 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008975 pass =
8976 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008977 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008978 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008979 ASSERT_VK_SUCCESS(err);
8980
8981 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8982 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008983 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008984 ASSERT_VK_SUCCESS(err);
8985
8986 BeginCommandBuffer();
8987 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008988 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8989 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008990 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008991 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008992 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008993 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008994 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008995 resolveRegion.srcOffset.x = 0;
8996 resolveRegion.srcOffset.y = 0;
8997 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008998 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008999 resolveRegion.dstSubresource.mipLevel = 0;
9000 resolveRegion.dstSubresource.baseArrayLayer = 0;
9001 resolveRegion.dstSubresource.layerCount = 0;
9002 resolveRegion.dstOffset.x = 0;
9003 resolveRegion.dstOffset.y = 0;
9004 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009005 resolveRegion.extent.width = 1;
9006 resolveRegion.extent.height = 1;
9007 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009008 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9009 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009010 EndCommandBuffer();
9011
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009012 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009013
Chia-I Wuf7458c52015-10-26 21:10:41 +08009014 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009015 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009016 vkFreeMemory(m_device->device(), srcMem, NULL);
9017 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009018}
9019
Karl Schultz6addd812016-02-02 17:17:23 -07009020TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
9021 VkResult err;
9022 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009023
Karl Schultz6addd812016-02-02 17:17:23 -07009024 m_errorMonitor->SetDesiredFailureMsg(
9025 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009026 "vkCmdResolveImage called with unmatched source and dest formats.");
9027
Mike Stroyana3082432015-09-25 13:39:21 -06009028 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009029
9030 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009031 VkImage srcImage;
9032 VkImage dstImage;
9033 VkDeviceMemory srcMem;
9034 VkDeviceMemory destMem;
9035 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009036
9037 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009038 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9039 image_create_info.pNext = NULL;
9040 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9041 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9042 image_create_info.extent.width = 32;
9043 image_create_info.extent.height = 1;
9044 image_create_info.extent.depth = 1;
9045 image_create_info.mipLevels = 1;
9046 image_create_info.arrayLayers = 1;
9047 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
9048 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9049 // Note: Some implementations expect color attachment usage for any
9050 // multisample surface
9051 image_create_info.usage =
9052 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9053 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009054
Karl Schultz6addd812016-02-02 17:17:23 -07009055 err =
9056 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009057 ASSERT_VK_SUCCESS(err);
9058
Karl Schultz6addd812016-02-02 17:17:23 -07009059 // Set format to something other than source image
9060 image_create_info.format = VK_FORMAT_R32_SFLOAT;
9061 // Note: Some implementations expect color attachment usage for any
9062 // multisample surface
9063 image_create_info.usage =
9064 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9065 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009066
Karl Schultz6addd812016-02-02 17:17:23 -07009067 err =
9068 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009069 ASSERT_VK_SUCCESS(err);
9070
9071 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009072 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009073 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9074 memAlloc.pNext = NULL;
9075 memAlloc.allocationSize = 0;
9076 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009077
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009078 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009079 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009080 pass =
9081 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009082 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009083 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009084 ASSERT_VK_SUCCESS(err);
9085
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009086 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009087 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009088 pass =
9089 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009090 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009091 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009092 ASSERT_VK_SUCCESS(err);
9093
9094 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9095 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009096 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009097 ASSERT_VK_SUCCESS(err);
9098
9099 BeginCommandBuffer();
9100 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009101 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9102 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009103 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009104 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009105 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009106 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009107 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009108 resolveRegion.srcOffset.x = 0;
9109 resolveRegion.srcOffset.y = 0;
9110 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009111 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009112 resolveRegion.dstSubresource.mipLevel = 0;
9113 resolveRegion.dstSubresource.baseArrayLayer = 0;
9114 resolveRegion.dstSubresource.layerCount = 0;
9115 resolveRegion.dstOffset.x = 0;
9116 resolveRegion.dstOffset.y = 0;
9117 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009118 resolveRegion.extent.width = 1;
9119 resolveRegion.extent.height = 1;
9120 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009121 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9122 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009123 EndCommandBuffer();
9124
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009125 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009126
Chia-I Wuf7458c52015-10-26 21:10:41 +08009127 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009128 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009129 vkFreeMemory(m_device->device(), srcMem, NULL);
9130 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009131}
9132
Karl Schultz6addd812016-02-02 17:17:23 -07009133TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
9134 VkResult err;
9135 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009136
Karl Schultz6addd812016-02-02 17:17:23 -07009137 m_errorMonitor->SetDesiredFailureMsg(
9138 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009139 "vkCmdResolveImage called with unmatched source and dest image types.");
9140
Mike Stroyana3082432015-09-25 13:39:21 -06009141 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009142
9143 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009144 VkImage srcImage;
9145 VkImage dstImage;
9146 VkDeviceMemory srcMem;
9147 VkDeviceMemory destMem;
9148 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009149
9150 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009151 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9152 image_create_info.pNext = NULL;
9153 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9154 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9155 image_create_info.extent.width = 32;
9156 image_create_info.extent.height = 1;
9157 image_create_info.extent.depth = 1;
9158 image_create_info.mipLevels = 1;
9159 image_create_info.arrayLayers = 1;
9160 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
9161 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9162 // Note: Some implementations expect color attachment usage for any
9163 // multisample surface
9164 image_create_info.usage =
9165 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9166 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009167
Karl Schultz6addd812016-02-02 17:17:23 -07009168 err =
9169 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009170 ASSERT_VK_SUCCESS(err);
9171
Karl Schultz6addd812016-02-02 17:17:23 -07009172 image_create_info.imageType = VK_IMAGE_TYPE_1D;
9173 // Note: Some implementations expect color attachment usage for any
9174 // multisample surface
9175 image_create_info.usage =
9176 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9177 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009178
Karl Schultz6addd812016-02-02 17:17:23 -07009179 err =
9180 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009181 ASSERT_VK_SUCCESS(err);
9182
9183 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009184 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009185 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9186 memAlloc.pNext = NULL;
9187 memAlloc.allocationSize = 0;
9188 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009189
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009190 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009191 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009192 pass =
9193 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009194 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009195 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009196 ASSERT_VK_SUCCESS(err);
9197
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009198 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009199 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009200 pass =
9201 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009202 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009203 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009204 ASSERT_VK_SUCCESS(err);
9205
9206 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9207 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009208 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009209 ASSERT_VK_SUCCESS(err);
9210
9211 BeginCommandBuffer();
9212 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009213 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9214 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009215 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009216 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009217 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009218 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009219 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009220 resolveRegion.srcOffset.x = 0;
9221 resolveRegion.srcOffset.y = 0;
9222 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009223 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009224 resolveRegion.dstSubresource.mipLevel = 0;
9225 resolveRegion.dstSubresource.baseArrayLayer = 0;
9226 resolveRegion.dstSubresource.layerCount = 0;
9227 resolveRegion.dstOffset.x = 0;
9228 resolveRegion.dstOffset.y = 0;
9229 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009230 resolveRegion.extent.width = 1;
9231 resolveRegion.extent.height = 1;
9232 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009233 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9234 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009235 EndCommandBuffer();
9236
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009237 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009238
Chia-I Wuf7458c52015-10-26 21:10:41 +08009239 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009240 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009241 vkFreeMemory(m_device->device(), srcMem, NULL);
9242 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009243}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009244
Karl Schultz6addd812016-02-02 17:17:23 -07009245TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009246 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07009247 // to using a DS format, then cause it to hit error due to COLOR_BIT not
9248 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009249 // The image format check comes 2nd in validation so we trigger it first,
9250 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07009251 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009252
Karl Schultz6addd812016-02-02 17:17:23 -07009253 m_errorMonitor->SetDesiredFailureMsg(
9254 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009255 "Combination depth/stencil image formats can have only the ");
9256
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009257 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009258
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009259 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009260 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
9261 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009262
9263 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009264 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9265 ds_pool_ci.pNext = NULL;
9266 ds_pool_ci.maxSets = 1;
9267 ds_pool_ci.poolSizeCount = 1;
9268 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009269
9270 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009271 err =
9272 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009273 ASSERT_VK_SUCCESS(err);
9274
9275 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009276 dsl_binding.binding = 0;
9277 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
9278 dsl_binding.descriptorCount = 1;
9279 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9280 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009281
9282 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009283 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9284 ds_layout_ci.pNext = NULL;
9285 ds_layout_ci.bindingCount = 1;
9286 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009287 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009288 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9289 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009290 ASSERT_VK_SUCCESS(err);
9291
9292 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009293 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009294 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009295 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009296 alloc_info.descriptorPool = ds_pool;
9297 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009298 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9299 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009300 ASSERT_VK_SUCCESS(err);
9301
Karl Schultz6addd812016-02-02 17:17:23 -07009302 VkImage image_bad;
9303 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009304 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07009305 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009306 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07009307 const int32_t tex_width = 32;
9308 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009309
9310 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009311 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9312 image_create_info.pNext = NULL;
9313 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9314 image_create_info.format = tex_format_bad;
9315 image_create_info.extent.width = tex_width;
9316 image_create_info.extent.height = tex_height;
9317 image_create_info.extent.depth = 1;
9318 image_create_info.mipLevels = 1;
9319 image_create_info.arrayLayers = 1;
9320 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9321 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9322 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
9323 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
9324 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009325
Karl Schultz6addd812016-02-02 17:17:23 -07009326 err =
9327 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009328 ASSERT_VK_SUCCESS(err);
9329 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07009330 image_create_info.usage =
9331 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9332 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
9333 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009334 ASSERT_VK_SUCCESS(err);
9335
9336 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009337 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9338 image_view_create_info.image = image_bad;
9339 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
9340 image_view_create_info.format = tex_format_bad;
9341 image_view_create_info.subresourceRange.baseArrayLayer = 0;
9342 image_view_create_info.subresourceRange.baseMipLevel = 0;
9343 image_view_create_info.subresourceRange.layerCount = 1;
9344 image_view_create_info.subresourceRange.levelCount = 1;
9345 image_view_create_info.subresourceRange.aspectMask =
9346 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009347
9348 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07009349 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
9350 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009351
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009352 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009353
Chia-I Wuf7458c52015-10-26 21:10:41 +08009354 vkDestroyImage(m_device->device(), image_bad, NULL);
9355 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009356 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9357 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009358}
Tobin Ehliscde08892015-09-22 10:11:37 -06009359#endif // IMAGE_TESTS
9360
Tony Barbour300a6082015-04-07 13:44:53 -06009361int main(int argc, char **argv) {
9362 int result;
9363
Cody Northrop8e54a402016-03-08 22:25:52 -07009364#ifdef ANDROID
9365 int vulkanSupport = InitVulkan();
9366 if (vulkanSupport == 0)
9367 return 1;
9368#endif
9369
Tony Barbour300a6082015-04-07 13:44:53 -06009370 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06009371 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06009372
9373 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
9374
9375 result = RUN_ALL_TESTS();
9376
Tony Barbour6918cd52015-04-09 12:58:51 -06009377 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06009378 return result;
9379}