blob: 171c4474f41174c9827bd1cfaebbee19b276e648 [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}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600609
Dustin Gravesfce74c02016-05-10 11:42:58 -0600610TEST_F(VkLayerTest, ReservedParameter) {
611 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
612
613 ASSERT_NO_FATAL_FAILURE(InitState());
614
615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
616 " must be 0");
617 // Specify 0 for a reserved VkFlags parameter
618 // Expected to trigger an error with
619 // parameter_validation::validate_reserved_flags
620 VkEvent event_handle = VK_NULL_HANDLE;
621 VkEventCreateInfo event_info = {};
622 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
623 event_info.flags = 1;
624 vkCreateEvent(device(), &event_info, NULL, &event_handle);
625 m_errorMonitor->VerifyFound();
626}
627
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600628TEST_F(VkLayerTest, InvalidStructSType) {
629 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
630 "structure's sType field");
631
632 ASSERT_NO_FATAL_FAILURE(InitState());
633
634 m_errorMonitor->SetDesiredFailureMsg(
635 VK_DEBUG_REPORT_ERROR_BIT_EXT,
636 "parameter pAllocateInfo->sType must be");
637 // Zero struct memory, effectively setting sType to
638 // VK_STRUCTURE_TYPE_APPLICATION_INFO
639 // Expected to trigger an error with
640 // parameter_validation::validate_struct_type
641 VkMemoryAllocateInfo alloc_info = {};
642 VkDeviceMemory memory = VK_NULL_HANDLE;
643 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
644 m_errorMonitor->VerifyFound();
645
646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
647 "parameter pSubmits[0].sType must be");
648 // Zero struct memory, effectively setting sType to
649 // VK_STRUCTURE_TYPE_APPLICATION_INFO
650 // Expected to trigger an error with
651 // parameter_validation::validate_struct_type_array
652 VkSubmitInfo submit_info = {};
653 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
654 m_errorMonitor->VerifyFound();
655}
656
657TEST_F(VkLayerTest, InvalidStructPNext) {
658 TEST_DESCRIPTION(
659 "Specify an invalid value for a Vulkan structure's pNext field");
660
661 ASSERT_NO_FATAL_FAILURE(InitState());
662
663 m_errorMonitor->SetDesiredFailureMsg(
664 VK_DEBUG_REPORT_ERROR_BIT_EXT,
665 "value of pAllocateInfo->pNext must be NULL");
666 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be
667 // NULL
668 // Expected to trigger an error with
669 // parameter_validation::validate_struct_pnext
670 VkDeviceMemory memory = VK_NULL_HANDLE;
671 // Zero-initialization will provide the correct sType
672 VkApplicationInfo app_info = {};
673 VkMemoryAllocateInfo alloc_info = {};
674 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
675 alloc_info.pNext = &app_info;
676 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
677 m_errorMonitor->VerifyFound();
678
679 // TODO: Add non-NULL pNext case
680}
Dustin Graves5d33d532016-05-09 16:21:12 -0600681
682TEST_F(VkLayerTest, UnrecognizedValue) {
683 TEST_DESCRIPTION(
684 "Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
685
686 ASSERT_NO_FATAL_FAILURE(InitState());
687
688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
689 "does not fall within the begin..end "
690 "range of the core VkFormat "
691 "enumeration tokens");
692 // Specify an invalid VkFormat value
693 // Expected to trigger an error with
694 // parameter_validation::validate_ranged_enum
695 VkFormatProperties format_properties;
696 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000),
697 &format_properties);
698 m_errorMonitor->VerifyFound();
699
700 m_errorMonitor->SetDesiredFailureMsg(
701 VK_DEBUG_REPORT_ERROR_BIT_EXT,
702 "contains flag bits that are not recognized members of");
703 // Specify an invalid VkFlags bitmask value
704 // Expected to trigger an error with parameter_validation::validate_flags
705 VkImageFormatProperties image_format_properties;
706 vkGetPhysicalDeviceImageFormatProperties(
707 gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D,
708 VK_IMAGE_TILING_OPTIMAL, static_cast<VkImageUsageFlags>(1 << 25), 0,
709 &image_format_properties);
710 m_errorMonitor->VerifyFound();
711
712 m_errorMonitor->SetDesiredFailureMsg(
713 VK_DEBUG_REPORT_ERROR_BIT_EXT,
714 "contains flag bits that are not recognized members of");
715 // Specify an invalid VkFlags array entry
716 // Expected to trigger an error with
717 // parameter_validation::validate_flags_array
718 VkSemaphore semaphore = VK_NULL_HANDLE;
719 VkPipelineStageFlags stage_flags =
720 static_cast<VkPipelineStageFlags>(1 << 25);
721 VkSubmitInfo submit_info = {};
722 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
723 submit_info.waitSemaphoreCount = 1;
724 submit_info.pWaitSemaphores = &semaphore;
725 submit_info.pWaitDstStageMask = &stage_flags;
726 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
727 m_errorMonitor->VerifyFound();
728
729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
730 "is neither VK_TRUE nor VK_FALSE");
731 // Specify an invalid VkBool32 value
732 // Expected to trigger a warning with
733 // parameter_validation::validate_bool32
734 VkSampler sampler = VK_NULL_HANDLE;
735 VkSamplerCreateInfo sampler_info = {};
736 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
737 sampler_info.pNext = NULL;
738 sampler_info.magFilter = VK_FILTER_NEAREST;
739 sampler_info.minFilter = VK_FILTER_NEAREST;
740 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
741 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
742 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
743 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
744 sampler_info.mipLodBias = 1.0;
745 sampler_info.maxAnisotropy = 1;
746 sampler_info.compareEnable = VK_FALSE;
747 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
748 sampler_info.minLod = 1.0;
749 sampler_info.maxLod = 1.0;
750 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
751 sampler_info.unnormalizedCoordinates = VK_FALSE;
752 // Not VK_TRUE or VK_FALSE
753 sampler_info.anisotropyEnable = 3;
754 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
755 m_errorMonitor->VerifyFound();
756}
Dustin Gravesfce74c02016-05-10 11:42:58 -0600757
758TEST_F(VkLayerTest, FailedReturnValue) {
759 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
760
761 ASSERT_NO_FATAL_FAILURE(InitState());
762
763 m_errorMonitor->SetDesiredFailureMsg(
764 VK_DEBUG_REPORT_WARNING_BIT_EXT,
765 "the requested format is not supported on this device");
766 // Specify invalid VkFormat value to generate a
767 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
768 // Expected to trigger a warning from parameter_validation::validate_result
769 VkImageFormatProperties image_format_properties;
770 VkResult err = vkGetPhysicalDeviceImageFormatProperties(
771 gpu(), static_cast<VkFormat>(0x8000), VK_IMAGE_TYPE_2D,
772 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0,
773 &image_format_properties);
774 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
775 m_errorMonitor->VerifyFound();
776}
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600777#endif // PARAMETER_VALIDATION_TESTS
778
Tobin Ehlis0788f522015-05-26 16:11:58 -0600779#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700780#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800781TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500782{
783 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500784 VkFenceCreateInfo fenceInfo = {};
785 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
786 fenceInfo.pNext = NULL;
787 fenceInfo.flags = 0;
788
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600790
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500791 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600792
793 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
794 vk_testing::Buffer buffer;
795 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500796
Tony Barbourfe3351b2015-07-28 10:17:20 -0600797 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800798 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600799 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500800
801 testFence.init(*m_device, fenceInfo);
802
803 // Bypass framework since it does the waits automatically
804 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600805 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800806 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
807 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800808 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600809 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700810 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800811 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800812 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800813 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600814 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600815
816 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500817 ASSERT_VK_SUCCESS( err );
818
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500819 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800820 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500821
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200822 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500823}
824
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800825TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500826{
827 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500828 VkFenceCreateInfo fenceInfo = {};
829 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
830 fenceInfo.pNext = NULL;
831 fenceInfo.flags = 0;
832
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700833 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600834
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500835 ASSERT_NO_FATAL_FAILURE(InitState());
836 ASSERT_NO_FATAL_FAILURE(InitViewport());
837 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
838
Tony Barbourfe3351b2015-07-28 10:17:20 -0600839 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800840 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600841 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500842
843 testFence.init(*m_device, fenceInfo);
844
845 // Bypass framework since it does the waits automatically
846 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600847 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800848 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
849 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800850 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600851 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700852 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800853 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800854 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800855 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600856 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600857
858 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500859 ASSERT_VK_SUCCESS( err );
860
Jon Ashburnf19916e2016-01-11 13:12:43 -0700861 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800862 VkCommandBufferBeginInfo info = {};
863 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
864 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600865 info.renderPass = VK_NULL_HANDLE;
866 info.subpass = 0;
867 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800868 info.occlusionQueryEnable = VK_FALSE;
869 info.queryFlags = 0;
870 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600871
872 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800873 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500874
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200875 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500876}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700877#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200878
Mark Lobodzinski152fe252016-05-03 16:49:15 -0600879// This is a positive test. No failures are expected.
880TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
881 VkResult err;
882 bool pass;
883
884 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
885 "the buffer, create an image, and bind the same memory to "
886 "it");
887
888 m_errorMonitor->ExpectSuccess();
889
890 ASSERT_NO_FATAL_FAILURE(InitState());
891
892 VkBuffer buffer;
893 VkImage image;
894 VkDeviceMemory mem;
895 VkMemoryRequirements mem_reqs;
896
897 VkBufferCreateInfo buf_info = {};
898 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
899 buf_info.pNext = NULL;
900 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
901 buf_info.size = 256;
902 buf_info.queueFamilyIndexCount = 0;
903 buf_info.pQueueFamilyIndices = NULL;
904 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
905 buf_info.flags = 0;
906 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
907 ASSERT_VK_SUCCESS(err);
908
909 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
910
911 VkMemoryAllocateInfo alloc_info = {};
912 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
913 alloc_info.pNext = NULL;
914 alloc_info.memoryTypeIndex = 0;
915
916 // Ensure memory is big enough for both bindings
917 alloc_info.allocationSize = 0x10000;
918
919 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
920 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
921 if (!pass) {
922 vkDestroyBuffer(m_device->device(), buffer, NULL);
923 return;
924 }
925
926 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
927 ASSERT_VK_SUCCESS(err);
928
929 uint8_t *pData;
930 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
931 (void **)&pData);
932 ASSERT_VK_SUCCESS(err);
933
Mark Lobodzinski2abefa92016-05-05 11:45:57 -0600934 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -0600935
936 vkUnmapMemory(m_device->device(), mem);
937
938 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
939 ASSERT_VK_SUCCESS(err);
940
941 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
942 // memory. In fact, it was never used by the GPU.
943 // Just be be sure, wait for idle.
944 vkDestroyBuffer(m_device->device(), buffer, NULL);
945 vkDeviceWaitIdle(m_device->device());
946
947 VkImageCreateInfo image_create_info = {};
948 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
949 image_create_info.pNext = NULL;
950 image_create_info.imageType = VK_IMAGE_TYPE_2D;
951 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
952 image_create_info.extent.width = 64;
953 image_create_info.extent.height = 64;
954 image_create_info.extent.depth = 1;
955 image_create_info.mipLevels = 1;
956 image_create_info.arrayLayers = 1;
957 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
958 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
959 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
960 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
961 image_create_info.queueFamilyIndexCount = 0;
962 image_create_info.pQueueFamilyIndices = NULL;
963 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
964 image_create_info.flags = 0;
965
966 VkMemoryAllocateInfo mem_alloc = {};
967 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
968 mem_alloc.pNext = NULL;
969 mem_alloc.allocationSize = 0;
970 mem_alloc.memoryTypeIndex = 0;
971
972 /* Create a mappable image. It will be the texture if linear images are ok
973 * to be textures or it will be the staging image if they are not.
974 */
975 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
976 ASSERT_VK_SUCCESS(err);
977
978 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
979
980 mem_alloc.allocationSize = mem_reqs.size;
981
982 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
983 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
984 if (!pass) {
985 vkDestroyImage(m_device->device(), image, NULL);
986 return;
987 }
988
989 // VALDIATION FAILURE:
990 err = vkBindImageMemory(m_device->device(), image, mem, 0);
991 ASSERT_VK_SUCCESS(err);
992
993 m_errorMonitor->VerifyNotFound();
994
995 vkDestroyBuffer(m_device->device(), buffer, NULL);
996 vkDestroyImage(m_device->device(), image, NULL);
997}
998
Ian Elliott1c32c772016-04-28 14:47:13 -0600999TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1000 VkResult err;
1001 bool pass;
1002
Ian Elliott489eec02016-05-05 14:12:44 -06001003// FIXME: After we turn on this code for non-Linux platforms, uncomment the
1004// following declaration (which is temporarily being moved below):
1005// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001006 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
1007 VkSwapchainCreateInfoKHR swapchain_create_info = {};
1008 uint32_t swapchain_image_count = 0;
1009// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
1010 uint32_t image_index = 0;
1011// VkPresentInfoKHR present_info = {};
1012
1013 ASSERT_NO_FATAL_FAILURE(InitState());
1014
Ian Elliott3f06ce52016-04-29 14:46:21 -06001015#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1016#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1017 // Use the functions from the VK_KHR_android_surface extension without
1018 // enabling that extension:
1019
1020 // Create a surface:
1021 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
1022#if 0
1023#endif
1024 m_errorMonitor->SetDesiredFailureMsg(
1025 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1026 "extension was not enabled for this");
1027 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
1028 &surface);
1029 pass = (err != VK_SUCCESS);
1030 ASSERT_TRUE(pass);
1031 m_errorMonitor->VerifyFound();
1032#endif // VK_USE_PLATFORM_ANDROID_KHR
1033
1034
1035#if defined(VK_USE_PLATFORM_MIR_KHR)
1036 // Use the functions from the VK_KHR_mir_surface extension without enabling
1037 // that extension:
1038
1039 // Create a surface:
1040 VkMirSurfaceCreateInfoKHR mir_create_info = {};
1041#if 0
1042#endif
1043 m_errorMonitor->SetDesiredFailureMsg(
1044 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1045 "extension was not enabled for this");
1046 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1047 pass = (err != VK_SUCCESS);
1048 ASSERT_TRUE(pass);
1049 m_errorMonitor->VerifyFound();
1050
1051 // Tell whether an mir_connection supports presentation:
1052 MirConnection *mir_connection = NULL;
1053 m_errorMonitor->SetDesiredFailureMsg(
1054 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1055 "extension was not enabled for this");
1056 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
1057 visual_id);
1058 m_errorMonitor->VerifyFound();
1059#endif // VK_USE_PLATFORM_MIR_KHR
1060
1061
1062#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1063 // Use the functions from the VK_KHR_wayland_surface extension without
1064 // enabling that extension:
1065
1066 // Create a surface:
1067 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
1068#if 0
1069#endif
1070 m_errorMonitor->SetDesiredFailureMsg(
1071 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1072 "extension was not enabled for this");
1073 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
1074 &surface);
1075 pass = (err != VK_SUCCESS);
1076 ASSERT_TRUE(pass);
1077 m_errorMonitor->VerifyFound();
1078
1079 // Tell whether an wayland_display supports presentation:
1080 struct wl_display wayland_display = {};
1081 m_errorMonitor->SetDesiredFailureMsg(
1082 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1083 "extension was not enabled for this");
1084 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
1085 &wayland_display);
1086 m_errorMonitor->VerifyFound();
1087#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06001088#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001089
1090
1091#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06001092// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1093// TO NON-LINUX PLATFORMS:
1094VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001095 // Use the functions from the VK_KHR_win32_surface extension without
1096 // enabling that extension:
1097
1098 // Create a surface:
1099 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
1100#if 0
1101#endif
1102 m_errorMonitor->SetDesiredFailureMsg(
1103 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1104 "extension was not enabled for this");
1105 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
1106 &surface);
1107 pass = (err != VK_SUCCESS);
1108 ASSERT_TRUE(pass);
1109 m_errorMonitor->VerifyFound();
1110
1111 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001112 m_errorMonitor->SetDesiredFailureMsg(
1113 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1114 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001115 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001116 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001117// Set this (for now, until all platforms are supported and tested):
1118#define NEED_TO_TEST_THIS_ON_PLATFORM
1119#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001120
1121
Ian Elliott1c32c772016-04-28 14:47:13 -06001122#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06001123// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1124// TO NON-LINUX PLATFORMS:
1125VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001126 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1127 // that extension:
1128
1129 // Create a surface:
1130 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
1131#if 0
1132#endif
1133 m_errorMonitor->SetDesiredFailureMsg(
1134 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1135 "extension was not enabled for this");
1136 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1137 pass = (err != VK_SUCCESS);
1138 ASSERT_TRUE(pass);
1139 m_errorMonitor->VerifyFound();
1140
1141 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001142 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001143 xcb_visualid_t visual_id = 0;
1144 m_errorMonitor->SetDesiredFailureMsg(
1145 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1146 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001147 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06001148 visual_id);
1149 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001150// Set this (for now, until all platforms are supported and tested):
1151#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001152#endif // VK_USE_PLATFORM_XCB_KHR
1153
1154
Ian Elliott12630812016-04-29 14:35:43 -06001155#if defined(VK_USE_PLATFORM_XLIB_KHR)
1156 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1157 // that extension:
1158
1159 // Create a surface:
1160 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
1161#if 0
1162#endif
1163 m_errorMonitor->SetDesiredFailureMsg(
1164 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1165 "extension was not enabled for this");
1166 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1167 pass = (err != VK_SUCCESS);
1168 ASSERT_TRUE(pass);
1169 m_errorMonitor->VerifyFound();
1170
1171 // Tell whether an Xlib VisualID supports presentation:
1172 Display *dpy = NULL;
1173 VisualID visual = 0;
1174 m_errorMonitor->SetDesiredFailureMsg(
1175 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1176 "extension was not enabled for this");
1177 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1178 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001179// Set this (for now, until all platforms are supported and tested):
1180#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06001181#endif // VK_USE_PLATFORM_XLIB_KHR
1182
1183
Ian Elliott1c32c772016-04-28 14:47:13 -06001184 // Use the functions from the VK_KHR_surface extension without enabling
1185 // that extension:
1186
Ian Elliott489eec02016-05-05 14:12:44 -06001187#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001188 // Destroy a surface:
1189 m_errorMonitor->SetDesiredFailureMsg(
1190 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1191 "extension was not enabled for this");
1192 vkDestroySurfaceKHR(instance(), surface, NULL);
1193 m_errorMonitor->VerifyFound();
1194
1195 // Check if surface supports presentation:
1196 VkBool32 supported = false;
1197 m_errorMonitor->SetDesiredFailureMsg(
1198 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1199 "extension was not enabled for this");
1200 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1201 pass = (err != VK_SUCCESS);
1202 ASSERT_TRUE(pass);
1203 m_errorMonitor->VerifyFound();
1204
1205 // Check surface capabilities:
1206 VkSurfaceCapabilitiesKHR capabilities = {};
1207 m_errorMonitor->SetDesiredFailureMsg(
1208 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1209 "extension was not enabled for this");
1210 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
1211 &capabilities);
1212 pass = (err != VK_SUCCESS);
1213 ASSERT_TRUE(pass);
1214 m_errorMonitor->VerifyFound();
1215
1216 // Check surface formats:
1217 uint32_t format_count = 0;
1218 VkSurfaceFormatKHR *formats = NULL;
1219 m_errorMonitor->SetDesiredFailureMsg(
1220 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1221 "extension was not enabled for this");
1222 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1223 &format_count, formats);
1224 pass = (err != VK_SUCCESS);
1225 ASSERT_TRUE(pass);
1226 m_errorMonitor->VerifyFound();
1227
1228 // Check surface present modes:
1229 uint32_t present_mode_count = 0;
1230 VkSurfaceFormatKHR *present_modes = NULL;
1231 m_errorMonitor->SetDesiredFailureMsg(
1232 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1233 "extension was not enabled for this");
1234 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1235 &present_mode_count, present_modes);
1236 pass = (err != VK_SUCCESS);
1237 ASSERT_TRUE(pass);
1238 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001239#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001240
1241
1242 // Use the functions from the VK_KHR_swapchain extension without enabling
1243 // that extension:
1244
1245 // Create a swapchain:
1246 m_errorMonitor->SetDesiredFailureMsg(
1247 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1248 "extension was not enabled for this");
1249 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1250 swapchain_create_info.pNext = NULL;
1251#if 0
1252 swapchain_create_info.flags = 0;
1253 swapchain_create_info.surface = 0;
1254 swapchain_create_info.minImageCount = 0;
1255 swapchain_create_info.imageFormat = 0;
1256 swapchain_create_info.imageColorSpace = 0;
1257 swapchain_create_info.imageExtent.width = 0;
1258 swapchain_create_info.imageExtent.height = 0;
1259 swapchain_create_info.imageArrayLayers = 0;
1260 swapchain_create_info.imageUsage = 0;
1261 swapchain_create_info.imageSharingMode = 0;
1262 swapchain_create_info.queueFamilyIndexCount = 0;
1263 swapchain_create_info.preTransform = 0;
1264 swapchain_create_info.compositeAlpha = 0;
1265 swapchain_create_info.presentMode = 0;
1266 swapchain_create_info.clipped = 0;
1267 swapchain_create_info.oldSwapchain = NULL;
1268#endif
1269 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1270 NULL, &swapchain);
1271 pass = (err != VK_SUCCESS);
1272 ASSERT_TRUE(pass);
1273 m_errorMonitor->VerifyFound();
1274
1275 // Get the images from the swapchain:
1276 m_errorMonitor->SetDesiredFailureMsg(
1277 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1278 "extension was not enabled for this");
1279 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
1280 &swapchain_image_count, NULL);
1281 pass = (err != VK_SUCCESS);
1282 ASSERT_TRUE(pass);
1283 m_errorMonitor->VerifyFound();
1284
1285 // Try to acquire an image:
1286 m_errorMonitor->SetDesiredFailureMsg(
1287 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1288 "extension was not enabled for this");
1289 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
1290 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
1291 pass = (err != VK_SUCCESS);
1292 ASSERT_TRUE(pass);
1293 m_errorMonitor->VerifyFound();
1294
1295 // Try to present an image:
1296#if 0 // NOTE: Currently can't test this because a real swapchain is needed
1297 // (as opposed to the fake one we created) in order for the layer to
1298 // lookup the VkDevice used to enable the extension:
1299 m_errorMonitor->SetDesiredFailureMsg(
1300 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1301 "extension was not enabled for this");
1302 present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
1303 present_info.pNext = NULL;
1304#if 0
1305#endif
1306 err = vkQueuePresentKHR(m_device->m_queue, &present_info);
1307 pass = (err != VK_SUCCESS);
1308 ASSERT_TRUE(pass);
1309 m_errorMonitor->VerifyFound();
1310#endif
1311
1312 // Destroy the swapchain:
1313 m_errorMonitor->SetDesiredFailureMsg(
1314 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1315 "extension was not enabled for this");
1316 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1317 m_errorMonitor->VerifyFound();
1318}
1319
Karl Schultz6addd812016-02-02 17:17:23 -07001320TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1321 VkResult err;
1322 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001323
Karl Schultz6addd812016-02-02 17:17:23 -07001324 m_errorMonitor->SetDesiredFailureMsg(
1325 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001326 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
1327
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001328 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001329
1330 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001331 VkImage image;
1332 VkDeviceMemory mem;
1333 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001334
Karl Schultz6addd812016-02-02 17:17:23 -07001335 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1336 const int32_t tex_width = 32;
1337 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001338
Tony Barboureb254902015-07-15 12:50:33 -06001339 VkImageCreateInfo image_create_info = {};
1340 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001341 image_create_info.pNext = NULL;
1342 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1343 image_create_info.format = tex_format;
1344 image_create_info.extent.width = tex_width;
1345 image_create_info.extent.height = tex_height;
1346 image_create_info.extent.depth = 1;
1347 image_create_info.mipLevels = 1;
1348 image_create_info.arrayLayers = 1;
1349 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1350 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1351 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1352 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001353
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001354 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001355 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001356 mem_alloc.pNext = NULL;
1357 mem_alloc.allocationSize = 0;
1358 // Introduce failure, do NOT set memProps to
1359 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
1360 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001361
Chia-I Wuf7458c52015-10-26 21:10:41 +08001362 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001363 ASSERT_VK_SUCCESS(err);
1364
Karl Schultz6addd812016-02-02 17:17:23 -07001365 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001366
Mark Lobodzinski23065352015-05-29 09:32:35 -05001367 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001368
Karl Schultz6addd812016-02-02 17:17:23 -07001369 pass =
1370 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
1371 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1372 if (!pass) { // If we can't find any unmappable memory this test doesn't
1373 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08001374 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06001375 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06001376 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06001377
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001378 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001379 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001380 ASSERT_VK_SUCCESS(err);
1381
1382 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06001383 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001384 ASSERT_VK_SUCCESS(err);
1385
1386 // Map memory as if to initialize the image
1387 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07001388 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
1389 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001390
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001391 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001392
Chia-I Wuf7458c52015-10-26 21:10:41 +08001393 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001394}
1395
Karl Schultz6addd812016-02-02 17:17:23 -07001396TEST_F(VkLayerTest, RebindMemory) {
1397 VkResult err;
1398 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001399
Karl Schultz6addd812016-02-02 17:17:23 -07001400 m_errorMonitor->SetDesiredFailureMsg(
1401 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001402 "which has already been bound to mem object");
1403
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001404 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001405
1406 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001407 VkImage image;
1408 VkDeviceMemory mem1;
1409 VkDeviceMemory mem2;
1410 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001411
Karl Schultz6addd812016-02-02 17:17:23 -07001412 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1413 const int32_t tex_width = 32;
1414 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001415
Tony Barboureb254902015-07-15 12:50:33 -06001416 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001417 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1418 image_create_info.pNext = NULL;
1419 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1420 image_create_info.format = tex_format;
1421 image_create_info.extent.width = tex_width;
1422 image_create_info.extent.height = tex_height;
1423 image_create_info.extent.depth = 1;
1424 image_create_info.mipLevels = 1;
1425 image_create_info.arrayLayers = 1;
1426 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1427 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1428 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1429 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001430
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001431 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001432 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1433 mem_alloc.pNext = NULL;
1434 mem_alloc.allocationSize = 0;
1435 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06001436
Karl Schultz6addd812016-02-02 17:17:23 -07001437 // Introduce failure, do NOT set memProps to
1438 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06001439 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001440 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001441 ASSERT_VK_SUCCESS(err);
1442
Karl Schultz6addd812016-02-02 17:17:23 -07001443 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001444
1445 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001446 pass =
1447 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001448 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001449
1450 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001451 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001452 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001453 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001454 ASSERT_VK_SUCCESS(err);
1455
1456 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06001457 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001458 ASSERT_VK_SUCCESS(err);
1459
Karl Schultz6addd812016-02-02 17:17:23 -07001460 // Introduce validation failure, try to bind a different memory object to
1461 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06001462 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001463
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001464 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001465
Chia-I Wuf7458c52015-10-26 21:10:41 +08001466 vkDestroyImage(m_device->device(), image, NULL);
1467 vkFreeMemory(m_device->device(), mem1, NULL);
1468 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001469}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001470
Karl Schultz6addd812016-02-02 17:17:23 -07001471TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001472 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001473
Karl Schultz6addd812016-02-02 17:17:23 -07001474 m_errorMonitor->SetDesiredFailureMsg(
1475 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
1476 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001477
1478 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001479 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1480 fenceInfo.pNext = NULL;
1481 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06001482
Tony Barbour300a6082015-04-07 13:44:53 -06001483 ASSERT_NO_FATAL_FAILURE(InitState());
1484 ASSERT_NO_FATAL_FAILURE(InitViewport());
1485 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1486
Tony Barbourfe3351b2015-07-28 10:17:20 -06001487 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001488 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1489 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001490 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06001491
1492 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001493
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001494 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001495 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1496 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001497 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001498 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001499 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001500 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001501 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001502 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001503 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001504
1505 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001506 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001507
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001508 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001509}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001510// This is a positive test. We used to expect error in this case but spec now
1511// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07001512TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001513 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001514 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001515 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001516 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1517 fenceInfo.pNext = NULL;
1518
Tony Barbour0b4d9562015-04-09 10:48:04 -06001519 ASSERT_NO_FATAL_FAILURE(InitState());
1520 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08001521 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001522 VkResult result = vkResetFences(m_device->device(), 1, fences);
1523 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06001524
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001525 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06001526}
Tobin Ehlis41376e12015-07-03 08:45:14 -06001527
1528TEST_F(VkLayerTest, InvalidUsageBits)
1529{
Tony Barbourf92621a2016-05-02 14:28:12 -06001530 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001531 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06001532 "Initialize buffer with wrong usage then perform copy expecting errors "
1533 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001535 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001536
1537 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06001538 VkImageObj image(m_device);
1539 // Initialize image with USAGE_INPUT_ATTACHMENT
1540 image.init(128, 128, VK_FORMAT_D32_SFLOAT_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001541 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1542 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06001543
Tony Barbourf92621a2016-05-02 14:28:12 -06001544 VkImageView dsv;
1545 VkImageViewCreateInfo dsvci = {};
1546 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1547 dsvci.image = image.handle();
1548 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
1549 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
1550 dsvci.subresourceRange.layerCount = 1;
1551 dsvci.subresourceRange.baseMipLevel = 0;
1552 dsvci.subresourceRange.levelCount = 1;
1553 dsvci.subresourceRange.aspectMask =
1554 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06001555
Tony Barbourf92621a2016-05-02 14:28:12 -06001556 // Create a view with depth / stencil aspect for image with different usage
1557 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001558
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001559 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06001560
1561 // Initialize buffer with TRANSFER_DST usage
1562 vk_testing::Buffer buffer;
1563 VkMemoryPropertyFlags reqs = 0;
1564 buffer.init_as_dst(*m_device, 128 * 128, reqs);
1565 VkBufferImageCopy region = {};
1566 region.bufferRowLength = 128;
1567 region.bufferImageHeight = 128;
1568 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1569 region.imageSubresource.layerCount = 1;
1570 region.imageExtent.height = 16;
1571 region.imageExtent.width = 16;
1572 region.imageExtent.depth = 1;
1573
1574 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1575 "Invalid usage flag for buffer ");
1576 // Buffer usage not set to TRANSFER_SRC and image usage not set to
1577 // TRANSFER_DST
1578 BeginCommandBuffer();
1579 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1580 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1581 1, &region);
1582 m_errorMonitor->VerifyFound();
1583
1584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1585 "Invalid usage flag for image ");
1586 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1587 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1588 1, &region);
1589 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06001590}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001591#endif // MEM_TRACKER_TESTS
1592
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06001593#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06001594
1595TEST_F(VkLayerTest, LeakAnObject) {
1596 VkResult err;
1597
1598 TEST_DESCRIPTION(
1599 "Create a fence and destroy its device without first destroying the fence.");
1600
1601 // Note that we have to create a new device since destroying the
1602 // framework's device causes Teardown() to fail and just calling Teardown
1603 // will destroy the errorMonitor.
1604
1605 m_errorMonitor->SetDesiredFailureMsg(
1606 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1607 "OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT object");
1608
1609 ASSERT_NO_FATAL_FAILURE(InitState());
1610
1611 const std::vector<VkQueueFamilyProperties> queue_props =
1612 m_device->queue_props;
1613 std::vector<VkDeviceQueueCreateInfo> queue_info;
1614 queue_info.reserve(queue_props.size());
1615 std::vector<std::vector<float>> queue_priorities;
1616 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
1617 VkDeviceQueueCreateInfo qi = {};
1618 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
1619 qi.pNext = NULL;
1620 qi.queueFamilyIndex = i;
1621 qi.queueCount = queue_props[i].queueCount;
1622 queue_priorities.emplace_back(qi.queueCount, 0.0f);
1623 qi.pQueuePriorities = queue_priorities[i].data();
1624 queue_info.push_back(qi);
1625 }
1626
1627 std::vector<const char *> device_layer_names;
1628 std::vector<const char *> device_extension_names;
1629 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
1630 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
1631 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
1632 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
1633 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
1634 device_layer_names.push_back("VK_LAYER_LUNARG_image");
1635 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
1636
1637 // The sacrificial device object
1638 VkDevice testDevice;
1639 VkDeviceCreateInfo device_create_info = {};
1640 auto features = m_device->phy().features();
1641 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
1642 device_create_info.pNext = NULL;
1643 device_create_info.queueCreateInfoCount = queue_info.size();
1644 device_create_info.pQueueCreateInfos = queue_info.data();
1645 device_create_info.enabledLayerCount = device_layer_names.size();
1646 device_create_info.ppEnabledLayerNames = device_layer_names.data();
1647 device_create_info.pEnabledFeatures = &features;
1648 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
1649 ASSERT_VK_SUCCESS(err);
1650
1651 VkFence fence;
1652 VkFenceCreateInfo fence_create_info = {};
1653 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1654 fence_create_info.pNext = NULL;
1655 fence_create_info.flags = 0;
1656 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
1657 ASSERT_VK_SUCCESS(err);
1658
1659 // Induce failure by not calling vkDestroyFence
1660 vkDestroyDevice(testDevice, NULL);
1661 m_errorMonitor->VerifyFound();
1662}
1663
1664TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
1665
1666 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
1667 "attempt to delete them from another.");
1668
1669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1670 "FreeCommandBuffers is attempting to free Command Buffer");
1671
1672 VkCommandPool command_pool_one;
1673 VkCommandPool command_pool_two;
1674
1675 VkCommandPoolCreateInfo pool_create_info{};
1676 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1677 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1678 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1679
1680 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1681 &command_pool_one);
1682
1683 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1684 &command_pool_two);
1685
1686 VkCommandBuffer command_buffer[9];
1687 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1688 command_buffer_allocate_info.sType =
1689 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1690 command_buffer_allocate_info.commandPool = command_pool_one;
1691 command_buffer_allocate_info.commandBufferCount = 9;
1692 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1693 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1694 command_buffer);
1695
1696 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
1697 &command_buffer[3]);
1698
1699 m_errorMonitor->VerifyFound();
1700
1701 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
1702 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
1703}
1704
1705TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
1706 VkResult err;
1707
1708 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
1709 "attempt to delete them from another.");
1710
1711 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1712 "FreeDescriptorSets is attempting to free descriptorSet");
1713
1714 ASSERT_NO_FATAL_FAILURE(InitState());
1715 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1716
1717 VkDescriptorPoolSize ds_type_count = {};
1718 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
1719 ds_type_count.descriptorCount = 1;
1720
1721 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1722 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1723 ds_pool_ci.pNext = NULL;
1724 ds_pool_ci.flags = 0;
1725 ds_pool_ci.maxSets = 1;
1726 ds_pool_ci.poolSizeCount = 1;
1727 ds_pool_ci.pPoolSizes = &ds_type_count;
1728
1729 VkDescriptorPool ds_pool_one;
1730 err =
1731 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
1732 ASSERT_VK_SUCCESS(err);
1733
1734 // Create a second descriptor pool
1735 VkDescriptorPool ds_pool_two;
1736 err =
1737 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
1738 ASSERT_VK_SUCCESS(err);
1739
1740 VkDescriptorSetLayoutBinding dsl_binding = {};
1741 dsl_binding.binding = 0;
1742 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1743 dsl_binding.descriptorCount = 1;
1744 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1745 dsl_binding.pImmutableSamplers = NULL;
1746
1747 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1748 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1749 ds_layout_ci.pNext = NULL;
1750 ds_layout_ci.bindingCount = 1;
1751 ds_layout_ci.pBindings = &dsl_binding;
1752
1753 VkDescriptorSetLayout ds_layout;
1754 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1755 &ds_layout);
1756 ASSERT_VK_SUCCESS(err);
1757
1758 VkDescriptorSet descriptorSet;
1759 VkDescriptorSetAllocateInfo alloc_info = {};
1760 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1761 alloc_info.descriptorSetCount = 1;
1762 alloc_info.descriptorPool = ds_pool_one;
1763 alloc_info.pSetLayouts = &ds_layout;
1764 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1765 &descriptorSet);
1766 ASSERT_VK_SUCCESS(err);
1767
1768 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
1769
1770 m_errorMonitor->VerifyFound();
1771
1772 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1773 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
1774 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
1775}
1776
1777TEST_F(VkLayerTest, CreateUnknownObject) {
1778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1779 "Invalid VkImage Object ");
1780
1781 TEST_DESCRIPTION(
1782 "Pass an invalid image object handle into a Vulkan API call.");
1783
1784 ASSERT_NO_FATAL_FAILURE(InitState());
1785
1786 // Pass bogus handle into GetImageMemoryRequirements
1787 VkMemoryRequirements mem_reqs;
1788 uint64_t fakeImageHandle = 0xCADECADE;
1789 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
1790
1791 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
1792
1793 m_errorMonitor->VerifyFound();
1794}
1795
Karl Schultz6addd812016-02-02 17:17:23 -07001796TEST_F(VkLayerTest, PipelineNotBound) {
1797 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001798
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06001799 TEST_DESCRIPTION(
1800 "Pass in an invalid pipeline object handle into a Vulkan API call.");
1801
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001803 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001804
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001805 ASSERT_NO_FATAL_FAILURE(InitState());
1806 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001807
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001808 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001809 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1810 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001811
1812 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001813 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1814 ds_pool_ci.pNext = NULL;
1815 ds_pool_ci.maxSets = 1;
1816 ds_pool_ci.poolSizeCount = 1;
1817 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001818
1819 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001820 err =
1821 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001822 ASSERT_VK_SUCCESS(err);
1823
1824 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001825 dsl_binding.binding = 0;
1826 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1827 dsl_binding.descriptorCount = 1;
1828 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1829 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001830
1831 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001832 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1833 ds_layout_ci.pNext = NULL;
1834 ds_layout_ci.bindingCount = 1;
1835 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001836
1837 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001838 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1839 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001840 ASSERT_VK_SUCCESS(err);
1841
1842 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001843 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001844 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001845 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001846 alloc_info.descriptorPool = ds_pool;
1847 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001848 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1849 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001850 ASSERT_VK_SUCCESS(err);
1851
1852 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001853 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1854 pipeline_layout_ci.pNext = NULL;
1855 pipeline_layout_ci.setLayoutCount = 1;
1856 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001857
1858 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001859 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1860 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001861 ASSERT_VK_SUCCESS(err);
1862
Mark Youngad779052016-01-06 14:26:04 -07001863 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001864
1865 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001866 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1867 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001868
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001869 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001870
Chia-I Wuf7458c52015-10-26 21:10:41 +08001871 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1872 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1873 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001874}
1875
Karl Schultz6addd812016-02-02 17:17:23 -07001876TEST_F(VkLayerTest, BindInvalidMemory) {
1877 VkResult err;
1878 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001879
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001881 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001882
Tobin Ehlisec598302015-09-15 15:02:17 -06001883 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001884
1885 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001886 VkImage image;
1887 VkDeviceMemory mem;
1888 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001889
Karl Schultz6addd812016-02-02 17:17:23 -07001890 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1891 const int32_t tex_width = 32;
1892 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001893
1894 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001895 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1896 image_create_info.pNext = NULL;
1897 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1898 image_create_info.format = tex_format;
1899 image_create_info.extent.width = tex_width;
1900 image_create_info.extent.height = tex_height;
1901 image_create_info.extent.depth = 1;
1902 image_create_info.mipLevels = 1;
1903 image_create_info.arrayLayers = 1;
1904 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1905 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1906 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1907 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001908
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001909 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001910 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1911 mem_alloc.pNext = NULL;
1912 mem_alloc.allocationSize = 0;
1913 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001914
Chia-I Wuf7458c52015-10-26 21:10:41 +08001915 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001916 ASSERT_VK_SUCCESS(err);
1917
Karl Schultz6addd812016-02-02 17:17:23 -07001918 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001919
1920 mem_alloc.allocationSize = mem_reqs.size;
1921
Karl Schultz6addd812016-02-02 17:17:23 -07001922 pass =
1923 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001924 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001925
1926 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001927 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001928 ASSERT_VK_SUCCESS(err);
1929
1930 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001931 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001932
1933 // Try to bind free memory that has been freed
1934 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1935 // This may very well return an error.
1936 (void)err;
1937
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001938 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001939
Chia-I Wuf7458c52015-10-26 21:10:41 +08001940 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001941}
1942
Karl Schultz6addd812016-02-02 17:17:23 -07001943TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1944 VkResult err;
1945 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001946
Karl Schultz6addd812016-02-02 17:17:23 -07001947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1948 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001949
Tobin Ehlisec598302015-09-15 15:02:17 -06001950 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001951
Karl Schultz6addd812016-02-02 17:17:23 -07001952 // Create an image object, allocate memory, destroy the object and then try
1953 // to bind it
1954 VkImage image;
1955 VkDeviceMemory mem;
1956 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001957
Karl Schultz6addd812016-02-02 17:17:23 -07001958 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1959 const int32_t tex_width = 32;
1960 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001961
1962 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001963 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1964 image_create_info.pNext = NULL;
1965 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1966 image_create_info.format = tex_format;
1967 image_create_info.extent.width = tex_width;
1968 image_create_info.extent.height = tex_height;
1969 image_create_info.extent.depth = 1;
1970 image_create_info.mipLevels = 1;
1971 image_create_info.arrayLayers = 1;
1972 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1973 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1974 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1975 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001976
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001977 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001978 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1979 mem_alloc.pNext = NULL;
1980 mem_alloc.allocationSize = 0;
1981 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001982
Chia-I Wuf7458c52015-10-26 21:10:41 +08001983 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001984 ASSERT_VK_SUCCESS(err);
1985
Karl Schultz6addd812016-02-02 17:17:23 -07001986 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001987
1988 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001989 pass =
1990 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001991 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001992
1993 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001994 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001995 ASSERT_VK_SUCCESS(err);
1996
1997 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001998 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001999 ASSERT_VK_SUCCESS(err);
2000
2001 // Now Try to bind memory to this destroyed object
2002 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2003 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002004 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002005
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002006 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002007
Chia-I Wuf7458c52015-10-26 21:10:41 +08002008 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002009}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002010
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002011#endif // OBJ_TRACKER_TESTS
2012
Tobin Ehlis0788f522015-05-26 16:11:58 -06002013#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002014
2015// This is a positive test. No errors should be generated.
2016TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
2017
2018 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2019 "submitted on separate queues followed by a QueueWaitIdle.");
2020
Dustin Graves48458142016-04-29 16:11:55 -06002021 if ((m_device->queue_props.empty()) ||
2022 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002023 return;
2024
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002025 m_errorMonitor->ExpectSuccess();
2026
2027 VkSemaphore semaphore;
2028 VkSemaphoreCreateInfo semaphore_create_info{};
2029 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2030 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2031 &semaphore);
2032
2033 VkCommandPool command_pool;
2034 VkCommandPoolCreateInfo pool_create_info{};
2035 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2036 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2037 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2038 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2039 &command_pool);
2040
2041 VkCommandBuffer command_buffer[2];
2042 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2043 command_buffer_allocate_info.sType =
2044 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2045 command_buffer_allocate_info.commandPool = command_pool;
2046 command_buffer_allocate_info.commandBufferCount = 2;
2047 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2048 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2049 command_buffer);
2050
2051 VkQueue queue = VK_NULL_HANDLE;
2052 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2053 1, &queue);
2054
2055 {
2056 VkCommandBufferBeginInfo begin_info{};
2057 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2058 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2059
2060 vkCmdPipelineBarrier(command_buffer[0],
2061 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2062 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2063 0, nullptr, 0, nullptr);
2064
2065 VkViewport viewport{};
2066 viewport.maxDepth = 1.0f;
2067 viewport.minDepth = 0.0f;
2068 viewport.width = 512;
2069 viewport.height = 512;
2070 viewport.x = 0;
2071 viewport.y = 0;
2072 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2073 vkEndCommandBuffer(command_buffer[0]);
2074 }
2075 {
2076 VkCommandBufferBeginInfo begin_info{};
2077 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2078 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2079
2080 VkViewport viewport{};
2081 viewport.maxDepth = 1.0f;
2082 viewport.minDepth = 0.0f;
2083 viewport.width = 512;
2084 viewport.height = 512;
2085 viewport.x = 0;
2086 viewport.y = 0;
2087 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2088 vkEndCommandBuffer(command_buffer[1]);
2089 }
2090 {
2091 VkSubmitInfo submit_info{};
2092 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2093 submit_info.commandBufferCount = 1;
2094 submit_info.pCommandBuffers = &command_buffer[0];
2095 submit_info.signalSemaphoreCount = 1;
2096 submit_info.pSignalSemaphores = &semaphore;
2097 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2098 }
2099 {
2100 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2101 VkSubmitInfo submit_info{};
2102 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2103 submit_info.commandBufferCount = 1;
2104 submit_info.pCommandBuffers = &command_buffer[1];
2105 submit_info.waitSemaphoreCount = 1;
2106 submit_info.pWaitSemaphores = &semaphore;
2107 submit_info.pWaitDstStageMask = flags;
2108 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2109 }
2110
2111 vkQueueWaitIdle(m_device->m_queue);
2112
2113 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2114 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2115 &command_buffer[0]);
2116 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2117
2118 m_errorMonitor->VerifyNotFound();
2119}
2120
2121// This is a positive test. No errors should be generated.
2122TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
2123
2124 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2125 "submitted on separate queues, the second having a fence"
2126 "followed by a QueueWaitIdle.");
2127
Dustin Graves48458142016-04-29 16:11:55 -06002128 if ((m_device->queue_props.empty()) ||
2129 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002130 return;
2131
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002132 m_errorMonitor->ExpectSuccess();
2133
2134 VkFence fence;
2135 VkFenceCreateInfo fence_create_info{};
2136 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2137 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2138
2139 VkSemaphore semaphore;
2140 VkSemaphoreCreateInfo semaphore_create_info{};
2141 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2142 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2143 &semaphore);
2144
2145 VkCommandPool command_pool;
2146 VkCommandPoolCreateInfo pool_create_info{};
2147 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2148 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2149 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2150 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2151 &command_pool);
2152
2153 VkCommandBuffer command_buffer[2];
2154 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2155 command_buffer_allocate_info.sType =
2156 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2157 command_buffer_allocate_info.commandPool = command_pool;
2158 command_buffer_allocate_info.commandBufferCount = 2;
2159 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2160 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2161 command_buffer);
2162
2163 VkQueue queue = VK_NULL_HANDLE;
2164 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2165 1, &queue);
2166
2167 {
2168 VkCommandBufferBeginInfo begin_info{};
2169 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2170 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2171
2172 vkCmdPipelineBarrier(command_buffer[0],
2173 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2174 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2175 0, nullptr, 0, nullptr);
2176
2177 VkViewport viewport{};
2178 viewport.maxDepth = 1.0f;
2179 viewport.minDepth = 0.0f;
2180 viewport.width = 512;
2181 viewport.height = 512;
2182 viewport.x = 0;
2183 viewport.y = 0;
2184 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2185 vkEndCommandBuffer(command_buffer[0]);
2186 }
2187 {
2188 VkCommandBufferBeginInfo begin_info{};
2189 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2190 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2191
2192 VkViewport viewport{};
2193 viewport.maxDepth = 1.0f;
2194 viewport.minDepth = 0.0f;
2195 viewport.width = 512;
2196 viewport.height = 512;
2197 viewport.x = 0;
2198 viewport.y = 0;
2199 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2200 vkEndCommandBuffer(command_buffer[1]);
2201 }
2202 {
2203 VkSubmitInfo submit_info{};
2204 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2205 submit_info.commandBufferCount = 1;
2206 submit_info.pCommandBuffers = &command_buffer[0];
2207 submit_info.signalSemaphoreCount = 1;
2208 submit_info.pSignalSemaphores = &semaphore;
2209 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2210 }
2211 {
2212 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2213 VkSubmitInfo submit_info{};
2214 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2215 submit_info.commandBufferCount = 1;
2216 submit_info.pCommandBuffers = &command_buffer[1];
2217 submit_info.waitSemaphoreCount = 1;
2218 submit_info.pWaitSemaphores = &semaphore;
2219 submit_info.pWaitDstStageMask = flags;
2220 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2221 }
2222
2223 vkQueueWaitIdle(m_device->m_queue);
2224
2225 vkDestroyFence(m_device->device(), fence, nullptr);
2226 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2227 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2228 &command_buffer[0]);
2229 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2230
2231 m_errorMonitor->VerifyNotFound();
2232}
2233
2234// This is a positive test. No errors should be generated.
2235TEST_F(VkLayerTest,
2236 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
2237
2238 TEST_DESCRIPTION(
2239 "Two command buffers, each in a separate QueueSubmit call "
2240 "submitted on separate queues, the second having a fence"
2241 "followed by two consecutive WaitForFences calls on the same fence.");
2242
Dustin Graves48458142016-04-29 16:11:55 -06002243 if ((m_device->queue_props.empty()) ||
2244 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002245 return;
2246
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002247 m_errorMonitor->ExpectSuccess();
2248
2249 VkFence fence;
2250 VkFenceCreateInfo fence_create_info{};
2251 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2252 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2253
2254 VkSemaphore semaphore;
2255 VkSemaphoreCreateInfo semaphore_create_info{};
2256 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2257 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2258 &semaphore);
2259
2260 VkCommandPool command_pool;
2261 VkCommandPoolCreateInfo pool_create_info{};
2262 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2263 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2264 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2265 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2266 &command_pool);
2267
2268 VkCommandBuffer command_buffer[2];
2269 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2270 command_buffer_allocate_info.sType =
2271 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2272 command_buffer_allocate_info.commandPool = command_pool;
2273 command_buffer_allocate_info.commandBufferCount = 2;
2274 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2275 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2276 command_buffer);
2277
2278 VkQueue queue = VK_NULL_HANDLE;
2279 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2280 1, &queue);
2281
2282 {
2283 VkCommandBufferBeginInfo begin_info{};
2284 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2285 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2286
2287 vkCmdPipelineBarrier(command_buffer[0],
2288 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2289 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2290 0, nullptr, 0, nullptr);
2291
2292 VkViewport viewport{};
2293 viewport.maxDepth = 1.0f;
2294 viewport.minDepth = 0.0f;
2295 viewport.width = 512;
2296 viewport.height = 512;
2297 viewport.x = 0;
2298 viewport.y = 0;
2299 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2300 vkEndCommandBuffer(command_buffer[0]);
2301 }
2302 {
2303 VkCommandBufferBeginInfo begin_info{};
2304 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2305 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2306
2307 VkViewport viewport{};
2308 viewport.maxDepth = 1.0f;
2309 viewport.minDepth = 0.0f;
2310 viewport.width = 512;
2311 viewport.height = 512;
2312 viewport.x = 0;
2313 viewport.y = 0;
2314 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2315 vkEndCommandBuffer(command_buffer[1]);
2316 }
2317 {
2318 VkSubmitInfo submit_info{};
2319 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2320 submit_info.commandBufferCount = 1;
2321 submit_info.pCommandBuffers = &command_buffer[0];
2322 submit_info.signalSemaphoreCount = 1;
2323 submit_info.pSignalSemaphores = &semaphore;
2324 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2325 }
2326 {
2327 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2328 VkSubmitInfo submit_info{};
2329 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2330 submit_info.commandBufferCount = 1;
2331 submit_info.pCommandBuffers = &command_buffer[1];
2332 submit_info.waitSemaphoreCount = 1;
2333 submit_info.pWaitSemaphores = &semaphore;
2334 submit_info.pWaitDstStageMask = flags;
2335 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2336 }
2337
2338 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2339 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2340
2341 vkDestroyFence(m_device->device(), fence, nullptr);
2342 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2343 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2344 &command_buffer[0]);
2345 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2346
2347 m_errorMonitor->VerifyNotFound();
2348}
2349
2350// This is a positive test. No errors should be generated.
2351TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
2352
2353 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2354 "submitted on separate queues, the second having a fence, "
2355 "followed by a WaitForFences call.");
2356
Dustin Graves48458142016-04-29 16:11:55 -06002357 if ((m_device->queue_props.empty()) ||
2358 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002359 return;
2360
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002361 m_errorMonitor->ExpectSuccess();
2362
2363 VkFence fence;
2364 VkFenceCreateInfo fence_create_info{};
2365 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2366 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2367
2368 VkSemaphore semaphore;
2369 VkSemaphoreCreateInfo semaphore_create_info{};
2370 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2371 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2372 &semaphore);
2373
2374 VkCommandPool command_pool;
2375 VkCommandPoolCreateInfo pool_create_info{};
2376 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2377 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2378 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2379 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2380 &command_pool);
2381
2382 VkCommandBuffer command_buffer[2];
2383 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2384 command_buffer_allocate_info.sType =
2385 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2386 command_buffer_allocate_info.commandPool = command_pool;
2387 command_buffer_allocate_info.commandBufferCount = 2;
2388 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2389 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2390 command_buffer);
2391
2392 VkQueue queue = VK_NULL_HANDLE;
2393 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2394 1, &queue);
2395
2396
2397 {
2398 VkCommandBufferBeginInfo begin_info{};
2399 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2400 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2401
2402 vkCmdPipelineBarrier(command_buffer[0],
2403 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2404 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2405 0, nullptr, 0, nullptr);
2406
2407 VkViewport viewport{};
2408 viewport.maxDepth = 1.0f;
2409 viewport.minDepth = 0.0f;
2410 viewport.width = 512;
2411 viewport.height = 512;
2412 viewport.x = 0;
2413 viewport.y = 0;
2414 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2415 vkEndCommandBuffer(command_buffer[0]);
2416 }
2417 {
2418 VkCommandBufferBeginInfo begin_info{};
2419 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2420 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2421
2422 VkViewport viewport{};
2423 viewport.maxDepth = 1.0f;
2424 viewport.minDepth = 0.0f;
2425 viewport.width = 512;
2426 viewport.height = 512;
2427 viewport.x = 0;
2428 viewport.y = 0;
2429 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2430 vkEndCommandBuffer(command_buffer[1]);
2431 }
2432 {
2433 VkSubmitInfo submit_info{};
2434 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2435 submit_info.commandBufferCount = 1;
2436 submit_info.pCommandBuffers = &command_buffer[0];
2437 submit_info.signalSemaphoreCount = 1;
2438 submit_info.pSignalSemaphores = &semaphore;
2439 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2440 }
2441 {
2442 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2443 VkSubmitInfo submit_info{};
2444 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2445 submit_info.commandBufferCount = 1;
2446 submit_info.pCommandBuffers = &command_buffer[1];
2447 submit_info.waitSemaphoreCount = 1;
2448 submit_info.pWaitSemaphores = &semaphore;
2449 submit_info.pWaitDstStageMask = flags;
2450 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2451 }
2452
2453 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2454
2455 vkDestroyFence(m_device->device(), fence, nullptr);
2456 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2457 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2458 &command_buffer[0]);
2459 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2460
2461 m_errorMonitor->VerifyNotFound();
2462}
2463
2464// This is a positive test. No errors should be generated.
2465TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
2466
2467 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2468 "on the same queue, sharing a signal/wait semaphore, the "
2469 "second having a fence, "
2470 "followed by a WaitForFences call.");
2471
2472 m_errorMonitor->ExpectSuccess();
2473
2474 VkFence fence;
2475 VkFenceCreateInfo fence_create_info{};
2476 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2477 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2478
2479 VkSemaphore semaphore;
2480 VkSemaphoreCreateInfo semaphore_create_info{};
2481 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2482 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2483 &semaphore);
2484
2485 VkCommandPool command_pool;
2486 VkCommandPoolCreateInfo pool_create_info{};
2487 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2488 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2489 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2490 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2491 &command_pool);
2492
2493 VkCommandBuffer command_buffer[2];
2494 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2495 command_buffer_allocate_info.sType =
2496 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2497 command_buffer_allocate_info.commandPool = command_pool;
2498 command_buffer_allocate_info.commandBufferCount = 2;
2499 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2500 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2501 command_buffer);
2502
2503 {
2504 VkCommandBufferBeginInfo begin_info{};
2505 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2506 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2507
2508 vkCmdPipelineBarrier(command_buffer[0],
2509 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2510 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2511 0, nullptr, 0, nullptr);
2512
2513 VkViewport viewport{};
2514 viewport.maxDepth = 1.0f;
2515 viewport.minDepth = 0.0f;
2516 viewport.width = 512;
2517 viewport.height = 512;
2518 viewport.x = 0;
2519 viewport.y = 0;
2520 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2521 vkEndCommandBuffer(command_buffer[0]);
2522 }
2523 {
2524 VkCommandBufferBeginInfo begin_info{};
2525 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2526 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2527
2528 VkViewport viewport{};
2529 viewport.maxDepth = 1.0f;
2530 viewport.minDepth = 0.0f;
2531 viewport.width = 512;
2532 viewport.height = 512;
2533 viewport.x = 0;
2534 viewport.y = 0;
2535 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2536 vkEndCommandBuffer(command_buffer[1]);
2537 }
2538 {
2539 VkSubmitInfo submit_info{};
2540 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2541 submit_info.commandBufferCount = 1;
2542 submit_info.pCommandBuffers = &command_buffer[0];
2543 submit_info.signalSemaphoreCount = 1;
2544 submit_info.pSignalSemaphores = &semaphore;
2545 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2546 }
2547 {
2548 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2549 VkSubmitInfo submit_info{};
2550 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2551 submit_info.commandBufferCount = 1;
2552 submit_info.pCommandBuffers = &command_buffer[1];
2553 submit_info.waitSemaphoreCount = 1;
2554 submit_info.pWaitSemaphores = &semaphore;
2555 submit_info.pWaitDstStageMask = flags;
2556 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2557 }
2558
2559 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2560
2561 vkDestroyFence(m_device->device(), fence, nullptr);
2562 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2563 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2564 &command_buffer[0]);
2565 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2566
2567 m_errorMonitor->VerifyNotFound();
2568}
2569
2570// This is a positive test. No errors should be generated.
2571TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
2572
2573 TEST_DESCRIPTION(
2574 "Two command buffers, each in a separate QueueSubmit call "
2575 "on the same queue, no fences, followed by a third QueueSubmit with NO "
2576 "SubmitInfos but with a fence, followed by a WaitForFences call.");
2577
2578 m_errorMonitor->ExpectSuccess();
2579
2580 VkFence fence;
2581 VkFenceCreateInfo fence_create_info{};
2582 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2583 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2584
2585 VkCommandPool command_pool;
2586 VkCommandPoolCreateInfo pool_create_info{};
2587 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2588 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2589 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2590 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2591 &command_pool);
2592
2593 VkCommandBuffer command_buffer[2];
2594 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2595 command_buffer_allocate_info.sType =
2596 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2597 command_buffer_allocate_info.commandPool = command_pool;
2598 command_buffer_allocate_info.commandBufferCount = 2;
2599 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2600 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2601 command_buffer);
2602
2603 {
2604 VkCommandBufferBeginInfo begin_info{};
2605 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2606 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2607
2608 vkCmdPipelineBarrier(command_buffer[0],
2609 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2610 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2611 0, nullptr, 0, nullptr);
2612
2613 VkViewport viewport{};
2614 viewport.maxDepth = 1.0f;
2615 viewport.minDepth = 0.0f;
2616 viewport.width = 512;
2617 viewport.height = 512;
2618 viewport.x = 0;
2619 viewport.y = 0;
2620 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2621 vkEndCommandBuffer(command_buffer[0]);
2622 }
2623 {
2624 VkCommandBufferBeginInfo begin_info{};
2625 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2626 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2627
2628 VkViewport viewport{};
2629 viewport.maxDepth = 1.0f;
2630 viewport.minDepth = 0.0f;
2631 viewport.width = 512;
2632 viewport.height = 512;
2633 viewport.x = 0;
2634 viewport.y = 0;
2635 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2636 vkEndCommandBuffer(command_buffer[1]);
2637 }
2638 {
2639 VkSubmitInfo submit_info{};
2640 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2641 submit_info.commandBufferCount = 1;
2642 submit_info.pCommandBuffers = &command_buffer[0];
2643 submit_info.signalSemaphoreCount = 0;
2644 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2645 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2646 }
2647 {
2648 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2649 VkSubmitInfo submit_info{};
2650 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2651 submit_info.commandBufferCount = 1;
2652 submit_info.pCommandBuffers = &command_buffer[1];
2653 submit_info.waitSemaphoreCount = 0;
2654 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2655 submit_info.pWaitDstStageMask = flags;
2656 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2657 }
2658
2659 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
2660
2661 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2662
2663 vkDestroyFence(m_device->device(), fence, nullptr);
2664 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2665 &command_buffer[0]);
2666 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2667
2668 m_errorMonitor->VerifyNotFound();
2669}
2670
2671// This is a positive test. No errors should be generated.
2672TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
2673
2674 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2675 "on the same queue, the second having a fence, followed "
2676 "by a WaitForFences call.");
2677
2678 m_errorMonitor->ExpectSuccess();
2679
2680 VkFence fence;
2681 VkFenceCreateInfo fence_create_info{};
2682 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2683 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2684
2685 VkCommandPool command_pool;
2686 VkCommandPoolCreateInfo pool_create_info{};
2687 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2688 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2689 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2690 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2691 &command_pool);
2692
2693 VkCommandBuffer command_buffer[2];
2694 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2695 command_buffer_allocate_info.sType =
2696 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2697 command_buffer_allocate_info.commandPool = command_pool;
2698 command_buffer_allocate_info.commandBufferCount = 2;
2699 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2700 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2701 command_buffer);
2702
2703 {
2704 VkCommandBufferBeginInfo begin_info{};
2705 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2706 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2707
2708 vkCmdPipelineBarrier(command_buffer[0],
2709 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2710 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2711 0, nullptr, 0, nullptr);
2712
2713 VkViewport viewport{};
2714 viewport.maxDepth = 1.0f;
2715 viewport.minDepth = 0.0f;
2716 viewport.width = 512;
2717 viewport.height = 512;
2718 viewport.x = 0;
2719 viewport.y = 0;
2720 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2721 vkEndCommandBuffer(command_buffer[0]);
2722 }
2723 {
2724 VkCommandBufferBeginInfo begin_info{};
2725 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2726 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2727
2728 VkViewport viewport{};
2729 viewport.maxDepth = 1.0f;
2730 viewport.minDepth = 0.0f;
2731 viewport.width = 512;
2732 viewport.height = 512;
2733 viewport.x = 0;
2734 viewport.y = 0;
2735 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2736 vkEndCommandBuffer(command_buffer[1]);
2737 }
2738 {
2739 VkSubmitInfo submit_info{};
2740 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2741 submit_info.commandBufferCount = 1;
2742 submit_info.pCommandBuffers = &command_buffer[0];
2743 submit_info.signalSemaphoreCount = 0;
2744 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2745 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2746 }
2747 {
2748 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2749 VkSubmitInfo submit_info{};
2750 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2751 submit_info.commandBufferCount = 1;
2752 submit_info.pCommandBuffers = &command_buffer[1];
2753 submit_info.waitSemaphoreCount = 0;
2754 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2755 submit_info.pWaitDstStageMask = flags;
2756 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2757 }
2758
2759 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2760
2761 vkDestroyFence(m_device->device(), fence, nullptr);
2762 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2763 &command_buffer[0]);
2764 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2765
2766 m_errorMonitor->VerifyNotFound();
2767}
2768
2769// This is a positive test. No errors should be generated.
2770TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
2771
2772 TEST_DESCRIPTION(
2773 "Two command buffers each in a separate SubmitInfo sent in a single "
2774 "QueueSubmit call followed by a WaitForFences call.");
2775
2776 m_errorMonitor->ExpectSuccess();
2777
2778 VkFence fence;
2779 VkFenceCreateInfo fence_create_info{};
2780 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2781 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2782
2783 VkSemaphore semaphore;
2784 VkSemaphoreCreateInfo semaphore_create_info{};
2785 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2786 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2787 &semaphore);
2788
2789 VkCommandPool command_pool;
2790 VkCommandPoolCreateInfo pool_create_info{};
2791 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2792 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2793 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2794 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2795 &command_pool);
2796
2797 VkCommandBuffer command_buffer[2];
2798 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2799 command_buffer_allocate_info.sType =
2800 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2801 command_buffer_allocate_info.commandPool = command_pool;
2802 command_buffer_allocate_info.commandBufferCount = 2;
2803 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2804 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2805 command_buffer);
2806
2807 {
2808 VkCommandBufferBeginInfo begin_info{};
2809 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2810 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2811
2812 vkCmdPipelineBarrier(command_buffer[0],
2813 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2814 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2815 0, nullptr, 0, nullptr);
2816
2817 VkViewport viewport{};
2818 viewport.maxDepth = 1.0f;
2819 viewport.minDepth = 0.0f;
2820 viewport.width = 512;
2821 viewport.height = 512;
2822 viewport.x = 0;
2823 viewport.y = 0;
2824 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2825 vkEndCommandBuffer(command_buffer[0]);
2826 }
2827 {
2828 VkCommandBufferBeginInfo begin_info{};
2829 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2830 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2831
2832 VkViewport viewport{};
2833 viewport.maxDepth = 1.0f;
2834 viewport.minDepth = 0.0f;
2835 viewport.width = 512;
2836 viewport.height = 512;
2837 viewport.x = 0;
2838 viewport.y = 0;
2839 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2840 vkEndCommandBuffer(command_buffer[1]);
2841 }
2842 {
2843 VkSubmitInfo submit_info[2];
2844 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2845
2846 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2847 submit_info[0].pNext = NULL;
2848 submit_info[0].commandBufferCount = 1;
2849 submit_info[0].pCommandBuffers = &command_buffer[0];
2850 submit_info[0].signalSemaphoreCount = 1;
2851 submit_info[0].pSignalSemaphores = &semaphore;
2852 submit_info[0].waitSemaphoreCount = 0;
2853 submit_info[0].pWaitSemaphores = NULL;
2854 submit_info[0].pWaitDstStageMask = 0;
2855
2856 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2857 submit_info[1].pNext = NULL;
2858 submit_info[1].commandBufferCount = 1;
2859 submit_info[1].pCommandBuffers = &command_buffer[1];
2860 submit_info[1].waitSemaphoreCount = 1;
2861 submit_info[1].pWaitSemaphores = &semaphore;
2862 submit_info[1].pWaitDstStageMask = flags;
2863 submit_info[1].signalSemaphoreCount = 0;
2864 submit_info[1].pSignalSemaphores = NULL;
2865 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
2866 }
2867
2868 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2869
2870 vkDestroyFence(m_device->device(), fence, nullptr);
2871 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2872 &command_buffer[0]);
2873 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2874
2875 m_errorMonitor->VerifyNotFound();
2876}
2877
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002878TEST_F(VkLayerTest, DynamicStatesNotBound) {
2879 TEST_DESCRIPTION(
2880 "Run a series of simple draw calls to validate all the different "
2881 "failure cases that can occur when dynamic state is required but not "
2882 "correctly bound."
2883 "Here are the different dynamic state cases verified by this test:\n"
2884 "-Line Width\n-Depth Bias\n-Viewport State\n-Scissor State\n-Blend "
2885 "State\n-Depth Bounds\n-Stencil Read Mask\n-Stencil Write "
2886 "Mask\n-Stencil Reference");
2887
2888 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07002889 m_errorMonitor->SetDesiredFailureMsg(
2890 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002891 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002892 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2893 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002894 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002895 // Dynamic depth bias
Karl Schultz6addd812016-02-02 17:17:23 -07002896 m_errorMonitor->SetDesiredFailureMsg(
2897 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002898 "Dynamic depth bias state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002899 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2900 BsoFailDepthBias);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002901 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002902 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07002903 m_errorMonitor->SetDesiredFailureMsg(
2904 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002905 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002906 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2907 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002908 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002909 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07002910 m_errorMonitor->SetDesiredFailureMsg(
2911 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002912 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002913 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2914 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002915 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002916 // Dynamic blend state
Karl Schultz6addd812016-02-02 17:17:23 -07002917 m_errorMonitor->SetDesiredFailureMsg(
2918 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002919 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002920 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2921 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002922 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002923 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07002924 m_errorMonitor->SetDesiredFailureMsg(
2925 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002926 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002927 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2928 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002929 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002930 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07002931 m_errorMonitor->SetDesiredFailureMsg(
2932 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002933 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002934 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2935 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002936 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002937 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07002938 m_errorMonitor->SetDesiredFailureMsg(
2939 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002940 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002941 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2942 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002943 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002944}
2945
Karl Schultz6addd812016-02-02 17:17:23 -07002946TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002947 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002948
Karl Schultz6addd812016-02-02 17:17:23 -07002949 m_errorMonitor->SetDesiredFailureMsg(
2950 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2951 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
2952 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002953
2954 VkFenceCreateInfo fenceInfo = {};
2955 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2956 fenceInfo.pNext = NULL;
2957 fenceInfo.flags = 0;
2958
2959 ASSERT_NO_FATAL_FAILURE(InitState());
2960 ASSERT_NO_FATAL_FAILURE(InitViewport());
2961 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2962
Karl Schultz6addd812016-02-02 17:17:23 -07002963 // We luck out b/c by default the framework creates CB w/ the
2964 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002965 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002966 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2967 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002968 EndCommandBuffer();
2969
2970 testFence.init(*m_device, fenceInfo);
2971
2972 // Bypass framework since it does the waits automatically
2973 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002974 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002975 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2976 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002977 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002978 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002979 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002980 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002981 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002982 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002983 submit_info.pSignalSemaphores = NULL;
2984
Karl Schultz6addd812016-02-02 17:17:23 -07002985 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
2986 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002987
Karl Schultz6addd812016-02-02 17:17:23 -07002988 // Cause validation error by re-submitting cmd buffer that should only be
2989 // submitted once
2990 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002991
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002992 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002993}
2994
Karl Schultz6addd812016-02-02 17:17:23 -07002995TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002996 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07002997 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002998
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003000 "Unable to allocate 1 descriptors of "
3001 "type "
3002 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003003
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003004 ASSERT_NO_FATAL_FAILURE(InitState());
3005 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003006
Karl Schultz6addd812016-02-02 17:17:23 -07003007 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
3008 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003009 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003010 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3011 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003012
3013 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003014 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3015 ds_pool_ci.pNext = NULL;
3016 ds_pool_ci.flags = 0;
3017 ds_pool_ci.maxSets = 1;
3018 ds_pool_ci.poolSizeCount = 1;
3019 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003020
3021 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003022 err =
3023 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003024 ASSERT_VK_SUCCESS(err);
3025
3026 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003027 dsl_binding.binding = 0;
3028 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3029 dsl_binding.descriptorCount = 1;
3030 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3031 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003032
3033 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003034 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3035 ds_layout_ci.pNext = NULL;
3036 ds_layout_ci.bindingCount = 1;
3037 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003038
3039 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003040 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3041 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003042 ASSERT_VK_SUCCESS(err);
3043
3044 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003045 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003046 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003047 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003048 alloc_info.descriptorPool = ds_pool;
3049 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003050 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3051 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003052
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003053 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003054
Chia-I Wuf7458c52015-10-26 21:10:41 +08003055 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3056 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003057}
3058
Karl Schultz6addd812016-02-02 17:17:23 -07003059TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
3060 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06003061
Karl Schultz6addd812016-02-02 17:17:23 -07003062 m_errorMonitor->SetDesiredFailureMsg(
3063 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3064 "It is invalid to call vkFreeDescriptorSets() with a pool created "
3065 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003066
Tobin Ehlise735c692015-10-08 13:13:50 -06003067 ASSERT_NO_FATAL_FAILURE(InitState());
3068 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06003069
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003070 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003071 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3072 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06003073
3074 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003075 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3076 ds_pool_ci.pNext = NULL;
3077 ds_pool_ci.maxSets = 1;
3078 ds_pool_ci.poolSizeCount = 1;
3079 ds_pool_ci.flags = 0;
3080 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
3081 // app can only call vkResetDescriptorPool on this pool.;
3082 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06003083
3084 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003085 err =
3086 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06003087 ASSERT_VK_SUCCESS(err);
3088
3089 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 Ehlise735c692015-10-08 13:13:50 -06003095
3096 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 Ehlise735c692015-10-08 13:13:50 -06003101
3102 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003103 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3104 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06003105 ASSERT_VK_SUCCESS(err);
3106
3107 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003108 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003109 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003110 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003111 alloc_info.descriptorPool = ds_pool;
3112 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003113 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3114 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06003115 ASSERT_VK_SUCCESS(err);
3116
3117 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003118 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06003119
Chia-I Wuf7458c52015-10-26 21:10:41 +08003120 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3121 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06003122}
3123
Karl Schultz6addd812016-02-02 17:17:23 -07003124TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003125 // Attempt to clear Descriptor Pool with bad object.
3126 // ObjectTracker should catch this.
3127 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3128 "Invalid VkDescriptorPool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003129 uint64_t fake_pool_handle = 0xbaad6001;
3130 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
3131 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06003132 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003133}
3134
Karl Schultz6addd812016-02-02 17:17:23 -07003135TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003136 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
3137 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003138 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06003139 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003140
3141 uint64_t fake_set_handle = 0xbaad6001;
3142 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003143 VkResult err;
3144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3145 "Invalid VkDescriptorSet Object 0xbaad6001");
3146
3147 ASSERT_NO_FATAL_FAILURE(InitState());
3148
3149 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
3150 layout_bindings[0].binding = 0;
3151 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3152 layout_bindings[0].descriptorCount = 1;
3153 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3154 layout_bindings[0].pImmutableSamplers = NULL;
3155
3156 VkDescriptorSetLayout descriptor_set_layout;
3157 VkDescriptorSetLayoutCreateInfo dslci = {};
3158 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3159 dslci.pNext = NULL;
3160 dslci.bindingCount = 1;
3161 dslci.pBindings = layout_bindings;
3162 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003163 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003164
3165 VkPipelineLayout pipeline_layout;
3166 VkPipelineLayoutCreateInfo plci = {};
3167 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3168 plci.pNext = NULL;
3169 plci.setLayoutCount = 1;
3170 plci.pSetLayouts = &descriptor_set_layout;
3171 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003172 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003173
3174 BeginCommandBuffer();
3175 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003176 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06003177 m_errorMonitor->VerifyFound();
3178 EndCommandBuffer();
3179 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
3180 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003181}
3182
Karl Schultz6addd812016-02-02 17:17:23 -07003183TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003184 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
3185 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003186 uint64_t fake_layout_handle = 0xbaad6001;
3187 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3189 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
3190
3191 VkPipelineLayout pipeline_layout;
3192 VkPipelineLayoutCreateInfo plci = {};
3193 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3194 plci.pNext = NULL;
3195 plci.setLayoutCount = 1;
3196 plci.pSetLayouts = &bad_layout;
3197 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
3198
3199 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003200}
3201
Karl Schultz6addd812016-02-02 17:17:23 -07003202TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003203 // Attempt to bind an invalid Pipeline to a valid Command Buffer
3204 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003205 // Create a valid cmd buffer
3206 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003207 uint64_t fake_pipeline_handle = 0xbaad6001;
3208 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3210 "Invalid VkPipeline Object 0xbaad6001");
3211 ASSERT_NO_FATAL_FAILURE(InitState());
3212 BeginCommandBuffer();
3213 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3214 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
3215 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06003216
3217 // Now issue a draw call with no pipeline bound
3218 m_errorMonitor->SetDesiredFailureMsg(
3219 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3220 "At Draw/Dispatch time no valid VkPipeline is bound!");
3221 ASSERT_NO_FATAL_FAILURE(InitState());
3222 BeginCommandBuffer();
3223 Draw(1, 0, 0, 0);
3224 m_errorMonitor->VerifyFound();
3225 // Finally same check once more but with Dispatch/Compute
3226 m_errorMonitor->SetDesiredFailureMsg(
3227 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3228 "At Draw/Dispatch time no valid VkPipeline is bound!");
3229 ASSERT_NO_FATAL_FAILURE(InitState());
3230 BeginCommandBuffer();
3231 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
3232 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003233}
3234
Karl Schultz6addd812016-02-02 17:17:23 -07003235TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
3236 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
3237 // CommandBuffer
3238 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003239
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003241 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003242
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003243 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06003244 ASSERT_NO_FATAL_FAILURE(InitViewport());
3245 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003246 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003247 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3248 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003249
3250 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003251 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3252 ds_pool_ci.pNext = NULL;
3253 ds_pool_ci.maxSets = 1;
3254 ds_pool_ci.poolSizeCount = 1;
3255 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06003256
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003257 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003258 err =
3259 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003260 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003261
Tony Barboureb254902015-07-15 12:50:33 -06003262 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003263 dsl_binding.binding = 0;
3264 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3265 dsl_binding.descriptorCount = 1;
3266 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3267 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003268
Tony Barboureb254902015-07-15 12:50:33 -06003269 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003270 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3271 ds_layout_ci.pNext = NULL;
3272 ds_layout_ci.bindingCount = 1;
3273 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003274 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003275 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3276 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003277 ASSERT_VK_SUCCESS(err);
3278
3279 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003280 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003281 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003282 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003283 alloc_info.descriptorPool = ds_pool;
3284 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003285 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3286 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003287 ASSERT_VK_SUCCESS(err);
3288
Tony Barboureb254902015-07-15 12:50:33 -06003289 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003290 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3291 pipeline_layout_ci.pNext = NULL;
3292 pipeline_layout_ci.setLayoutCount = 1;
3293 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003294
3295 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003296 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3297 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003298 ASSERT_VK_SUCCESS(err);
3299
Karl Schultz6addd812016-02-02 17:17:23 -07003300 VkShaderObj vs(m_device, bindStateVertShaderText,
3301 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06003302 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07003303 // on more devices
3304 VkShaderObj fs(m_device, bindStateFragShaderText,
3305 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003306
Tony Barbourc95e4ac2015-08-04 17:05:26 -06003307 VkPipelineObj pipe(m_device);
3308 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06003309 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06003310 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06003311 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06003312
3313 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003314 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3315 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3316 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3317 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3318 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003319
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003320 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003321
Chia-I Wuf7458c52015-10-26 21:10:41 +08003322 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3323 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3324 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003325}
3326
Karl Schultz6addd812016-02-02 17:17:23 -07003327TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003328 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07003329 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003330
Karl Schultz6addd812016-02-02 17:17:23 -07003331 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003332 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
3333 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003334
3335 ASSERT_NO_FATAL_FAILURE(InitState());
3336 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003337 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3338 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003339
3340 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003341 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3342 ds_pool_ci.pNext = NULL;
3343 ds_pool_ci.maxSets = 1;
3344 ds_pool_ci.poolSizeCount = 1;
3345 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003346
3347 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003348 err =
3349 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003350 ASSERT_VK_SUCCESS(err);
3351
3352 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003353 dsl_binding.binding = 0;
3354 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3355 dsl_binding.descriptorCount = 1;
3356 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3357 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003358
3359 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003360 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3361 ds_layout_ci.pNext = NULL;
3362 ds_layout_ci.bindingCount = 1;
3363 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003364 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003365 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3366 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003367 ASSERT_VK_SUCCESS(err);
3368
3369 VkDescriptorSet descriptorSet;
3370 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003371 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003372 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003373 alloc_info.descriptorPool = ds_pool;
3374 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003375 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3376 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003377 ASSERT_VK_SUCCESS(err);
3378
Karl Schultz6addd812016-02-02 17:17:23 -07003379 VkBufferView view =
3380 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003381 VkWriteDescriptorSet descriptor_write;
3382 memset(&descriptor_write, 0, sizeof(descriptor_write));
3383 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3384 descriptor_write.dstSet = descriptorSet;
3385 descriptor_write.dstBinding = 0;
3386 descriptor_write.descriptorCount = 1;
3387 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3388 descriptor_write.pTexelBufferView = &view;
3389
3390 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3391
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003392 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003393
3394 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3395 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3396}
3397
Karl Schultz6addd812016-02-02 17:17:23 -07003398TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
3399 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
3400 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07003401 // 1. No dynamicOffset supplied
3402 // 2. Too many dynamicOffsets supplied
3403 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07003404 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003406 " requires 1 dynamicOffsets, but only "
3407 "0 dynamicOffsets are left in "
3408 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003409
3410 ASSERT_NO_FATAL_FAILURE(InitState());
3411 ASSERT_NO_FATAL_FAILURE(InitViewport());
3412 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3413
3414 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003415 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3416 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003417
3418 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003419 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3420 ds_pool_ci.pNext = NULL;
3421 ds_pool_ci.maxSets = 1;
3422 ds_pool_ci.poolSizeCount = 1;
3423 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003424
3425 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003426 err =
3427 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003428 ASSERT_VK_SUCCESS(err);
3429
3430 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003431 dsl_binding.binding = 0;
3432 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3433 dsl_binding.descriptorCount = 1;
3434 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3435 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003436
3437 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003438 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3439 ds_layout_ci.pNext = NULL;
3440 ds_layout_ci.bindingCount = 1;
3441 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003442 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003443 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3444 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003445 ASSERT_VK_SUCCESS(err);
3446
3447 VkDescriptorSet descriptorSet;
3448 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003449 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003450 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003451 alloc_info.descriptorPool = ds_pool;
3452 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003453 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3454 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003455 ASSERT_VK_SUCCESS(err);
3456
3457 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003458 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3459 pipeline_layout_ci.pNext = NULL;
3460 pipeline_layout_ci.setLayoutCount = 1;
3461 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003462
3463 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003464 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3465 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003466 ASSERT_VK_SUCCESS(err);
3467
3468 // Create a buffer to update the descriptor with
3469 uint32_t qfi = 0;
3470 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003471 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3472 buffCI.size = 1024;
3473 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3474 buffCI.queueFamilyIndexCount = 1;
3475 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003476
3477 VkBuffer dyub;
3478 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3479 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003480 // Allocate memory and bind to buffer so we can make it to the appropriate
3481 // error
3482 VkMemoryAllocateInfo mem_alloc = {};
3483 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3484 mem_alloc.pNext = NULL;
3485 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12003486 mem_alloc.memoryTypeIndex = 0;
3487
3488 VkMemoryRequirements memReqs;
3489 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
3490 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
3491 0);
3492 if (!pass) {
3493 vkDestroyBuffer(m_device->device(), dyub, NULL);
3494 return;
3495 }
3496
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003497 VkDeviceMemory mem;
3498 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3499 ASSERT_VK_SUCCESS(err);
3500 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
3501 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003502 // Correctly update descriptor to avoid "NOT_UPDATED" error
3503 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003504 buffInfo.buffer = dyub;
3505 buffInfo.offset = 0;
3506 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003507
3508 VkWriteDescriptorSet descriptor_write;
3509 memset(&descriptor_write, 0, sizeof(descriptor_write));
3510 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3511 descriptor_write.dstSet = descriptorSet;
3512 descriptor_write.dstBinding = 0;
3513 descriptor_write.descriptorCount = 1;
3514 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3515 descriptor_write.pBufferInfo = &buffInfo;
3516
3517 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3518
3519 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003520 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3521 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3522 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003523 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003524 uint32_t pDynOff[2] = {512, 756};
3525 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07003526 m_errorMonitor->SetDesiredFailureMsg(
3527 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07003528 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07003529 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3530 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3531 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12003532 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003533 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3535 " dynamic offset 512 combined with "
3536 "offset 0 and range 1024 that "
3537 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07003538 // Create PSO to be used for draw-time errors below
3539 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003540 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003541 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003542 "out gl_PerVertex { \n"
3543 " vec4 gl_Position;\n"
3544 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003545 "void main(){\n"
3546 " gl_Position = vec4(1);\n"
3547 "}\n";
3548 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003549 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003550 "\n"
3551 "layout(location=0) out vec4 x;\n"
3552 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3553 "void main(){\n"
3554 " x = vec4(bar.y);\n"
3555 "}\n";
3556 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3557 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3558 VkPipelineObj pipe(m_device);
3559 pipe.AddShader(&vs);
3560 pipe.AddShader(&fs);
3561 pipe.AddColorAttachment();
3562 pipe.CreateVKPipeline(pipeline_layout, renderPass());
3563
Karl Schultz6addd812016-02-02 17:17:23 -07003564 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3565 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3566 // This update should succeed, but offset size of 512 will overstep buffer
3567 // /w range 1024 & size 1024
3568 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3569 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3570 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07003571 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003572 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003573
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003574 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06003575 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003576
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003577 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3578 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3579}
3580
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003581TEST_F(VkLayerTest, InvalidPushConstants) {
3582 // Hit push constant error cases:
3583 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
3584 // 2. Incorrectly set push constant size to 0
3585 // 3. Incorrectly set push constant size to non-multiple of 4
3586 // 4. Attempt push constant update that exceeds maxPushConstantSize
3587 VkResult err;
3588 m_errorMonitor->SetDesiredFailureMsg(
3589 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3590 "vkCreatePipelineLayout() call has push constants with offset ");
3591
3592 ASSERT_NO_FATAL_FAILURE(InitState());
3593 ASSERT_NO_FATAL_FAILURE(InitViewport());
3594 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3595
3596 VkPushConstantRange pc_range = {};
3597 pc_range.size = 0xFFFFFFFFu;
3598 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3599 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3600 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3601 pipeline_layout_ci.pushConstantRangeCount = 1;
3602 pipeline_layout_ci.pPushConstantRanges = &pc_range;
3603
3604 VkPipelineLayout pipeline_layout;
3605 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3606 &pipeline_layout);
3607
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003608 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003609 // Now cause errors due to size 0 and non-4 byte aligned size
3610 pc_range.size = 0;
3611 m_errorMonitor->SetDesiredFailureMsg(
3612 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3613 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
3614 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3615 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003616 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003617 pc_range.size = 1;
3618 m_errorMonitor->SetDesiredFailureMsg(
3619 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3620 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
3621 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3622 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003623 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003624 // Cause error due to bad size in vkCmdPushConstants() call
3625 m_errorMonitor->SetDesiredFailureMsg(
3626 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3627 "vkCmdPushConstants() call has push constants with offset ");
3628 pipeline_layout_ci.pushConstantRangeCount = 0;
3629 pipeline_layout_ci.pPushConstantRanges = NULL;
3630 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3631 &pipeline_layout);
3632 ASSERT_VK_SUCCESS(err);
3633 BeginCommandBuffer();
3634 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
3635 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003636 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003637 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3638}
3639
Karl Schultz6addd812016-02-02 17:17:23 -07003640TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003641 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07003642 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003643
3644 ASSERT_NO_FATAL_FAILURE(InitState());
3645 ASSERT_NO_FATAL_FAILURE(InitViewport());
3646 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3647
3648 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
3649 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003650 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3651 ds_type_count[0].descriptorCount = 10;
3652 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3653 ds_type_count[1].descriptorCount = 2;
3654 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3655 ds_type_count[2].descriptorCount = 2;
3656 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
3657 ds_type_count[3].descriptorCount = 5;
3658 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
3659 // type
3660 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3661 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
3662 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003663
3664 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003665 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3666 ds_pool_ci.pNext = NULL;
3667 ds_pool_ci.maxSets = 5;
3668 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
3669 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003670
3671 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003672 err =
3673 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003674 ASSERT_VK_SUCCESS(err);
3675
3676 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
3677 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003678 dsl_binding[0].binding = 0;
3679 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3680 dsl_binding[0].descriptorCount = 5;
3681 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3682 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003683
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003684 // Create layout identical to set0 layout but w/ different stageFlags
3685 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003686 dsl_fs_stage_only.binding = 0;
3687 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3688 dsl_fs_stage_only.descriptorCount = 5;
3689 dsl_fs_stage_only.stageFlags =
3690 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
3691 // bind time
3692 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003693 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003694 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3695 ds_layout_ci.pNext = NULL;
3696 ds_layout_ci.bindingCount = 1;
3697 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003698 static const uint32_t NUM_LAYOUTS = 4;
3699 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003700 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003701 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
3702 // layout for error case
3703 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3704 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003705 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003706 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003707 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3708 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003709 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003710 dsl_binding[0].binding = 0;
3711 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003712 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003713 dsl_binding[1].binding = 1;
3714 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3715 dsl_binding[1].descriptorCount = 2;
3716 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
3717 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003718 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003719 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003720 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3721 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003722 ASSERT_VK_SUCCESS(err);
3723 dsl_binding[0].binding = 0;
3724 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003725 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003726 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07003727 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3728 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003729 ASSERT_VK_SUCCESS(err);
3730 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003731 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003732 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3733 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003734 ASSERT_VK_SUCCESS(err);
3735
3736 static const uint32_t NUM_SETS = 4;
3737 VkDescriptorSet descriptorSet[NUM_SETS] = {};
3738 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003739 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003740 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003741 alloc_info.descriptorPool = ds_pool;
3742 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003743 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3744 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003745 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003746 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003747 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003748 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003749 err =
3750 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003751 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003752
3753 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003754 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3755 pipeline_layout_ci.pNext = NULL;
3756 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
3757 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003758
3759 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003760 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3761 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003762 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003763 // Create pipelineLayout with only one setLayout
3764 pipeline_layout_ci.setLayoutCount = 1;
3765 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003766 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3767 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003768 ASSERT_VK_SUCCESS(err);
3769 // Create pipelineLayout with 2 descriptor setLayout at index 0
3770 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
3771 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07003772 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3773 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003774 ASSERT_VK_SUCCESS(err);
3775 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
3776 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
3777 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07003778 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3779 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003780 ASSERT_VK_SUCCESS(err);
3781 // Create pipelineLayout with UB type, but stageFlags for FS only
3782 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
3783 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003784 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3785 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003786 ASSERT_VK_SUCCESS(err);
3787 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
3788 VkDescriptorSetLayout pl_bad_s0[2] = {};
3789 pl_bad_s0[0] = ds_layout_fs_only;
3790 pl_bad_s0[1] = ds_layout[1];
3791 pipeline_layout_ci.setLayoutCount = 2;
3792 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
3793 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07003794 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3795 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003796 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003797
3798 // Create a buffer to update the descriptor with
3799 uint32_t qfi = 0;
3800 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003801 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3802 buffCI.size = 1024;
3803 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3804 buffCI.queueFamilyIndexCount = 1;
3805 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003806
3807 VkBuffer dyub;
3808 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3809 ASSERT_VK_SUCCESS(err);
3810 // Correctly update descriptor to avoid "NOT_UPDATED" error
3811 static const uint32_t NUM_BUFFS = 5;
3812 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003813 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003814 buffInfo[i].buffer = dyub;
3815 buffInfo[i].offset = 0;
3816 buffInfo[i].range = 1024;
3817 }
Karl Schultz6addd812016-02-02 17:17:23 -07003818 VkImage image;
3819 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3820 const int32_t tex_width = 32;
3821 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003822 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003823 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3824 image_create_info.pNext = NULL;
3825 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3826 image_create_info.format = tex_format;
3827 image_create_info.extent.width = tex_width;
3828 image_create_info.extent.height = tex_height;
3829 image_create_info.extent.depth = 1;
3830 image_create_info.mipLevels = 1;
3831 image_create_info.arrayLayers = 1;
3832 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3833 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3834 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3835 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003836 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3837 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003838
Karl Schultz6addd812016-02-02 17:17:23 -07003839 VkMemoryRequirements memReqs;
3840 VkDeviceMemory imageMem;
3841 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003842 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003843 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3844 memAlloc.pNext = NULL;
3845 memAlloc.allocationSize = 0;
3846 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003847 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
3848 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003849 pass =
3850 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003851 ASSERT_TRUE(pass);
3852 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
3853 ASSERT_VK_SUCCESS(err);
3854 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
3855 ASSERT_VK_SUCCESS(err);
3856
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003857 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003858 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3859 image_view_create_info.image = image;
3860 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
3861 image_view_create_info.format = tex_format;
3862 image_view_create_info.subresourceRange.layerCount = 1;
3863 image_view_create_info.subresourceRange.baseMipLevel = 0;
3864 image_view_create_info.subresourceRange.levelCount = 1;
3865 image_view_create_info.subresourceRange.aspectMask =
3866 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003867
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003868 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07003869 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
3870 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003871 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003872 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003873 imageInfo[0].imageView = view;
3874 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3875 imageInfo[1].imageView = view;
3876 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003877 imageInfo[2].imageView = view;
3878 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3879 imageInfo[3].imageView = view;
3880 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003881
3882 static const uint32_t NUM_SET_UPDATES = 3;
3883 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
3884 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3885 descriptor_write[0].dstSet = descriptorSet[0];
3886 descriptor_write[0].dstBinding = 0;
3887 descriptor_write[0].descriptorCount = 5;
3888 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3889 descriptor_write[0].pBufferInfo = buffInfo;
3890 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3891 descriptor_write[1].dstSet = descriptorSet[1];
3892 descriptor_write[1].dstBinding = 0;
3893 descriptor_write[1].descriptorCount = 2;
3894 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3895 descriptor_write[1].pImageInfo = imageInfo;
3896 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3897 descriptor_write[2].dstSet = descriptorSet[1];
3898 descriptor_write[2].dstBinding = 1;
3899 descriptor_write[2].descriptorCount = 2;
3900 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003901 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003902
3903 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003904
Tobin Ehlis88452832015-12-03 09:40:56 -07003905 // Create PSO to be used for draw-time errors below
3906 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003907 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003908 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003909 "out gl_PerVertex {\n"
3910 " vec4 gl_Position;\n"
3911 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003912 "void main(){\n"
3913 " gl_Position = vec4(1);\n"
3914 "}\n";
3915 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003916 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003917 "\n"
3918 "layout(location=0) out vec4 x;\n"
3919 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3920 "void main(){\n"
3921 " x = vec4(bar.y);\n"
3922 "}\n";
3923 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3924 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003925 VkPipelineObj pipe(m_device);
3926 pipe.AddShader(&vs);
3927 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07003928 pipe.AddColorAttachment();
3929 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07003930
3931 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07003932
Karl Schultz6addd812016-02-02 17:17:23 -07003933 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3934 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3935 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
3936 // of PSO
3937 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
3938 // cmd_pipeline.c
3939 // due to the fact that cmd_alloc_dset_data() has not been called in
3940 // cmd_bind_graphics_pipeline()
3941 // TODO : Want to cause various binding incompatibility issues here to test
3942 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07003943 // First cause various verify_layout_compatibility() fails
3944 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003945 // verify_set_layout_compatibility fail cases:
3946 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07003947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3948 " due to: invalid VkPipelineLayout ");
3949 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3950 VK_PIPELINE_BIND_POINT_GRAPHICS,
3951 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
3952 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003953 m_errorMonitor->VerifyFound();
3954
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003955 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07003956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3957 " attempting to bind set to index 1");
3958 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3959 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
3960 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003961 m_errorMonitor->VerifyFound();
3962
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003963 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003964 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
3965 // descriptors
3966 m_errorMonitor->SetDesiredFailureMsg(
3967 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003968 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003969 vkCmdBindDescriptorSets(
3970 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3971 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003972 m_errorMonitor->VerifyFound();
3973
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003974 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
3975 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07003976 m_errorMonitor->SetDesiredFailureMsg(
3977 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003978 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07003979 vkCmdBindDescriptorSets(
3980 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3981 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003982 m_errorMonitor->VerifyFound();
3983
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003984 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
3985 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07003986 m_errorMonitor->SetDesiredFailureMsg(
3987 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003988 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003989 vkCmdBindDescriptorSets(
3990 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3991 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003992 m_errorMonitor->VerifyFound();
3993
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003994 // Cause INFO messages due to disturbing previously bound Sets
3995 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07003996 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3997 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3998 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003999 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07004000 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004001 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004002 " previously bound as set #0 was disturbed ");
4003 vkCmdBindDescriptorSets(
4004 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4005 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004006 m_errorMonitor->VerifyFound();
4007
Karl Schultz6addd812016-02-02 17:17:23 -07004008 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4009 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4010 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004011 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004013 " newly bound as set #0 so set #1 and "
4014 "any subsequent sets were disturbed ");
4015 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4016 VK_PIPELINE_BIND_POINT_GRAPHICS,
4017 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004018 m_errorMonitor->VerifyFound();
4019
Tobin Ehlis88452832015-12-03 09:40:56 -07004020 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07004021 // 1. Error due to not binding required set (we actually use same code as
4022 // above to disturb set0)
4023 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4024 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4025 2, &descriptorSet[0], 0, NULL);
4026 vkCmdBindDescriptorSets(
4027 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4028 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
4029 m_errorMonitor->SetDesiredFailureMsg(
4030 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4031 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07004032 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004033 m_errorMonitor->VerifyFound();
4034
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004035 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004036 // 2. Error due to bound set not being compatible with PSO's
4037 // VkPipelineLayout (diff stageFlags in this case)
4038 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4039 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4040 2, &descriptorSet[0], 0, NULL);
4041 m_errorMonitor->SetDesiredFailureMsg(
4042 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4043 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07004044 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004045 m_errorMonitor->VerifyFound();
4046
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004047 // Remaining clean-up
4048 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004049 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004050 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
4051 }
4052 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06004053 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
4054 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004055 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004056 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4057 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4058}
Tobin Ehlis559c6382015-11-05 09:52:49 -07004059
Karl Schultz6addd812016-02-02 17:17:23 -07004060TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004061
Karl Schultz6addd812016-02-02 17:17:23 -07004062 m_errorMonitor->SetDesiredFailureMsg(
4063 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004064 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004065
4066 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004067 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004068 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004069 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004070
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004071 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004072}
4073
Karl Schultz6addd812016-02-02 17:17:23 -07004074TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
4075 VkResult err;
4076 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004077
Karl Schultz6addd812016-02-02 17:17:23 -07004078 m_errorMonitor->SetDesiredFailureMsg(
4079 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07004080 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004081
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004082 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004083
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004084 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004085 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06004086 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004087 cmd.commandPool = m_commandPool;
4088 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004089 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06004090
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004091 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06004092 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004093
4094 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004095 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07004096 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004097 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06004098 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07004099 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
4100 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004101 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004102
4103 // The error should be caught by validation of the BeginCommandBuffer call
4104 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
4105
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004106 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004107 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004108}
4109
Karl Schultz6addd812016-02-02 17:17:23 -07004110TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004111 // Cause error due to Begin while recording CB
4112 // Then cause 2 errors for attempting to reset CB w/o having
4113 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
4114 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004115 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004116 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004117
4118 ASSERT_NO_FATAL_FAILURE(InitState());
4119
4120 // Calls AllocateCommandBuffers
4121 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
4122
Karl Schultz6addd812016-02-02 17:17:23 -07004123 // Force the failure by setting the Renderpass and Framebuffer fields with
4124 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004125 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07004126 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004127 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4128 cmd_buf_info.pNext = NULL;
4129 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004130 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004131
4132 // Begin CB to transition to recording state
4133 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
4134 // Can't re-begin. This should trigger error
4135 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004136 m_errorMonitor->VerifyFound();
4137
Karl Schultz6addd812016-02-02 17:17:23 -07004138 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4139 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004140 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
4141 // Reset attempt will trigger error due to incorrect CommandPool state
4142 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004143 m_errorMonitor->VerifyFound();
4144
Karl Schultz6addd812016-02-02 17:17:23 -07004145 m_errorMonitor->SetDesiredFailureMsg(
4146 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4147 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004148 // Transition CB to RECORDED state
4149 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
4150 // Now attempting to Begin will implicitly reset, which triggers error
4151 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004152 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004153}
4154
Karl Schultz6addd812016-02-02 17:17:23 -07004155TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004156 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07004157 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004158
Karl Schultz6addd812016-02-02 17:17:23 -07004159 m_errorMonitor->SetDesiredFailureMsg(
4160 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004161 "Invalid Pipeline CreateInfo State: Vtx Shader required");
4162
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004163 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06004164 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004165
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004166 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004167 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4168 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004169
4170 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004171 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4172 ds_pool_ci.pNext = NULL;
4173 ds_pool_ci.maxSets = 1;
4174 ds_pool_ci.poolSizeCount = 1;
4175 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004176
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004177 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004178 err =
4179 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004180 ASSERT_VK_SUCCESS(err);
4181
Tony Barboureb254902015-07-15 12:50:33 -06004182 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004183 dsl_binding.binding = 0;
4184 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4185 dsl_binding.descriptorCount = 1;
4186 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4187 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004188
Tony Barboureb254902015-07-15 12:50:33 -06004189 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004190 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4191 ds_layout_ci.pNext = NULL;
4192 ds_layout_ci.bindingCount = 1;
4193 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004194
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004195 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004196 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4197 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004198 ASSERT_VK_SUCCESS(err);
4199
4200 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004201 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004202 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004203 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004204 alloc_info.descriptorPool = ds_pool;
4205 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004206 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4207 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004208 ASSERT_VK_SUCCESS(err);
4209
Tony Barboureb254902015-07-15 12:50:33 -06004210 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004211 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4212 pipeline_layout_ci.setLayoutCount = 1;
4213 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004214
4215 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004216 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4217 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004218 ASSERT_VK_SUCCESS(err);
4219
Tobin Ehlise68360f2015-10-01 11:15:13 -06004220 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07004221 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06004222
4223 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004224 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4225 vp_state_ci.scissorCount = 1;
4226 vp_state_ci.pScissors = &sc;
4227 vp_state_ci.viewportCount = 1;
4228 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004229
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004230 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4231 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4232 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4233 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4234 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4235 rs_state_ci.depthClampEnable = VK_FALSE;
4236 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4237 rs_state_ci.depthBiasEnable = VK_FALSE;
4238
Tony Barboureb254902015-07-15 12:50:33 -06004239 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004240 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4241 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004242 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004243 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4244 gp_ci.layout = pipeline_layout;
4245 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06004246
4247 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004248 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4249 pc_ci.initialDataSize = 0;
4250 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004251
4252 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06004253 VkPipelineCache pipelineCache;
4254
Karl Schultz6addd812016-02-02 17:17:23 -07004255 err =
4256 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06004257 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004258 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4259 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004260
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004261 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004262
Chia-I Wuf7458c52015-10-26 21:10:41 +08004263 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4264 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4265 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4266 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004267}
Tobin Ehlis912df022015-09-17 08:46:18 -06004268/*// TODO : This test should be good, but needs Tess support in compiler to run
4269TEST_F(VkLayerTest, InvalidPatchControlPoints)
4270{
4271 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06004272 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004273
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004274 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004275 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
4276primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004277
Tobin Ehlis912df022015-09-17 08:46:18 -06004278 ASSERT_NO_FATAL_FAILURE(InitState());
4279 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06004280
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004281 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06004282 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004283 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004284
4285 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4286 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4287 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004288 ds_pool_ci.poolSizeCount = 1;
4289 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06004290
4291 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004292 err = vkCreateDescriptorPool(m_device->device(),
4293VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06004294 ASSERT_VK_SUCCESS(err);
4295
4296 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08004297 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06004298 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08004299 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004300 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4301 dsl_binding.pImmutableSamplers = NULL;
4302
4303 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004304 ds_layout_ci.sType =
4305VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06004306 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004307 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004308 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06004309
4310 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004311 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4312&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06004313 ASSERT_VK_SUCCESS(err);
4314
4315 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004316 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
4317VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06004318 ASSERT_VK_SUCCESS(err);
4319
4320 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004321 pipeline_layout_ci.sType =
4322VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06004323 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004324 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004325 pipeline_layout_ci.pSetLayouts = &ds_layout;
4326
4327 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004328 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4329&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06004330 ASSERT_VK_SUCCESS(err);
4331
4332 VkPipelineShaderStageCreateInfo shaderStages[3];
4333 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
4334
Karl Schultz6addd812016-02-02 17:17:23 -07004335 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
4336this);
Tobin Ehlis912df022015-09-17 08:46:18 -06004337 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07004338 VkShaderObj
4339tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
4340this);
4341 VkShaderObj
4342te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
4343this);
Tobin Ehlis912df022015-09-17 08:46:18 -06004344
Karl Schultz6addd812016-02-02 17:17:23 -07004345 shaderStages[0].sType =
4346VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004347 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004348 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07004349 shaderStages[1].sType =
4350VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004351 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004352 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07004353 shaderStages[2].sType =
4354VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004355 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004356 shaderStages[2].shader = te.handle();
4357
4358 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004359 iaCI.sType =
4360VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08004361 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06004362
4363 VkPipelineTessellationStateCreateInfo tsCI = {};
4364 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
4365 tsCI.patchControlPoints = 0; // This will cause an error
4366
4367 VkGraphicsPipelineCreateInfo gp_ci = {};
4368 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4369 gp_ci.pNext = NULL;
4370 gp_ci.stageCount = 3;
4371 gp_ci.pStages = shaderStages;
4372 gp_ci.pVertexInputState = NULL;
4373 gp_ci.pInputAssemblyState = &iaCI;
4374 gp_ci.pTessellationState = &tsCI;
4375 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004376 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06004377 gp_ci.pMultisampleState = NULL;
4378 gp_ci.pDepthStencilState = NULL;
4379 gp_ci.pColorBlendState = NULL;
4380 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4381 gp_ci.layout = pipeline_layout;
4382 gp_ci.renderPass = renderPass();
4383
4384 VkPipelineCacheCreateInfo pc_ci = {};
4385 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4386 pc_ci.pNext = NULL;
4387 pc_ci.initialSize = 0;
4388 pc_ci.initialData = 0;
4389 pc_ci.maxSize = 0;
4390
4391 VkPipeline pipeline;
4392 VkPipelineCache pipelineCache;
4393
Karl Schultz6addd812016-02-02 17:17:23 -07004394 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
4395&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06004396 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004397 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4398&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06004399
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004400 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004401
Chia-I Wuf7458c52015-10-26 21:10:41 +08004402 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4403 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4404 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4405 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06004406}
4407*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06004408// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07004409TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07004410 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004411
Karl Schultz6addd812016-02-02 17:17:23 -07004412 m_errorMonitor->SetDesiredFailureMsg(
4413 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004414 "Gfx Pipeline viewport count (1) must match scissor count (0).");
4415
Tobin Ehlise68360f2015-10-01 11:15:13 -06004416 ASSERT_NO_FATAL_FAILURE(InitState());
4417 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004418
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004419 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004420 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4421 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004422
4423 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004424 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4425 ds_pool_ci.maxSets = 1;
4426 ds_pool_ci.poolSizeCount = 1;
4427 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004428
4429 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004430 err =
4431 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004432 ASSERT_VK_SUCCESS(err);
4433
4434 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004435 dsl_binding.binding = 0;
4436 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4437 dsl_binding.descriptorCount = 1;
4438 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004439
4440 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004441 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4442 ds_layout_ci.bindingCount = 1;
4443 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004444
4445 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004446 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4447 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004448 ASSERT_VK_SUCCESS(err);
4449
4450 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004451 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004452 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004453 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004454 alloc_info.descriptorPool = ds_pool;
4455 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004456 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4457 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004458 ASSERT_VK_SUCCESS(err);
4459
4460 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004461 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4462 pipeline_layout_ci.setLayoutCount = 1;
4463 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004464
4465 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004466 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4467 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004468 ASSERT_VK_SUCCESS(err);
4469
4470 VkViewport vp = {}; // Just need dummy vp to point to
4471
4472 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004473 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4474 vp_state_ci.scissorCount = 0;
4475 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
4476 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004477
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004478 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4479 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4480 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4481 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4482 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4483 rs_state_ci.depthClampEnable = VK_FALSE;
4484 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4485 rs_state_ci.depthBiasEnable = VK_FALSE;
4486
Cody Northropeb3a6c12015-10-05 14:44:45 -06004487 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004488 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004489
Karl Schultz6addd812016-02-02 17:17:23 -07004490 VkShaderObj vs(m_device, bindStateVertShaderText,
4491 VK_SHADER_STAGE_VERTEX_BIT, this);
4492 VkShaderObj fs(m_device, bindStateFragShaderText,
4493 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004494 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004495 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004496 shaderStages[0] = vs.GetStageCreateInfo();
4497 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004498
4499 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004500 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4501 gp_ci.stageCount = 2;
4502 gp_ci.pStages = shaderStages;
4503 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004504 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004505 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4506 gp_ci.layout = pipeline_layout;
4507 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004508
4509 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004510 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004511
4512 VkPipeline pipeline;
4513 VkPipelineCache pipelineCache;
4514
Karl Schultz6addd812016-02-02 17:17:23 -07004515 err =
4516 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004517 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004518 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4519 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004520
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004521 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004522
Chia-I Wuf7458c52015-10-26 21:10:41 +08004523 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4524 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4525 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4526 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004527}
Karl Schultz6addd812016-02-02 17:17:23 -07004528// Don't set viewport state in PSO. This is an error b/c we always need this
4529// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06004530// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07004531TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06004532 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07004533 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004534
Karl Schultz6addd812016-02-02 17:17:23 -07004535 m_errorMonitor->SetDesiredFailureMsg(
4536 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004537 "Gfx Pipeline pViewportState is null. Even if ");
4538
Tobin Ehlise68360f2015-10-01 11:15:13 -06004539 ASSERT_NO_FATAL_FAILURE(InitState());
4540 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004541
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004542 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004543 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4544 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004545
4546 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004547 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4548 ds_pool_ci.maxSets = 1;
4549 ds_pool_ci.poolSizeCount = 1;
4550 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004551
4552 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004553 err =
4554 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004555 ASSERT_VK_SUCCESS(err);
4556
4557 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004558 dsl_binding.binding = 0;
4559 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4560 dsl_binding.descriptorCount = 1;
4561 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004562
4563 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004564 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4565 ds_layout_ci.bindingCount = 1;
4566 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004567
4568 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004569 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4570 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004571 ASSERT_VK_SUCCESS(err);
4572
4573 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004574 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004575 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004576 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004577 alloc_info.descriptorPool = ds_pool;
4578 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004579 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4580 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004581 ASSERT_VK_SUCCESS(err);
4582
4583 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004584 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4585 pipeline_layout_ci.setLayoutCount = 1;
4586 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004587
4588 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004589 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4590 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004591 ASSERT_VK_SUCCESS(err);
4592
4593 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4594 // Set scissor as dynamic to avoid second error
4595 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004596 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4597 dyn_state_ci.dynamicStateCount = 1;
4598 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004599
Cody Northropeb3a6c12015-10-05 14:44:45 -06004600 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004601 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004602
Karl Schultz6addd812016-02-02 17:17:23 -07004603 VkShaderObj vs(m_device, bindStateVertShaderText,
4604 VK_SHADER_STAGE_VERTEX_BIT, this);
4605 VkShaderObj fs(m_device, bindStateFragShaderText,
4606 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004607 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004608 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004609 shaderStages[0] = vs.GetStageCreateInfo();
4610 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004611
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004612
4613 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4614 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4615 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4616 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4617 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4618 rs_state_ci.depthClampEnable = VK_FALSE;
4619 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4620 rs_state_ci.depthBiasEnable = VK_FALSE;
4621
Tobin Ehlise68360f2015-10-01 11:15:13 -06004622 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004623 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4624 gp_ci.stageCount = 2;
4625 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004626 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004627 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
4628 // should cause validation error
4629 gp_ci.pDynamicState = &dyn_state_ci;
4630 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4631 gp_ci.layout = pipeline_layout;
4632 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004633
4634 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004635 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004636
4637 VkPipeline pipeline;
4638 VkPipelineCache pipelineCache;
4639
Karl Schultz6addd812016-02-02 17:17:23 -07004640 err =
4641 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004642 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004643 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4644 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004645
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004646 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004647
Chia-I Wuf7458c52015-10-26 21:10:41 +08004648 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);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004652}
4653// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07004654// Then run second test where dynamic scissor count doesn't match PSO scissor
4655// count
4656TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
4657 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004658
Karl Schultz6addd812016-02-02 17:17:23 -07004659 m_errorMonitor->SetDesiredFailureMsg(
4660 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004661 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
4662
Tobin Ehlise68360f2015-10-01 11:15:13 -06004663 ASSERT_NO_FATAL_FAILURE(InitState());
4664 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004665
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004666 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004667 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4668 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004669
4670 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004671 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;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004675
4676 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004677 err =
4678 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004679 ASSERT_VK_SUCCESS(err);
4680
4681 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004682 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;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004686
4687 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004688 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;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004691
4692 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004693 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4694 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004695 ASSERT_VK_SUCCESS(err);
4696
4697 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004698 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004699 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004700 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004701 alloc_info.descriptorPool = ds_pool;
4702 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004703 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4704 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004705 ASSERT_VK_SUCCESS(err);
4706
4707 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004708 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4709 pipeline_layout_ci.setLayoutCount = 1;
4710 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004711
4712 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004713 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4714 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004715 ASSERT_VK_SUCCESS(err);
4716
4717 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004718 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4719 vp_state_ci.viewportCount = 1;
4720 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
4721 vp_state_ci.scissorCount = 1;
4722 vp_state_ci.pScissors =
4723 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06004724
4725 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4726 // Set scissor as dynamic to avoid that error
4727 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004728 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4729 dyn_state_ci.dynamicStateCount = 1;
4730 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004731
Cody Northropeb3a6c12015-10-05 14:44:45 -06004732 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004733 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004734
Karl Schultz6addd812016-02-02 17:17:23 -07004735 VkShaderObj vs(m_device, bindStateVertShaderText,
4736 VK_SHADER_STAGE_VERTEX_BIT, this);
4737 VkShaderObj fs(m_device, bindStateFragShaderText,
4738 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004739 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004740 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004741 shaderStages[0] = vs.GetStageCreateInfo();
4742 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004743
Cody Northropf6622dc2015-10-06 10:33:21 -06004744 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4745 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4746 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004747 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004748 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004749 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004750 vi_ci.pVertexAttributeDescriptions = nullptr;
4751
4752 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4753 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4754 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4755
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004756 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004757 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06004758 rs_ci.pNext = nullptr;
4759
Mark Youngc89c6312016-03-31 16:03:20 -06004760 VkPipelineColorBlendAttachmentState att = {};
4761 att.blendEnable = VK_FALSE;
4762 att.colorWriteMask = 0xf;
4763
Cody Northropf6622dc2015-10-06 10:33:21 -06004764 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4765 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4766 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004767 cb_ci.attachmentCount = 1;
4768 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06004769
Tobin Ehlise68360f2015-10-01 11:15:13 -06004770 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004771 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4772 gp_ci.stageCount = 2;
4773 gp_ci.pStages = shaderStages;
4774 gp_ci.pVertexInputState = &vi_ci;
4775 gp_ci.pInputAssemblyState = &ia_ci;
4776 gp_ci.pViewportState = &vp_state_ci;
4777 gp_ci.pRasterizationState = &rs_ci;
4778 gp_ci.pColorBlendState = &cb_ci;
4779 gp_ci.pDynamicState = &dyn_state_ci;
4780 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4781 gp_ci.layout = pipeline_layout;
4782 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004783
4784 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004785 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004786
4787 VkPipeline pipeline;
4788 VkPipelineCache pipelineCache;
4789
Karl Schultz6addd812016-02-02 17:17:23 -07004790 err =
4791 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004792 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004793 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4794 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004795
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004796 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004797
Tobin Ehlisd332f282015-10-02 11:00:56 -06004798 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07004799 // First need to successfully create the PSO from above by setting
4800 // pViewports
4801 m_errorMonitor->SetDesiredFailureMsg(
4802 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4803 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
4804 "scissorCount is 1. These counts must match.");
4805
4806 VkViewport vp = {}; // Just need dummy vp to point to
4807 vp_state_ci.pViewports = &vp;
4808 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4809 &gp_ci, NULL, &pipeline);
4810 ASSERT_VK_SUCCESS(err);
4811 BeginCommandBuffer();
4812 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4813 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4814 VkRect2D scissors[2] = {}; // don't care about data
4815 // Count of 2 doesn't match PSO count of 1
4816 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
4817 Draw(1, 0, 0, 0);
4818
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004819 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004820
4821 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4822 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4823 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4824 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4825}
4826// Create PSO w/o non-zero scissorCount but no scissor data
4827// Then run second test where dynamic viewportCount doesn't match PSO
4828// viewportCount
4829TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
4830 VkResult err;
4831
4832 m_errorMonitor->SetDesiredFailureMsg(
4833 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4834 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
4835
4836 ASSERT_NO_FATAL_FAILURE(InitState());
4837 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4838
4839 VkDescriptorPoolSize ds_type_count = {};
4840 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4841 ds_type_count.descriptorCount = 1;
4842
4843 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4844 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4845 ds_pool_ci.maxSets = 1;
4846 ds_pool_ci.poolSizeCount = 1;
4847 ds_pool_ci.pPoolSizes = &ds_type_count;
4848
4849 VkDescriptorPool ds_pool;
4850 err =
4851 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4852 ASSERT_VK_SUCCESS(err);
4853
4854 VkDescriptorSetLayoutBinding dsl_binding = {};
4855 dsl_binding.binding = 0;
4856 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4857 dsl_binding.descriptorCount = 1;
4858 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4859
4860 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4861 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4862 ds_layout_ci.bindingCount = 1;
4863 ds_layout_ci.pBindings = &dsl_binding;
4864
4865 VkDescriptorSetLayout ds_layout;
4866 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4867 &ds_layout);
4868 ASSERT_VK_SUCCESS(err);
4869
4870 VkDescriptorSet descriptorSet;
4871 VkDescriptorSetAllocateInfo alloc_info = {};
4872 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4873 alloc_info.descriptorSetCount = 1;
4874 alloc_info.descriptorPool = ds_pool;
4875 alloc_info.pSetLayouts = &ds_layout;
4876 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4877 &descriptorSet);
4878 ASSERT_VK_SUCCESS(err);
4879
4880 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4881 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4882 pipeline_layout_ci.setLayoutCount = 1;
4883 pipeline_layout_ci.pSetLayouts = &ds_layout;
4884
4885 VkPipelineLayout pipeline_layout;
4886 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4887 &pipeline_layout);
4888 ASSERT_VK_SUCCESS(err);
4889
4890 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4891 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4892 vp_state_ci.scissorCount = 1;
4893 vp_state_ci.pScissors =
4894 NULL; // Null scissor w/ count of 1 should cause error
4895 vp_state_ci.viewportCount = 1;
4896 vp_state_ci.pViewports =
4897 NULL; // vp is dynamic (below) so this won't cause error
4898
4899 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
4900 // Set scissor as dynamic to avoid that error
4901 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4902 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4903 dyn_state_ci.dynamicStateCount = 1;
4904 dyn_state_ci.pDynamicStates = &vp_state;
4905
4906 VkPipelineShaderStageCreateInfo shaderStages[2];
4907 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4908
4909 VkShaderObj vs(m_device, bindStateVertShaderText,
4910 VK_SHADER_STAGE_VERTEX_BIT, this);
4911 VkShaderObj fs(m_device, bindStateFragShaderText,
4912 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004913 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004914 // but add it to be able to run on more devices
4915 shaderStages[0] = vs.GetStageCreateInfo();
4916 shaderStages[1] = fs.GetStageCreateInfo();
4917
4918 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4919 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4920 vi_ci.pNext = nullptr;
4921 vi_ci.vertexBindingDescriptionCount = 0;
4922 vi_ci.pVertexBindingDescriptions = nullptr;
4923 vi_ci.vertexAttributeDescriptionCount = 0;
4924 vi_ci.pVertexAttributeDescriptions = nullptr;
4925
4926 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4927 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4928 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4929
4930 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4931 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4932 rs_ci.pNext = nullptr;
4933
Mark Youngc89c6312016-03-31 16:03:20 -06004934 VkPipelineColorBlendAttachmentState att = {};
4935 att.blendEnable = VK_FALSE;
4936 att.colorWriteMask = 0xf;
4937
Karl Schultz6addd812016-02-02 17:17:23 -07004938 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4939 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4940 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004941 cb_ci.attachmentCount = 1;
4942 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004943
4944 VkGraphicsPipelineCreateInfo gp_ci = {};
4945 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4946 gp_ci.stageCount = 2;
4947 gp_ci.pStages = shaderStages;
4948 gp_ci.pVertexInputState = &vi_ci;
4949 gp_ci.pInputAssemblyState = &ia_ci;
4950 gp_ci.pViewportState = &vp_state_ci;
4951 gp_ci.pRasterizationState = &rs_ci;
4952 gp_ci.pColorBlendState = &cb_ci;
4953 gp_ci.pDynamicState = &dyn_state_ci;
4954 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4955 gp_ci.layout = pipeline_layout;
4956 gp_ci.renderPass = renderPass();
4957
4958 VkPipelineCacheCreateInfo pc_ci = {};
4959 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4960
4961 VkPipeline pipeline;
4962 VkPipelineCache pipelineCache;
4963
4964 err =
4965 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4966 ASSERT_VK_SUCCESS(err);
4967 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4968 &gp_ci, NULL, &pipeline);
4969
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004970 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004971
4972 // Now hit second fail case where we set scissor w/ different count than PSO
4973 // First need to successfully create the PSO from above by setting
4974 // pViewports
4975 m_errorMonitor->SetDesiredFailureMsg(
4976 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4977 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4978 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004979
Tobin Ehlisd332f282015-10-02 11:00:56 -06004980 VkRect2D sc = {}; // Just need dummy vp to point to
4981 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004982 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4983 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004984 ASSERT_VK_SUCCESS(err);
4985 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004986 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4987 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004988 VkViewport viewports[2] = {}; // don't care about data
4989 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004990 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004991 Draw(1, 0, 0, 0);
4992
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004993 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004994
Chia-I Wuf7458c52015-10-26 21:10:41 +08004995 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4996 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4997 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4998 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004999}
5000
Mark Young7394fdd2016-03-31 14:56:43 -06005001TEST_F(VkLayerTest, PSOLineWidthInvalid) {
5002 VkResult err;
5003
5004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06005005 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06005006
5007 ASSERT_NO_FATAL_FAILURE(InitState());
5008 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5009
5010 VkDescriptorPoolSize ds_type_count = {};
5011 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5012 ds_type_count.descriptorCount = 1;
5013
5014 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5015 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5016 ds_pool_ci.maxSets = 1;
5017 ds_pool_ci.poolSizeCount = 1;
5018 ds_pool_ci.pPoolSizes = &ds_type_count;
5019
5020 VkDescriptorPool ds_pool;
5021 err =
5022 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5023 ASSERT_VK_SUCCESS(err);
5024
5025 VkDescriptorSetLayoutBinding dsl_binding = {};
5026 dsl_binding.binding = 0;
5027 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5028 dsl_binding.descriptorCount = 1;
5029 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5030
5031 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5032 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5033 ds_layout_ci.bindingCount = 1;
5034 ds_layout_ci.pBindings = &dsl_binding;
5035
5036 VkDescriptorSetLayout ds_layout;
5037 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5038 &ds_layout);
5039 ASSERT_VK_SUCCESS(err);
5040
5041 VkDescriptorSet descriptorSet;
5042 VkDescriptorSetAllocateInfo alloc_info = {};
5043 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5044 alloc_info.descriptorSetCount = 1;
5045 alloc_info.descriptorPool = ds_pool;
5046 alloc_info.pSetLayouts = &ds_layout;
5047 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5048 &descriptorSet);
5049 ASSERT_VK_SUCCESS(err);
5050
5051 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5052 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5053 pipeline_layout_ci.setLayoutCount = 1;
5054 pipeline_layout_ci.pSetLayouts = &ds_layout;
5055
5056 VkPipelineLayout pipeline_layout;
5057 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5058 &pipeline_layout);
5059 ASSERT_VK_SUCCESS(err);
5060
5061 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5062 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5063 vp_state_ci.scissorCount = 1;
5064 vp_state_ci.pScissors = NULL;
5065 vp_state_ci.viewportCount = 1;
5066 vp_state_ci.pViewports = NULL;
5067
5068 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
5069 VK_DYNAMIC_STATE_SCISSOR,
5070 VK_DYNAMIC_STATE_LINE_WIDTH};
5071 // Set scissor as dynamic to avoid that error
5072 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5073 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5074 dyn_state_ci.dynamicStateCount = 2;
5075 dyn_state_ci.pDynamicStates = dynamic_states;
5076
5077 VkPipelineShaderStageCreateInfo shaderStages[2];
5078 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5079
5080 VkShaderObj vs(m_device, bindStateVertShaderText,
5081 VK_SHADER_STAGE_VERTEX_BIT, this);
5082 VkShaderObj fs(m_device, bindStateFragShaderText,
5083 VK_SHADER_STAGE_FRAGMENT_BIT,
5084 this); // TODO - We shouldn't need a fragment shader
5085 // but add it to be able to run on more devices
5086 shaderStages[0] = vs.GetStageCreateInfo();
5087 shaderStages[1] = fs.GetStageCreateInfo();
5088
5089 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5090 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5091 vi_ci.pNext = nullptr;
5092 vi_ci.vertexBindingDescriptionCount = 0;
5093 vi_ci.pVertexBindingDescriptions = nullptr;
5094 vi_ci.vertexAttributeDescriptionCount = 0;
5095 vi_ci.pVertexAttributeDescriptions = nullptr;
5096
5097 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5098 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5099 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5100
5101 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5102 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5103 rs_ci.pNext = nullptr;
5104
Mark Young47107952016-05-02 15:59:55 -06005105 // Check too low (line width of -1.0f).
5106 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06005107
5108 VkPipelineColorBlendAttachmentState att = {};
5109 att.blendEnable = VK_FALSE;
5110 att.colorWriteMask = 0xf;
5111
5112 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5113 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5114 cb_ci.pNext = nullptr;
5115 cb_ci.attachmentCount = 1;
5116 cb_ci.pAttachments = &att;
5117
5118 VkGraphicsPipelineCreateInfo gp_ci = {};
5119 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5120 gp_ci.stageCount = 2;
5121 gp_ci.pStages = shaderStages;
5122 gp_ci.pVertexInputState = &vi_ci;
5123 gp_ci.pInputAssemblyState = &ia_ci;
5124 gp_ci.pViewportState = &vp_state_ci;
5125 gp_ci.pRasterizationState = &rs_ci;
5126 gp_ci.pColorBlendState = &cb_ci;
5127 gp_ci.pDynamicState = &dyn_state_ci;
5128 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5129 gp_ci.layout = pipeline_layout;
5130 gp_ci.renderPass = renderPass();
5131
5132 VkPipelineCacheCreateInfo pc_ci = {};
5133 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5134
5135 VkPipeline pipeline;
5136 VkPipelineCache pipelineCache;
5137
5138 err =
5139 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5140 ASSERT_VK_SUCCESS(err);
5141 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5142 &gp_ci, NULL, &pipeline);
5143
5144 m_errorMonitor->VerifyFound();
5145
5146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5147 "Attempt to set lineWidth to 65536");
5148
5149 // Check too high (line width of 65536.0f).
5150 rs_ci.lineWidth = 65536.0f;
5151
5152 err =
5153 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5154 ASSERT_VK_SUCCESS(err);
5155 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5156 &gp_ci, NULL, &pipeline);
5157
5158 m_errorMonitor->VerifyFound();
5159
5160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06005161 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06005162
5163 dyn_state_ci.dynamicStateCount = 3;
5164
5165 rs_ci.lineWidth = 1.0f;
5166
5167 err =
5168 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5169 ASSERT_VK_SUCCESS(err);
5170 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5171 &gp_ci, NULL, &pipeline);
5172 BeginCommandBuffer();
5173 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5174 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5175
5176 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06005177 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06005178 m_errorMonitor->VerifyFound();
5179
5180 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5181 "Attempt to set lineWidth to 65536");
5182
5183 // Check too high with dynamic setting.
5184 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
5185 m_errorMonitor->VerifyFound();
5186 EndCommandBuffer();
5187
5188 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5189 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5190 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5191 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5192}
5193
Karl Schultz6addd812016-02-02 17:17:23 -07005194TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005195 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005196 m_errorMonitor->SetDesiredFailureMsg(
5197 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005198 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005199
5200 ASSERT_NO_FATAL_FAILURE(InitState());
5201 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005202
Tony Barbourfe3351b2015-07-28 10:17:20 -06005203 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005204 // Don't care about RenderPass handle b/c error should be flagged before
5205 // that
5206 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
5207 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005208
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005209 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005210}
5211
Karl Schultz6addd812016-02-02 17:17:23 -07005212TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005213 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005214 m_errorMonitor->SetDesiredFailureMsg(
5215 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005216 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005217
5218 ASSERT_NO_FATAL_FAILURE(InitState());
5219 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005220
Tony Barbourfe3351b2015-07-28 10:17:20 -06005221 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005222 // Just create a dummy Renderpass that's non-NULL so we can get to the
5223 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06005224 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005225 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
5226 rp_begin.pNext = NULL;
5227 rp_begin.renderPass = renderPass();
5228 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005229
Karl Schultz6addd812016-02-02 17:17:23 -07005230 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
5231 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005232
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005233 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005234}
5235
Karl Schultz6addd812016-02-02 17:17:23 -07005236TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005237 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07005238 m_errorMonitor->SetDesiredFailureMsg(
5239 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005240 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005241
5242 ASSERT_NO_FATAL_FAILURE(InitState());
5243 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005244
5245 // Renderpass is started here
5246 BeginCommandBuffer();
5247
5248 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005249 vk_testing::Buffer dstBuffer;
5250 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005251
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005252 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005253
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005254 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005255}
5256
Karl Schultz6addd812016-02-02 17:17:23 -07005257TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005258 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07005259 m_errorMonitor->SetDesiredFailureMsg(
5260 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005261 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005262
5263 ASSERT_NO_FATAL_FAILURE(InitState());
5264 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005265
5266 // Renderpass is started here
5267 BeginCommandBuffer();
5268
5269 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005270 vk_testing::Buffer dstBuffer;
5271 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005272
Karl Schultz6addd812016-02-02 17:17:23 -07005273 VkDeviceSize dstOffset = 0;
5274 VkDeviceSize dataSize = 1024;
5275 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005276
Karl Schultz6addd812016-02-02 17:17:23 -07005277 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
5278 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005279
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005280 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005281}
5282
Karl Schultz6addd812016-02-02 17:17:23 -07005283TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005284 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005285 m_errorMonitor->SetDesiredFailureMsg(
5286 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005287 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005288
5289 ASSERT_NO_FATAL_FAILURE(InitState());
5290 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005291
5292 // Renderpass is started here
5293 BeginCommandBuffer();
5294
Michael Lentine0a369f62016-02-03 16:51:46 -06005295 VkClearColorValue clear_color;
5296 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07005297 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
5298 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5299 const int32_t tex_width = 32;
5300 const int32_t tex_height = 32;
5301 VkImageCreateInfo image_create_info = {};
5302 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5303 image_create_info.pNext = NULL;
5304 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5305 image_create_info.format = tex_format;
5306 image_create_info.extent.width = tex_width;
5307 image_create_info.extent.height = tex_height;
5308 image_create_info.extent.depth = 1;
5309 image_create_info.mipLevels = 1;
5310 image_create_info.arrayLayers = 1;
5311 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5312 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
5313 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005314
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005315 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005316 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5317 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005318
Karl Schultz6addd812016-02-02 17:17:23 -07005319 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5320 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005321
Karl Schultz6addd812016-02-02 17:17:23 -07005322 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5323 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005324
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005325 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005326}
5327
Karl Schultz6addd812016-02-02 17:17:23 -07005328TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005329 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005330 m_errorMonitor->SetDesiredFailureMsg(
5331 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005332 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005333
5334 ASSERT_NO_FATAL_FAILURE(InitState());
5335 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005336
5337 // Renderpass is started here
5338 BeginCommandBuffer();
5339
5340 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07005341 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005342 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
5343 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5344 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
5345 image_create_info.extent.width = 64;
5346 image_create_info.extent.height = 64;
5347 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5348 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005349
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005350 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005351 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5352 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005353
Karl Schultz6addd812016-02-02 17:17:23 -07005354 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5355 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005356
Karl Schultz6addd812016-02-02 17:17:23 -07005357 vkCmdClearDepthStencilImage(
5358 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5359 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
5360 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005361
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005362 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005363}
5364
Karl Schultz6addd812016-02-02 17:17:23 -07005365TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005366 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005367 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005368
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005369 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005370 "vkCmdClearAttachments: This call "
5371 "must be issued inside an active "
5372 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005373
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005374 ASSERT_NO_FATAL_FAILURE(InitState());
5375 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005376
5377 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005378 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005379 ASSERT_VK_SUCCESS(err);
5380
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005381 VkClearAttachment color_attachment;
5382 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5383 color_attachment.clearValue.color.float32[0] = 0;
5384 color_attachment.clearValue.color.float32[1] = 0;
5385 color_attachment.clearValue.color.float32[2] = 0;
5386 color_attachment.clearValue.color.float32[3] = 0;
5387 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005388 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
5389 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5390 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005391
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005392 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005393}
5394
Karl Schultz9e66a292016-04-21 15:57:51 -06005395TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
5396 // Try to add a buffer memory barrier with no buffer.
5397 m_errorMonitor->SetDesiredFailureMsg(
5398 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5399 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
5400
5401 ASSERT_NO_FATAL_FAILURE(InitState());
5402 BeginCommandBuffer();
5403
5404 VkBufferMemoryBarrier buf_barrier = {};
5405 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5406 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5407 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5408 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5409 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5410 buf_barrier.buffer = VK_NULL_HANDLE;
5411 buf_barrier.offset = 0;
5412 buf_barrier.size = VK_WHOLE_SIZE;
5413 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5414 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
5415 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
5416
5417 m_errorMonitor->VerifyFound();
5418}
5419
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06005420TEST_F(VkLayerTest, InvalidBarriers) {
5421 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
5422
5423 m_errorMonitor->SetDesiredFailureMsg(
5424 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
5425
5426 ASSERT_NO_FATAL_FAILURE(InitState());
5427 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5428
5429 VkMemoryBarrier mem_barrier = {};
5430 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
5431 mem_barrier.pNext = NULL;
5432 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5433 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5434 BeginCommandBuffer();
5435 // BeginCommandBuffer() starts a render pass
5436 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5437 VK_PIPELINE_STAGE_HOST_BIT,
5438 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
5439 &mem_barrier, 0, nullptr, 0, nullptr);
5440 m_errorMonitor->VerifyFound();
5441
5442 m_errorMonitor->SetDesiredFailureMsg(
5443 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5444 "Image Layout cannot be transitioned to UNDEFINED");
5445 VkImageObj image(m_device);
5446 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
5447 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5448 ASSERT_TRUE(image.initialized());
5449 VkImageMemoryBarrier img_barrier = {};
5450 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
5451 img_barrier.pNext = NULL;
5452 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5453 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5454 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5455 // New layout can't be UNDEFINED
5456 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5457 img_barrier.image = image.handle();
5458 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5459 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5460 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5461 img_barrier.subresourceRange.baseArrayLayer = 0;
5462 img_barrier.subresourceRange.baseMipLevel = 0;
5463 img_barrier.subresourceRange.layerCount = 1;
5464 img_barrier.subresourceRange.levelCount = 1;
5465 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5466 VK_PIPELINE_STAGE_HOST_BIT,
5467 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5468 nullptr, 1, &img_barrier);
5469 m_errorMonitor->VerifyFound();
5470 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5471
5472 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5473 "Subresource must have the sum of the "
5474 "baseArrayLayer");
5475 // baseArrayLayer + layerCount must be <= image's arrayLayers
5476 img_barrier.subresourceRange.baseArrayLayer = 1;
5477 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5478 VK_PIPELINE_STAGE_HOST_BIT,
5479 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5480 nullptr, 1, &img_barrier);
5481 m_errorMonitor->VerifyFound();
5482 img_barrier.subresourceRange.baseArrayLayer = 0;
5483
5484 m_errorMonitor->SetDesiredFailureMsg(
5485 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5486 "Subresource must have the sum of the baseMipLevel");
5487 // baseMipLevel + levelCount must be <= image's mipLevels
5488 img_barrier.subresourceRange.baseMipLevel = 1;
5489 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5490 VK_PIPELINE_STAGE_HOST_BIT,
5491 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5492 nullptr, 1, &img_barrier);
5493 m_errorMonitor->VerifyFound();
5494 img_barrier.subresourceRange.baseMipLevel = 0;
5495
5496 m_errorMonitor->SetDesiredFailureMsg(
5497 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5498 "Buffer Barriers cannot be used during a render pass");
5499 vk_testing::Buffer buffer;
5500 buffer.init(*m_device, 256);
5501 VkBufferMemoryBarrier buf_barrier = {};
5502 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5503 buf_barrier.pNext = NULL;
5504 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5505 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5506 buf_barrier.buffer = buffer.handle();
5507 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5508 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5509 buf_barrier.offset = 0;
5510 buf_barrier.size = VK_WHOLE_SIZE;
5511 // Can't send buffer barrier during a render pass
5512 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5513 VK_PIPELINE_STAGE_HOST_BIT,
5514 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5515 &buf_barrier, 0, nullptr);
5516 m_errorMonitor->VerifyFound();
5517 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
5518
5519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5520 "which is not less than total size");
5521 buf_barrier.offset = 257;
5522 // Offset greater than total size
5523 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5524 VK_PIPELINE_STAGE_HOST_BIT,
5525 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5526 &buf_barrier, 0, nullptr);
5527 m_errorMonitor->VerifyFound();
5528 buf_barrier.offset = 0;
5529
5530 m_errorMonitor->SetDesiredFailureMsg(
5531 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
5532 buf_barrier.size = 257;
5533 // Size greater than total size
5534 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5535 VK_PIPELINE_STAGE_HOST_BIT,
5536 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5537 &buf_barrier, 0, nullptr);
5538 m_errorMonitor->VerifyFound();
5539 buf_barrier.size = VK_WHOLE_SIZE;
5540
5541 m_errorMonitor->SetDesiredFailureMsg(
5542 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5543 "Image is a depth and stencil format and thus must "
5544 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
5545 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
5546 VkDepthStencilObj ds_image(m_device);
5547 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
5548 ASSERT_TRUE(ds_image.initialized());
5549 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5550 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
5551 img_barrier.image = ds_image.handle();
5552 // Leave aspectMask at COLOR on purpose
5553 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5554 VK_PIPELINE_STAGE_HOST_BIT,
5555 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5556 nullptr, 1, &img_barrier);
5557 m_errorMonitor->VerifyFound();
5558}
5559
Karl Schultz6addd812016-02-02 17:17:23 -07005560TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005561 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005562 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005563
Karl Schultz6addd812016-02-02 17:17:23 -07005564 m_errorMonitor->SetDesiredFailureMsg(
5565 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005566 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
5567
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005568 ASSERT_NO_FATAL_FAILURE(InitState());
5569 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005570 uint32_t qfi = 0;
5571 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005572 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5573 buffCI.size = 1024;
5574 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5575 buffCI.queueFamilyIndexCount = 1;
5576 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005577
5578 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005579 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005580 ASSERT_VK_SUCCESS(err);
5581
5582 BeginCommandBuffer();
5583 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005584 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5585 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005586 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07005587 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
5588 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005589
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005590 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005591
Chia-I Wuf7458c52015-10-26 21:10:41 +08005592 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005593}
5594
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005595TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
5596 // Create an out-of-range queueFamilyIndex
5597 m_errorMonitor->SetDesiredFailureMsg(
5598 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06005599 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005600
5601 ASSERT_NO_FATAL_FAILURE(InitState());
5602 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5603 VkBufferCreateInfo buffCI = {};
5604 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5605 buffCI.size = 1024;
5606 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5607 buffCI.queueFamilyIndexCount = 1;
5608 // Introduce failure by specifying invalid queue_family_index
5609 uint32_t qfi = 777;
5610 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06005611 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005612
5613 VkBuffer ib;
5614 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
5615
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005616 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005617}
5618
Karl Schultz6addd812016-02-02 17:17:23 -07005619TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
5620 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
5621 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005622
Karl Schultz6addd812016-02-02 17:17:23 -07005623 m_errorMonitor->SetDesiredFailureMsg(
5624 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005625 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005626
5627 ASSERT_NO_FATAL_FAILURE(InitState());
5628 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005629
5630 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005631 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005632 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
5633 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005634
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005635 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005636}
5637
Karl Schultz6addd812016-02-02 17:17:23 -07005638TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005639 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07005640 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005641
Karl Schultz6addd812016-02-02 17:17:23 -07005642 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005643 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5644 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
5645 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005646
Tobin Ehlis3b780662015-05-28 12:11:26 -06005647 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005648 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005649 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005650 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5651 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005652
5653 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005654 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5655 ds_pool_ci.pNext = NULL;
5656 ds_pool_ci.maxSets = 1;
5657 ds_pool_ci.poolSizeCount = 1;
5658 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005659
Tobin Ehlis3b780662015-05-28 12:11:26 -06005660 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005661 err =
5662 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005663 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005664 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005665 dsl_binding.binding = 0;
5666 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5667 dsl_binding.descriptorCount = 1;
5668 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5669 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005670
Tony Barboureb254902015-07-15 12:50:33 -06005671 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005672 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5673 ds_layout_ci.pNext = NULL;
5674 ds_layout_ci.bindingCount = 1;
5675 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005676
Tobin Ehlis3b780662015-05-28 12:11:26 -06005677 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005678 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5679 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005680 ASSERT_VK_SUCCESS(err);
5681
5682 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005683 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005684 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005685 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005686 alloc_info.descriptorPool = ds_pool;
5687 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005688 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5689 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005690 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005691
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005692 VkSamplerCreateInfo sampler_ci = {};
5693 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5694 sampler_ci.pNext = NULL;
5695 sampler_ci.magFilter = VK_FILTER_NEAREST;
5696 sampler_ci.minFilter = VK_FILTER_NEAREST;
5697 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5698 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5699 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5700 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5701 sampler_ci.mipLodBias = 1.0;
5702 sampler_ci.anisotropyEnable = VK_FALSE;
5703 sampler_ci.maxAnisotropy = 1;
5704 sampler_ci.compareEnable = VK_FALSE;
5705 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5706 sampler_ci.minLod = 1.0;
5707 sampler_ci.maxLod = 1.0;
5708 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5709 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5710 VkSampler sampler;
5711 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5712 ASSERT_VK_SUCCESS(err);
5713
5714 VkDescriptorImageInfo info = {};
5715 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005716
5717 VkWriteDescriptorSet descriptor_write;
5718 memset(&descriptor_write, 0, sizeof(descriptor_write));
5719 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005720 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005721 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005722 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005723 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005724 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005725
5726 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5727
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005728 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005729
Chia-I Wuf7458c52015-10-26 21:10:41 +08005730 vkDestroySampler(m_device->device(), sampler, NULL);
5731 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5732 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005733}
5734
Karl Schultz6addd812016-02-02 17:17:23 -07005735TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005736 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07005737 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005738
Karl Schultz6addd812016-02-02 17:17:23 -07005739 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005740 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5741 " binding #0 with 1 total descriptors but update of 1 descriptors "
5742 "starting at binding offset of 0 combined with update array element "
5743 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005744
Tobin Ehlis3b780662015-05-28 12:11:26 -06005745 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005746 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005747 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005748 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5749 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005750
5751 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005752 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5753 ds_pool_ci.pNext = NULL;
5754 ds_pool_ci.maxSets = 1;
5755 ds_pool_ci.poolSizeCount = 1;
5756 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005757
Tobin Ehlis3b780662015-05-28 12:11:26 -06005758 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005759 err =
5760 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005761 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005762
Tony Barboureb254902015-07-15 12:50:33 -06005763 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005764 dsl_binding.binding = 0;
5765 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5766 dsl_binding.descriptorCount = 1;
5767 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5768 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005769
5770 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005771 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5772 ds_layout_ci.pNext = NULL;
5773 ds_layout_ci.bindingCount = 1;
5774 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005775
Tobin Ehlis3b780662015-05-28 12:11:26 -06005776 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005777 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5778 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005779 ASSERT_VK_SUCCESS(err);
5780
5781 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005782 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005783 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005784 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005785 alloc_info.descriptorPool = ds_pool;
5786 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005787 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5788 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005789 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005790
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005791 // Correctly update descriptor to avoid "NOT_UPDATED" error
5792 VkDescriptorBufferInfo buff_info = {};
5793 buff_info.buffer =
5794 VkBuffer(0); // Don't care about buffer handle for this test
5795 buff_info.offset = 0;
5796 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005797
5798 VkWriteDescriptorSet descriptor_write;
5799 memset(&descriptor_write, 0, sizeof(descriptor_write));
5800 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005801 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005802 descriptor_write.dstArrayElement =
5803 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08005804 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005805 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5806 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005807
5808 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5809
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005810 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005811
Chia-I Wuf7458c52015-10-26 21:10:41 +08005812 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5813 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005814}
5815
Karl Schultz6addd812016-02-02 17:17:23 -07005816TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
5817 // Create layout w/ count of 1 and attempt update to that layout w/ binding
5818 // index 2
5819 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005820
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5822 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005823
Tobin Ehlis3b780662015-05-28 12:11:26 -06005824 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005825 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005826 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005827 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5828 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005829
5830 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005831 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5832 ds_pool_ci.pNext = NULL;
5833 ds_pool_ci.maxSets = 1;
5834 ds_pool_ci.poolSizeCount = 1;
5835 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005836
Tobin Ehlis3b780662015-05-28 12:11:26 -06005837 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005838 err =
5839 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005840 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005841
Tony Barboureb254902015-07-15 12:50:33 -06005842 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005843 dsl_binding.binding = 0;
5844 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5845 dsl_binding.descriptorCount = 1;
5846 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5847 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005848
5849 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005850 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5851 ds_layout_ci.pNext = NULL;
5852 ds_layout_ci.bindingCount = 1;
5853 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005854 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005855 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5856 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005857 ASSERT_VK_SUCCESS(err);
5858
5859 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005860 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005861 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005862 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005863 alloc_info.descriptorPool = ds_pool;
5864 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005865 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5866 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005867 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005868
Tony Barboureb254902015-07-15 12:50:33 -06005869 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005870 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5871 sampler_ci.pNext = NULL;
5872 sampler_ci.magFilter = VK_FILTER_NEAREST;
5873 sampler_ci.minFilter = VK_FILTER_NEAREST;
5874 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5875 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5876 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5877 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5878 sampler_ci.mipLodBias = 1.0;
5879 sampler_ci.anisotropyEnable = VK_FALSE;
5880 sampler_ci.maxAnisotropy = 1;
5881 sampler_ci.compareEnable = VK_FALSE;
5882 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5883 sampler_ci.minLod = 1.0;
5884 sampler_ci.maxLod = 1.0;
5885 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5886 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005887
Tobin Ehlis3b780662015-05-28 12:11:26 -06005888 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005889 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005890 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005891
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005892 VkDescriptorImageInfo info = {};
5893 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005894
5895 VkWriteDescriptorSet descriptor_write;
5896 memset(&descriptor_write, 0, sizeof(descriptor_write));
5897 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005898 descriptor_write.dstSet = descriptorSet;
5899 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005900 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005901 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005902 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005903 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005904
5905 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5906
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005907 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005908
Chia-I Wuf7458c52015-10-26 21:10:41 +08005909 vkDestroySampler(m_device->device(), sampler, NULL);
5910 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5911 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005912}
5913
Karl Schultz6addd812016-02-02 17:17:23 -07005914TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
5915 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
5916 // types
5917 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005918
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005919 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005920 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005921
Tobin Ehlis3b780662015-05-28 12:11:26 -06005922 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005923
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005924 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005925 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5926 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005927
5928 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005929 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5930 ds_pool_ci.pNext = NULL;
5931 ds_pool_ci.maxSets = 1;
5932 ds_pool_ci.poolSizeCount = 1;
5933 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005934
Tobin Ehlis3b780662015-05-28 12:11:26 -06005935 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005936 err =
5937 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005938 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005939 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005940 dsl_binding.binding = 0;
5941 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5942 dsl_binding.descriptorCount = 1;
5943 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5944 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005945
Tony Barboureb254902015-07-15 12:50:33 -06005946 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005947 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5948 ds_layout_ci.pNext = NULL;
5949 ds_layout_ci.bindingCount = 1;
5950 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005951
Tobin Ehlis3b780662015-05-28 12:11:26 -06005952 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005953 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5954 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005955 ASSERT_VK_SUCCESS(err);
5956
5957 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005958 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005959 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005960 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005961 alloc_info.descriptorPool = ds_pool;
5962 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005963 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5964 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005965 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005966
Tony Barboureb254902015-07-15 12:50:33 -06005967 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005968 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5969 sampler_ci.pNext = NULL;
5970 sampler_ci.magFilter = VK_FILTER_NEAREST;
5971 sampler_ci.minFilter = VK_FILTER_NEAREST;
5972 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5973 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5974 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5975 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5976 sampler_ci.mipLodBias = 1.0;
5977 sampler_ci.anisotropyEnable = VK_FALSE;
5978 sampler_ci.maxAnisotropy = 1;
5979 sampler_ci.compareEnable = VK_FALSE;
5980 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5981 sampler_ci.minLod = 1.0;
5982 sampler_ci.maxLod = 1.0;
5983 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5984 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005985 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005986 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005987 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005988
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005989 VkDescriptorImageInfo info = {};
5990 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005991
5992 VkWriteDescriptorSet descriptor_write;
5993 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07005994 descriptor_write.sType =
5995 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005996 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005997 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005998 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005999 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006000 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006001
6002 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6003
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006004 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006005
Chia-I Wuf7458c52015-10-26 21:10:41 +08006006 vkDestroySampler(m_device->device(), sampler, NULL);
6007 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6008 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006009}
6010
Karl Schultz6addd812016-02-02 17:17:23 -07006011TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006012 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07006013 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006014
Karl Schultz6addd812016-02-02 17:17:23 -07006015 m_errorMonitor->SetDesiredFailureMsg(
6016 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006017 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006018
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006019 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006020 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
6021 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006022 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006023 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6024 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006025
6026 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006027 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6028 ds_pool_ci.pNext = NULL;
6029 ds_pool_ci.maxSets = 1;
6030 ds_pool_ci.poolSizeCount = 1;
6031 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006032
6033 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006034 err =
6035 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006036 ASSERT_VK_SUCCESS(err);
6037
6038 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006039 dsl_binding.binding = 0;
6040 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6041 dsl_binding.descriptorCount = 1;
6042 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6043 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006044
6045 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006046 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6047 ds_layout_ci.pNext = NULL;
6048 ds_layout_ci.bindingCount = 1;
6049 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006050 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006051 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6052 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006053 ASSERT_VK_SUCCESS(err);
6054
6055 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006056 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006057 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006058 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006059 alloc_info.descriptorPool = ds_pool;
6060 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006061 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6062 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006063 ASSERT_VK_SUCCESS(err);
6064
Karl Schultz6addd812016-02-02 17:17:23 -07006065 VkSampler sampler =
6066 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006067
6068 VkDescriptorImageInfo descriptor_info;
6069 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
6070 descriptor_info.sampler = sampler;
6071
6072 VkWriteDescriptorSet descriptor_write;
6073 memset(&descriptor_write, 0, sizeof(descriptor_write));
6074 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006075 descriptor_write.dstSet = descriptorSet;
6076 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006077 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006078 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6079 descriptor_write.pImageInfo = &descriptor_info;
6080
6081 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6082
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006083 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006084
Chia-I Wuf7458c52015-10-26 21:10:41 +08006085 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6086 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006087}
6088
Karl Schultz6addd812016-02-02 17:17:23 -07006089TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
6090 // Create a single combined Image/Sampler descriptor and send it an invalid
6091 // imageView
6092 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006093
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6095 "Attempted write update to combined "
6096 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -06006097 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006098
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006099 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006100 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006101 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6102 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006103
6104 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006105 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6106 ds_pool_ci.pNext = NULL;
6107 ds_pool_ci.maxSets = 1;
6108 ds_pool_ci.poolSizeCount = 1;
6109 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006110
6111 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006112 err =
6113 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006114 ASSERT_VK_SUCCESS(err);
6115
6116 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006117 dsl_binding.binding = 0;
6118 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6119 dsl_binding.descriptorCount = 1;
6120 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6121 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006122
6123 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006124 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6125 ds_layout_ci.pNext = NULL;
6126 ds_layout_ci.bindingCount = 1;
6127 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006128 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006129 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6130 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006131 ASSERT_VK_SUCCESS(err);
6132
6133 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006134 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006135 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006136 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006137 alloc_info.descriptorPool = ds_pool;
6138 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006139 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6140 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006141 ASSERT_VK_SUCCESS(err);
6142
6143 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006144 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6145 sampler_ci.pNext = NULL;
6146 sampler_ci.magFilter = VK_FILTER_NEAREST;
6147 sampler_ci.minFilter = VK_FILTER_NEAREST;
6148 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6149 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6150 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6151 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6152 sampler_ci.mipLodBias = 1.0;
6153 sampler_ci.anisotropyEnable = VK_FALSE;
6154 sampler_ci.maxAnisotropy = 1;
6155 sampler_ci.compareEnable = VK_FALSE;
6156 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6157 sampler_ci.minLod = 1.0;
6158 sampler_ci.maxLod = 1.0;
6159 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6160 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006161
6162 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006163 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006164 ASSERT_VK_SUCCESS(err);
6165
Karl Schultz6addd812016-02-02 17:17:23 -07006166 VkImageView view =
6167 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006168
6169 VkDescriptorImageInfo descriptor_info;
6170 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
6171 descriptor_info.sampler = sampler;
6172 descriptor_info.imageView = view;
6173
6174 VkWriteDescriptorSet descriptor_write;
6175 memset(&descriptor_write, 0, sizeof(descriptor_write));
6176 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006177 descriptor_write.dstSet = descriptorSet;
6178 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006179 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006180 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6181 descriptor_write.pImageInfo = &descriptor_info;
6182
6183 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6184
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006185 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006186
Chia-I Wuf7458c52015-10-26 21:10:41 +08006187 vkDestroySampler(m_device->device(), sampler, NULL);
6188 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6189 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006190}
6191
Karl Schultz6addd812016-02-02 17:17:23 -07006192TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
6193 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
6194 // into the other
6195 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006196
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006197 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6198 " binding #1 with type "
6199 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
6200 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006201
Tobin Ehlis04356f92015-10-27 16:35:27 -06006202 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006203 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006204 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006205 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6206 ds_type_count[0].descriptorCount = 1;
6207 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
6208 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006209
6210 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006211 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6212 ds_pool_ci.pNext = NULL;
6213 ds_pool_ci.maxSets = 1;
6214 ds_pool_ci.poolSizeCount = 2;
6215 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006216
6217 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006218 err =
6219 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006220 ASSERT_VK_SUCCESS(err);
6221 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006222 dsl_binding[0].binding = 0;
6223 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6224 dsl_binding[0].descriptorCount = 1;
6225 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6226 dsl_binding[0].pImmutableSamplers = NULL;
6227 dsl_binding[1].binding = 1;
6228 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6229 dsl_binding[1].descriptorCount = 1;
6230 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
6231 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006232
6233 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006234 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6235 ds_layout_ci.pNext = NULL;
6236 ds_layout_ci.bindingCount = 2;
6237 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006238
6239 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006240 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6241 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006242 ASSERT_VK_SUCCESS(err);
6243
6244 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006245 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006246 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006247 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006248 alloc_info.descriptorPool = ds_pool;
6249 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006250 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6251 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006252 ASSERT_VK_SUCCESS(err);
6253
6254 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006255 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6256 sampler_ci.pNext = NULL;
6257 sampler_ci.magFilter = VK_FILTER_NEAREST;
6258 sampler_ci.minFilter = VK_FILTER_NEAREST;
6259 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6260 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6261 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6262 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6263 sampler_ci.mipLodBias = 1.0;
6264 sampler_ci.anisotropyEnable = VK_FALSE;
6265 sampler_ci.maxAnisotropy = 1;
6266 sampler_ci.compareEnable = VK_FALSE;
6267 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6268 sampler_ci.minLod = 1.0;
6269 sampler_ci.maxLod = 1.0;
6270 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6271 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006272
6273 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006274 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006275 ASSERT_VK_SUCCESS(err);
6276
6277 VkDescriptorImageInfo info = {};
6278 info.sampler = sampler;
6279
6280 VkWriteDescriptorSet descriptor_write;
6281 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
6282 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006283 descriptor_write.dstSet = descriptorSet;
6284 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08006285 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006286 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6287 descriptor_write.pImageInfo = &info;
6288 // This write update should succeed
6289 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6290 // Now perform a copy update that fails due to type mismatch
6291 VkCopyDescriptorSet copy_ds_update;
6292 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6293 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6294 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06006295 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006296 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006297 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08006298 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006299 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6300
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006301 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006302 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006303 m_errorMonitor->SetDesiredFailureMsg(
6304 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006305 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -06006306 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6307 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6308 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006309 copy_ds_update.srcBinding =
6310 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006311 copy_ds_update.dstSet = descriptorSet;
6312 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06006313 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006314 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6315
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006316 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006317
Tobin Ehlis04356f92015-10-27 16:35:27 -06006318 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006319 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006320 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
6321 "update array offset of 0 and update of "
6322 "5 descriptors oversteps total number "
6323 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006324
Tobin Ehlis04356f92015-10-27 16:35:27 -06006325 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6326 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6327 copy_ds_update.srcSet = descriptorSet;
6328 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006329 copy_ds_update.dstSet = descriptorSet;
6330 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006331 copy_ds_update.descriptorCount =
6332 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06006333 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6334
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006335 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006336
Chia-I Wuf7458c52015-10-26 21:10:41 +08006337 vkDestroySampler(m_device->device(), sampler, NULL);
6338 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6339 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006340}
6341
Karl Schultz6addd812016-02-02 17:17:23 -07006342TEST_F(VkLayerTest, NumSamplesMismatch) {
6343 // Create CommandBuffer where MSAA samples doesn't match RenderPass
6344 // sampleCount
6345 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006346
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006347 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006348 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006349
Tobin Ehlis3b780662015-05-28 12:11:26 -06006350 ASSERT_NO_FATAL_FAILURE(InitState());
6351 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006352 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06006353 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006354 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006355
6356 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006357 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6358 ds_pool_ci.pNext = NULL;
6359 ds_pool_ci.maxSets = 1;
6360 ds_pool_ci.poolSizeCount = 1;
6361 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006362
Tobin Ehlis3b780662015-05-28 12:11:26 -06006363 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006364 err =
6365 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006366 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006367
Tony Barboureb254902015-07-15 12:50:33 -06006368 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08006369 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06006370 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08006371 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006372 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6373 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006374
Tony Barboureb254902015-07-15 12:50:33 -06006375 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6376 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6377 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006378 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006379 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006380
Tobin Ehlis3b780662015-05-28 12:11:26 -06006381 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006382 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6383 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006384 ASSERT_VK_SUCCESS(err);
6385
6386 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006387 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006388 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006389 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006390 alloc_info.descriptorPool = ds_pool;
6391 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006392 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6393 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006394 ASSERT_VK_SUCCESS(err);
6395
Tony Barboureb254902015-07-15 12:50:33 -06006396 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006397 pipe_ms_state_ci.sType =
6398 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6399 pipe_ms_state_ci.pNext = NULL;
6400 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6401 pipe_ms_state_ci.sampleShadingEnable = 0;
6402 pipe_ms_state_ci.minSampleShading = 1.0;
6403 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006404
Tony Barboureb254902015-07-15 12:50:33 -06006405 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006406 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6407 pipeline_layout_ci.pNext = NULL;
6408 pipeline_layout_ci.setLayoutCount = 1;
6409 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006410
6411 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006412 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6413 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006414 ASSERT_VK_SUCCESS(err);
6415
Karl Schultz6addd812016-02-02 17:17:23 -07006416 VkShaderObj vs(m_device, bindStateVertShaderText,
6417 VK_SHADER_STAGE_VERTEX_BIT, this);
6418 VkShaderObj fs(m_device, bindStateFragShaderText,
6419 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006420 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006421 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006422 VkPipelineObj pipe(m_device);
6423 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006424 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006425 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006426 pipe.SetMSAA(&pipe_ms_state_ci);
6427 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006428
Tony Barbourfe3351b2015-07-28 10:17:20 -06006429 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006430 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6431 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006432
Mark Young29927482016-05-04 14:38:51 -06006433 // Render triangle (the error should trigger on the attempt to draw).
6434 Draw(3, 1, 0, 0);
6435
6436 // Finalize recording of the command buffer
6437 EndCommandBuffer();
6438
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006439 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006440
Chia-I Wuf7458c52015-10-26 21:10:41 +08006441 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6442 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6443 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006444}
Mark Young29927482016-05-04 14:38:51 -06006445
Mark Youngc89c6312016-03-31 16:03:20 -06006446TEST_F(VkLayerTest, NumBlendAttachMismatch) {
6447 // Create Pipeline where the number of blend attachments doesn't match the
6448 // number of color attachments. In this case, we don't add any color
6449 // blend attachments even though we have a color attachment.
6450 VkResult err;
6451
6452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -06006453 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -06006454
6455 ASSERT_NO_FATAL_FAILURE(InitState());
6456 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6457 VkDescriptorPoolSize ds_type_count = {};
6458 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6459 ds_type_count.descriptorCount = 1;
6460
6461 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6462 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6463 ds_pool_ci.pNext = NULL;
6464 ds_pool_ci.maxSets = 1;
6465 ds_pool_ci.poolSizeCount = 1;
6466 ds_pool_ci.pPoolSizes = &ds_type_count;
6467
6468 VkDescriptorPool ds_pool;
6469 err =
6470 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6471 ASSERT_VK_SUCCESS(err);
6472
6473 VkDescriptorSetLayoutBinding dsl_binding = {};
6474 dsl_binding.binding = 0;
6475 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6476 dsl_binding.descriptorCount = 1;
6477 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6478 dsl_binding.pImmutableSamplers = NULL;
6479
6480 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6481 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6482 ds_layout_ci.pNext = NULL;
6483 ds_layout_ci.bindingCount = 1;
6484 ds_layout_ci.pBindings = &dsl_binding;
6485
6486 VkDescriptorSetLayout ds_layout;
6487 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6488 &ds_layout);
6489 ASSERT_VK_SUCCESS(err);
6490
6491 VkDescriptorSet descriptorSet;
6492 VkDescriptorSetAllocateInfo alloc_info = {};
6493 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6494 alloc_info.descriptorSetCount = 1;
6495 alloc_info.descriptorPool = ds_pool;
6496 alloc_info.pSetLayouts = &ds_layout;
6497 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6498 &descriptorSet);
6499 ASSERT_VK_SUCCESS(err);
6500
6501 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
6502 pipe_ms_state_ci.sType =
6503 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6504 pipe_ms_state_ci.pNext = NULL;
6505 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6506 pipe_ms_state_ci.sampleShadingEnable = 0;
6507 pipe_ms_state_ci.minSampleShading = 1.0;
6508 pipe_ms_state_ci.pSampleMask = NULL;
6509
6510 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6511 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6512 pipeline_layout_ci.pNext = NULL;
6513 pipeline_layout_ci.setLayoutCount = 1;
6514 pipeline_layout_ci.pSetLayouts = &ds_layout;
6515
6516 VkPipelineLayout pipeline_layout;
6517 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6518 &pipeline_layout);
6519 ASSERT_VK_SUCCESS(err);
6520
6521 VkShaderObj vs(m_device, bindStateVertShaderText,
6522 VK_SHADER_STAGE_VERTEX_BIT, this);
6523 VkShaderObj fs(m_device, bindStateFragShaderText,
6524 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006525 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06006526 // but add it to be able to run on more devices
6527 VkPipelineObj pipe(m_device);
6528 pipe.AddShader(&vs);
6529 pipe.AddShader(&fs);
6530 pipe.SetMSAA(&pipe_ms_state_ci);
6531 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6532
6533 BeginCommandBuffer();
6534 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6535 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6536
Mark Young29927482016-05-04 14:38:51 -06006537 // Render triangle (the error should trigger on the attempt to draw).
6538 Draw(3, 1, 0, 0);
6539
6540 // Finalize recording of the command buffer
6541 EndCommandBuffer();
6542
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006543 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06006544
6545 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6546 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6547 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6548}
Mark Young29927482016-05-04 14:38:51 -06006549
Karl Schultz6addd812016-02-02 17:17:23 -07006550TEST_F(VkLayerTest, ClearCmdNoDraw) {
6551 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
6552 // to issuing a Draw
6553 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006554
Karl Schultz6addd812016-02-02 17:17:23 -07006555 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07006556 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006557 "vkCmdClearAttachments() issued on CB object ");
6558
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006559 ASSERT_NO_FATAL_FAILURE(InitState());
6560 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006561
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006562 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006563 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6564 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006565
6566 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006567 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6568 ds_pool_ci.pNext = NULL;
6569 ds_pool_ci.maxSets = 1;
6570 ds_pool_ci.poolSizeCount = 1;
6571 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006572
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006573 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006574 err =
6575 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006576 ASSERT_VK_SUCCESS(err);
6577
Tony Barboureb254902015-07-15 12:50:33 -06006578 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006579 dsl_binding.binding = 0;
6580 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6581 dsl_binding.descriptorCount = 1;
6582 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6583 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006584
Tony Barboureb254902015-07-15 12:50:33 -06006585 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006586 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6587 ds_layout_ci.pNext = NULL;
6588 ds_layout_ci.bindingCount = 1;
6589 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006590
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006591 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006592 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6593 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006594 ASSERT_VK_SUCCESS(err);
6595
6596 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006597 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006598 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006599 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006600 alloc_info.descriptorPool = ds_pool;
6601 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006602 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6603 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006604 ASSERT_VK_SUCCESS(err);
6605
Tony Barboureb254902015-07-15 12:50:33 -06006606 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006607 pipe_ms_state_ci.sType =
6608 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6609 pipe_ms_state_ci.pNext = NULL;
6610 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6611 pipe_ms_state_ci.sampleShadingEnable = 0;
6612 pipe_ms_state_ci.minSampleShading = 1.0;
6613 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006614
Tony Barboureb254902015-07-15 12:50:33 -06006615 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006616 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6617 pipeline_layout_ci.pNext = NULL;
6618 pipeline_layout_ci.setLayoutCount = 1;
6619 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006620
6621 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006622 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6623 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006624 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006625
Karl Schultz6addd812016-02-02 17:17:23 -07006626 VkShaderObj vs(m_device, bindStateVertShaderText,
6627 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006628 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006629 // on more devices
6630 VkShaderObj fs(m_device, bindStateFragShaderText,
6631 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006632
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006633 VkPipelineObj pipe(m_device);
6634 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006635 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006636 pipe.SetMSAA(&pipe_ms_state_ci);
6637 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006638
6639 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006640
Karl Schultz6addd812016-02-02 17:17:23 -07006641 // Main thing we care about for this test is that the VkImage obj we're
6642 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006643 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006644 VkClearAttachment color_attachment;
6645 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6646 color_attachment.clearValue.color.float32[0] = 1.0;
6647 color_attachment.clearValue.color.float32[1] = 1.0;
6648 color_attachment.clearValue.color.float32[2] = 1.0;
6649 color_attachment.clearValue.color.float32[3] = 1.0;
6650 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006651 VkClearRect clear_rect = {
6652 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006653
Karl Schultz6addd812016-02-02 17:17:23 -07006654 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
6655 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006656
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006657 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006658
Chia-I Wuf7458c52015-10-26 21:10:41 +08006659 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6660 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6661 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006662}
6663
Karl Schultz6addd812016-02-02 17:17:23 -07006664TEST_F(VkLayerTest, VtxBufferBadIndex) {
6665 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006666
Karl Schultz6addd812016-02-02 17:17:23 -07006667 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006668 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07006669 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006670
Tobin Ehlis502480b2015-06-24 15:53:07 -06006671 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06006672 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06006673 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006674
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006675 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006676 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6677 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006678
6679 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006680 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6681 ds_pool_ci.pNext = NULL;
6682 ds_pool_ci.maxSets = 1;
6683 ds_pool_ci.poolSizeCount = 1;
6684 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006685
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006686 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006687 err =
6688 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006689 ASSERT_VK_SUCCESS(err);
6690
Tony Barboureb254902015-07-15 12:50:33 -06006691 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006692 dsl_binding.binding = 0;
6693 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6694 dsl_binding.descriptorCount = 1;
6695 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6696 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006697
Tony Barboureb254902015-07-15 12:50:33 -06006698 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006699 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6700 ds_layout_ci.pNext = NULL;
6701 ds_layout_ci.bindingCount = 1;
6702 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006703
Tobin Ehlis502480b2015-06-24 15:53:07 -06006704 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006705 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6706 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006707 ASSERT_VK_SUCCESS(err);
6708
6709 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006710 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006711 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006712 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006713 alloc_info.descriptorPool = ds_pool;
6714 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006715 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6716 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006717 ASSERT_VK_SUCCESS(err);
6718
Tony Barboureb254902015-07-15 12:50:33 -06006719 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006720 pipe_ms_state_ci.sType =
6721 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6722 pipe_ms_state_ci.pNext = NULL;
6723 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6724 pipe_ms_state_ci.sampleShadingEnable = 0;
6725 pipe_ms_state_ci.minSampleShading = 1.0;
6726 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006727
Tony Barboureb254902015-07-15 12:50:33 -06006728 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006729 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6730 pipeline_layout_ci.pNext = NULL;
6731 pipeline_layout_ci.setLayoutCount = 1;
6732 pipeline_layout_ci.pSetLayouts = &ds_layout;
6733 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006734
Karl Schultz6addd812016-02-02 17:17:23 -07006735 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6736 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006737 ASSERT_VK_SUCCESS(err);
6738
Karl Schultz6addd812016-02-02 17:17:23 -07006739 VkShaderObj vs(m_device, bindStateVertShaderText,
6740 VK_SHADER_STAGE_VERTEX_BIT, this);
6741 VkShaderObj fs(m_device, bindStateFragShaderText,
6742 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006743 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006744 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006745 VkPipelineObj pipe(m_device);
6746 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006747 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006748 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006749 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006750 pipe.SetViewport(m_viewports);
6751 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006752 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006753
6754 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006755 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6756 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006757 // Don't care about actual data, just need to get to draw to flag error
6758 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07006759 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
6760 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006761 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06006762 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006763
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006764 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006765
Chia-I Wuf7458c52015-10-26 21:10:41 +08006766 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6767 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6768 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006769}
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06006770// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
6771TEST_F(VkLayerTest, InvalidImageLayout) {
6772 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
6773 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
6774 "images in the wrong layout when they're copied or transitioned.");
6775 // 3 in ValidateCmdBufImageLayouts
6776 // * -1 Attempt to submit cmd buf w/ deleted image
6777 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
6778 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
6779 m_errorMonitor->SetDesiredFailureMsg(
6780 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6781 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
6782
6783 ASSERT_NO_FATAL_FAILURE(InitState());
6784 // Create src & dst images to use for copy operations
6785 VkImage src_image;
6786 VkImage dst_image;
6787
6788 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6789 const int32_t tex_width = 32;
6790 const int32_t tex_height = 32;
6791
6792 VkImageCreateInfo image_create_info = {};
6793 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6794 image_create_info.pNext = NULL;
6795 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6796 image_create_info.format = tex_format;
6797 image_create_info.extent.width = tex_width;
6798 image_create_info.extent.height = tex_height;
6799 image_create_info.extent.depth = 1;
6800 image_create_info.mipLevels = 1;
6801 image_create_info.arrayLayers = 4;
6802 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6803 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6804 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6805 image_create_info.flags = 0;
6806
6807 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
6808 ASSERT_VK_SUCCESS(err);
6809 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
6810 ASSERT_VK_SUCCESS(err);
6811
6812 BeginCommandBuffer();
6813 VkImageCopy copyRegion;
6814 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6815 copyRegion.srcSubresource.mipLevel = 0;
6816 copyRegion.srcSubresource.baseArrayLayer = 0;
6817 copyRegion.srcSubresource.layerCount = 1;
6818 copyRegion.srcOffset.x = 0;
6819 copyRegion.srcOffset.y = 0;
6820 copyRegion.srcOffset.z = 0;
6821 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6822 copyRegion.dstSubresource.mipLevel = 0;
6823 copyRegion.dstSubresource.baseArrayLayer = 0;
6824 copyRegion.dstSubresource.layerCount = 1;
6825 copyRegion.dstOffset.x = 0;
6826 copyRegion.dstOffset.y = 0;
6827 copyRegion.dstOffset.z = 0;
6828 copyRegion.extent.width = 1;
6829 copyRegion.extent.height = 1;
6830 copyRegion.extent.depth = 1;
6831 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6832 m_errorMonitor->VerifyFound();
6833 // Now cause error due to src image layout changing
6834 m_errorMonitor->SetDesiredFailureMsg(
6835 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6836 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
6837 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6838 m_errorMonitor->VerifyFound();
6839 // Final src error is due to bad layout type
6840 m_errorMonitor->SetDesiredFailureMsg(
6841 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6842 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
6843 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6844 m_errorMonitor->VerifyFound();
6845 // Now verify same checks for dst
6846 m_errorMonitor->SetDesiredFailureMsg(
6847 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6848 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
6849 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6850 m_errorMonitor->VerifyFound();
6851 // Now cause error due to src image layout changing
6852 m_errorMonitor->SetDesiredFailureMsg(
6853 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6854 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
6855 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
6856 m_errorMonitor->VerifyFound();
6857 m_errorMonitor->SetDesiredFailureMsg(
6858 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6859 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
6860 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
6861 m_errorMonitor->VerifyFound();
6862 // Now cause error due to bad image layout transition in PipelineBarrier
6863 VkImageMemoryBarrier image_barrier[1] = {};
6864 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
6865 image_barrier[0].image = src_image;
6866 image_barrier[0].subresourceRange.layerCount = 2;
6867 image_barrier[0].subresourceRange.levelCount = 2;
6868 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6869 m_errorMonitor->SetDesiredFailureMsg(
6870 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6871 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
6872 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
6873 m_errorMonitor->VerifyFound();
6874
6875 // Finally some layout errors at RenderPass create time
6876 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
6877 VkAttachmentReference attach = {};
6878 // perf warning for GENERAL layout w/ non-DS input attachment
6879 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
6880 VkSubpassDescription subpass = {};
6881 subpass.inputAttachmentCount = 1;
6882 subpass.pInputAttachments = &attach;
6883 VkRenderPassCreateInfo rpci = {};
6884 rpci.subpassCount = 1;
6885 rpci.pSubpasses = &subpass;
6886 rpci.attachmentCount = 1;
6887 VkAttachmentDescription attach_desc = {};
6888 attach_desc.format = VK_FORMAT_UNDEFINED;
6889 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -06006890 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06006891 VkRenderPass rp;
6892 m_errorMonitor->SetDesiredFailureMsg(
6893 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6894 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
6895 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6896 m_errorMonitor->VerifyFound();
6897 // error w/ non-general layout
6898 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
6899
6900 m_errorMonitor->SetDesiredFailureMsg(
6901 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6902 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
6903 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6904 m_errorMonitor->VerifyFound();
6905 subpass.inputAttachmentCount = 0;
6906 subpass.colorAttachmentCount = 1;
6907 subpass.pColorAttachments = &attach;
6908 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
6909 // perf warning for GENERAL layout on color attachment
6910 m_errorMonitor->SetDesiredFailureMsg(
6911 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6912 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
6913 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6914 m_errorMonitor->VerifyFound();
6915 // error w/ non-color opt or GENERAL layout for color attachment
6916 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
6917 m_errorMonitor->SetDesiredFailureMsg(
6918 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6919 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
6920 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6921 m_errorMonitor->VerifyFound();
6922 subpass.colorAttachmentCount = 0;
6923 subpass.pDepthStencilAttachment = &attach;
6924 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
6925 // perf warning for GENERAL layout on DS attachment
6926 m_errorMonitor->SetDesiredFailureMsg(
6927 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6928 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
6929 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6930 m_errorMonitor->VerifyFound();
6931 // error w/ non-ds opt or GENERAL layout for color attachment
6932 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
6933 m_errorMonitor->SetDesiredFailureMsg(
6934 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6935 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
6936 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6937 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -06006938 // For this error we need a valid renderpass so create default one
6939 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
6940 attach.attachment = 0;
6941 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
6942 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
6943 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
6944 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
6945 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
6946 // Can't do a CLEAR load on READ_ONLY initialLayout
6947 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
6948 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
6949 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
6950 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6951 " with invalid first layout "
6952 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
6953 "ONLY_OPTIMAL");
6954 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6955 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06006956
6957 vkDestroyImage(m_device->device(), src_image, NULL);
6958 vkDestroyImage(m_device->device(), dst_image, NULL);
6959}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006960#endif // DRAW_STATE_TESTS
6961
Tobin Ehlis0788f522015-05-26 16:11:58 -06006962#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06006963#if GTEST_IS_THREADSAFE
6964struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006965 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006966 VkEvent event;
6967 bool bailout;
6968};
6969
Karl Schultz6addd812016-02-02 17:17:23 -07006970extern "C" void *AddToCommandBuffer(void *arg) {
6971 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006972
Karl Schultz6addd812016-02-02 17:17:23 -07006973 for (int i = 0; i < 10000; i++) {
6974 vkCmdSetEvent(data->commandBuffer, data->event,
6975 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006976 if (data->bailout) {
6977 break;
6978 }
6979 }
6980 return NULL;
6981}
6982
Karl Schultz6addd812016-02-02 17:17:23 -07006983TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006984 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006985
Karl Schultz6addd812016-02-02 17:17:23 -07006986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6987 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006988
Mike Stroyanaccf7692015-05-12 16:00:45 -06006989 ASSERT_NO_FATAL_FAILURE(InitState());
6990 ASSERT_NO_FATAL_FAILURE(InitViewport());
6991 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6992
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006993 // Calls AllocateCommandBuffers
6994 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006995
6996 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006997 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006998
6999 VkEventCreateInfo event_info;
7000 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007001 VkResult err;
7002
7003 memset(&event_info, 0, sizeof(event_info));
7004 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
7005
Chia-I Wuf7458c52015-10-26 21:10:41 +08007006 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007007 ASSERT_VK_SUCCESS(err);
7008
Mike Stroyanaccf7692015-05-12 16:00:45 -06007009 err = vkResetEvent(device(), event);
7010 ASSERT_VK_SUCCESS(err);
7011
7012 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007013 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007014 data.event = event;
7015 data.bailout = false;
7016 m_errorMonitor->SetBailout(&data.bailout);
7017 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007018 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007019 // Add many entries to command buffer from this thread at the same time.
7020 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06007021
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007022 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007023 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007024
Mike Stroyan10b8cb72016-01-22 15:22:03 -07007025 m_errorMonitor->SetBailout(NULL);
7026
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007027 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007028
Chia-I Wuf7458c52015-10-26 21:10:41 +08007029 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007030}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007031#endif // GTEST_IS_THREADSAFE
7032#endif // THREADING_TESTS
7033
Chris Forbes9f7ff632015-05-25 11:13:08 +12007034#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007035TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007037 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007038
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007039 ASSERT_NO_FATAL_FAILURE(InitState());
7040 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7041
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007042 VkShaderModule module;
7043 VkShaderModuleCreateInfo moduleCreateInfo;
7044 struct icd_spv_header spv;
7045
7046 spv.magic = ICD_SPV_MAGIC;
7047 spv.version = ICD_SPV_VERSION;
7048 spv.gen_magic = 0;
7049
7050 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7051 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007052 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007053 moduleCreateInfo.codeSize = 4;
7054 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007055 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007056
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007057 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007058}
7059
Karl Schultz6addd812016-02-02 17:17:23 -07007060TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007062 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007063
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007064 ASSERT_NO_FATAL_FAILURE(InitState());
7065 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7066
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007067 VkShaderModule module;
7068 VkShaderModuleCreateInfo moduleCreateInfo;
7069 struct icd_spv_header spv;
7070
7071 spv.magic = ~ICD_SPV_MAGIC;
7072 spv.version = ICD_SPV_VERSION;
7073 spv.gen_magic = 0;
7074
7075 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7076 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007077 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007078 moduleCreateInfo.codeSize = sizeof(spv) + 10;
7079 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007080 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007081
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007082 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007083}
7084
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007085#if 0
7086// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07007087TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007089 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007090
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007091 ASSERT_NO_FATAL_FAILURE(InitState());
7092 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7093
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007094 VkShaderModule module;
7095 VkShaderModuleCreateInfo moduleCreateInfo;
7096 struct icd_spv_header spv;
7097
7098 spv.magic = ICD_SPV_MAGIC;
7099 spv.version = ~ICD_SPV_VERSION;
7100 spv.gen_magic = 0;
7101
7102 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7103 moduleCreateInfo.pNext = NULL;
7104
Karl Schultz6addd812016-02-02 17:17:23 -07007105 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007106 moduleCreateInfo.codeSize = sizeof(spv) + 10;
7107 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007108 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007109
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007110 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007111}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007112#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007113
Karl Schultz6addd812016-02-02 17:17:23 -07007114TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007115 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007116 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007117
Chris Forbes9f7ff632015-05-25 11:13:08 +12007118 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007119 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12007120
7121 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007122 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12007123 "\n"
7124 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007125 "out gl_PerVertex {\n"
7126 " vec4 gl_Position;\n"
7127 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12007128 "void main(){\n"
7129 " gl_Position = vec4(1);\n"
7130 " x = 0;\n"
7131 "}\n";
7132 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007133 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12007134 "\n"
7135 "layout(location=0) out vec4 color;\n"
7136 "void main(){\n"
7137 " color = vec4(1);\n"
7138 "}\n";
7139
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007140 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7141 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12007142
7143 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007144 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12007145 pipe.AddShader(&vs);
7146 pipe.AddShader(&fs);
7147
Chris Forbes9f7ff632015-05-25 11:13:08 +12007148 VkDescriptorSetObj descriptorSet(m_device);
7149 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007150 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12007151
Tony Barbour5781e8f2015-08-04 16:23:11 -06007152 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12007153
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007154 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12007155}
Chris Forbes9f7ff632015-05-25 11:13:08 +12007156
Karl Schultz6addd812016-02-02 17:17:23 -07007157TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007158 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007159 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007160
Chris Forbes59cb88d2015-05-25 11:13:13 +12007161 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007162 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12007163
7164 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007165 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12007166 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007167 "out gl_PerVertex {\n"
7168 " vec4 gl_Position;\n"
7169 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12007170 "void main(){\n"
7171 " gl_Position = vec4(1);\n"
7172 "}\n";
7173 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007174 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12007175 "\n"
7176 "layout(location=0) in float x;\n"
7177 "layout(location=0) out vec4 color;\n"
7178 "void main(){\n"
7179 " color = vec4(x);\n"
7180 "}\n";
7181
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007182 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7183 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12007184
7185 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007186 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12007187 pipe.AddShader(&vs);
7188 pipe.AddShader(&fs);
7189
Chris Forbes59cb88d2015-05-25 11:13:13 +12007190 VkDescriptorSetObj descriptorSet(m_device);
7191 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007192 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12007193
Tony Barbour5781e8f2015-08-04 16:23:11 -06007194 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12007195
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007196 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12007197}
7198
Karl Schultz6addd812016-02-02 17:17:23 -07007199TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13007200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007201 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13007202
7203 ASSERT_NO_FATAL_FAILURE(InitState());
7204 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7205
7206 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007207 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007208 "\n"
7209 "out gl_PerVertex {\n"
7210 " vec4 gl_Position;\n"
7211 "};\n"
7212 "void main(){\n"
7213 " gl_Position = vec4(1);\n"
7214 "}\n";
7215 char const *fsSource =
7216 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007217 "\n"
7218 "in block { layout(location=0) float x; } ins;\n"
7219 "layout(location=0) out vec4 color;\n"
7220 "void main(){\n"
7221 " color = vec4(ins.x);\n"
7222 "}\n";
7223
7224 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7225 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7226
7227 VkPipelineObj pipe(m_device);
7228 pipe.AddColorAttachment();
7229 pipe.AddShader(&vs);
7230 pipe.AddShader(&fs);
7231
7232 VkDescriptorSetObj descriptorSet(m_device);
7233 descriptorSet.AppendDummy();
7234 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7235
7236 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7237
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007238 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13007239}
7240
Karl Schultz6addd812016-02-02 17:17:23 -07007241TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13007242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13007243 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07007244 "output arr[2] of float32' vs 'ptr to "
7245 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13007246
7247 ASSERT_NO_FATAL_FAILURE(InitState());
7248 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7249
7250 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007251 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13007252 "\n"
7253 "layout(location=0) out float x[2];\n"
7254 "out gl_PerVertex {\n"
7255 " vec4 gl_Position;\n"
7256 "};\n"
7257 "void main(){\n"
7258 " x[0] = 0; x[1] = 0;\n"
7259 " gl_Position = vec4(1);\n"
7260 "}\n";
7261 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007262 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13007263 "\n"
7264 "layout(location=0) in float x[3];\n"
7265 "layout(location=0) out vec4 color;\n"
7266 "void main(){\n"
7267 " color = vec4(x[0] + x[1] + x[2]);\n"
7268 "}\n";
7269
7270 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7271 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7272
7273 VkPipelineObj pipe(m_device);
7274 pipe.AddColorAttachment();
7275 pipe.AddShader(&vs);
7276 pipe.AddShader(&fs);
7277
7278 VkDescriptorSetObj descriptorSet(m_device);
7279 descriptorSet.AppendDummy();
7280 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7281
7282 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7283
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007284 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13007285}
7286
Karl Schultz6addd812016-02-02 17:17:23 -07007287TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007289 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007290
Chris Forbesb56af562015-05-25 11:13:17 +12007291 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007292 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12007293
7294 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007295 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007296 "\n"
7297 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007298 "out gl_PerVertex {\n"
7299 " vec4 gl_Position;\n"
7300 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007301 "void main(){\n"
7302 " x = 0;\n"
7303 " gl_Position = vec4(1);\n"
7304 "}\n";
7305 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007306 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007307 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007308 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12007309 "layout(location=0) out vec4 color;\n"
7310 "void main(){\n"
7311 " color = vec4(x);\n"
7312 "}\n";
7313
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007314 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7315 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12007316
7317 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007318 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12007319 pipe.AddShader(&vs);
7320 pipe.AddShader(&fs);
7321
Chris Forbesb56af562015-05-25 11:13:17 +12007322 VkDescriptorSetObj descriptorSet(m_device);
7323 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007324 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12007325
Tony Barbour5781e8f2015-08-04 16:23:11 -06007326 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12007327
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007328 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12007329}
7330
Karl Schultz6addd812016-02-02 17:17:23 -07007331TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13007332 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007333 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13007334
7335 ASSERT_NO_FATAL_FAILURE(InitState());
7336 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7337
7338 char const *vsSource =
7339 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007340 "\n"
7341 "out block { layout(location=0) int x; } outs;\n"
7342 "out gl_PerVertex {\n"
7343 " vec4 gl_Position;\n"
7344 "};\n"
7345 "void main(){\n"
7346 " outs.x = 0;\n"
7347 " gl_Position = vec4(1);\n"
7348 "}\n";
7349 char const *fsSource =
7350 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007351 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007352 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13007353 "layout(location=0) out vec4 color;\n"
7354 "void main(){\n"
7355 " color = vec4(ins.x);\n"
7356 "}\n";
7357
7358 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7359 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7360
7361 VkPipelineObj pipe(m_device);
7362 pipe.AddColorAttachment();
7363 pipe.AddShader(&vs);
7364 pipe.AddShader(&fs);
7365
7366 VkDescriptorSetObj descriptorSet(m_device);
7367 descriptorSet.AppendDummy();
7368 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7369
7370 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7371
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007372 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13007373}
7374
7375TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
7376 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7377 "location 0.0 which is not written by vertex shader");
7378
7379 ASSERT_NO_FATAL_FAILURE(InitState());
7380 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7381
7382 char const *vsSource =
7383 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007384 "\n"
7385 "out block { layout(location=1) float x; } outs;\n"
7386 "out gl_PerVertex {\n"
7387 " vec4 gl_Position;\n"
7388 "};\n"
7389 "void main(){\n"
7390 " outs.x = 0;\n"
7391 " gl_Position = vec4(1);\n"
7392 "}\n";
7393 char const *fsSource =
7394 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007395 "\n"
7396 "in block { layout(location=0) float x; } ins;\n"
7397 "layout(location=0) out vec4 color;\n"
7398 "void main(){\n"
7399 " color = vec4(ins.x);\n"
7400 "}\n";
7401
7402 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7403 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7404
7405 VkPipelineObj pipe(m_device);
7406 pipe.AddColorAttachment();
7407 pipe.AddShader(&vs);
7408 pipe.AddShader(&fs);
7409
7410 VkDescriptorSetObj descriptorSet(m_device);
7411 descriptorSet.AppendDummy();
7412 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7413
7414 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7415
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007416 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13007417}
7418
7419TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
7420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7421 "location 0.1 which is not written by vertex shader");
7422
7423 ASSERT_NO_FATAL_FAILURE(InitState());
7424 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7425
7426 char const *vsSource =
7427 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007428 "\n"
7429 "out block { layout(location=0, component=0) float x; } outs;\n"
7430 "out gl_PerVertex {\n"
7431 " vec4 gl_Position;\n"
7432 "};\n"
7433 "void main(){\n"
7434 " outs.x = 0;\n"
7435 " gl_Position = vec4(1);\n"
7436 "}\n";
7437 char const *fsSource =
7438 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007439 "\n"
7440 "in block { layout(location=0, component=1) float x; } ins;\n"
7441 "layout(location=0) out vec4 color;\n"
7442 "void main(){\n"
7443 " color = vec4(ins.x);\n"
7444 "}\n";
7445
7446 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7447 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7448
7449 VkPipelineObj pipe(m_device);
7450 pipe.AddColorAttachment();
7451 pipe.AddShader(&vs);
7452 pipe.AddShader(&fs);
7453
7454 VkDescriptorSetObj descriptorSet(m_device);
7455 descriptorSet.AppendDummy();
7456 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7457
7458 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7459
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007460 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13007461}
7462
Karl Schultz6addd812016-02-02 17:17:23 -07007463TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007465 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007466
Chris Forbesde136e02015-05-25 11:13:28 +12007467 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007468 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12007469
7470 VkVertexInputBindingDescription input_binding;
7471 memset(&input_binding, 0, sizeof(input_binding));
7472
7473 VkVertexInputAttributeDescription input_attrib;
7474 memset(&input_attrib, 0, sizeof(input_attrib));
7475 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7476
7477 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007478 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007479 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007480 "out gl_PerVertex {\n"
7481 " vec4 gl_Position;\n"
7482 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007483 "void main(){\n"
7484 " gl_Position = vec4(1);\n"
7485 "}\n";
7486 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007487 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007488 "\n"
7489 "layout(location=0) out vec4 color;\n"
7490 "void main(){\n"
7491 " color = vec4(1);\n"
7492 "}\n";
7493
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007494 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7495 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12007496
7497 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007498 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12007499 pipe.AddShader(&vs);
7500 pipe.AddShader(&fs);
7501
7502 pipe.AddVertexInputBindings(&input_binding, 1);
7503 pipe.AddVertexInputAttribs(&input_attrib, 1);
7504
Chris Forbesde136e02015-05-25 11:13:28 +12007505 VkDescriptorSetObj descriptorSet(m_device);
7506 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007507 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12007508
Tony Barbour5781e8f2015-08-04 16:23:11 -06007509 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12007510
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007511 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12007512}
7513
Karl Schultz6addd812016-02-02 17:17:23 -07007514TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007516 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13007517
7518 ASSERT_NO_FATAL_FAILURE(InitState());
7519 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7520
7521 VkVertexInputBindingDescription input_binding;
7522 memset(&input_binding, 0, sizeof(input_binding));
7523
7524 VkVertexInputAttributeDescription input_attrib;
7525 memset(&input_attrib, 0, sizeof(input_attrib));
7526 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7527
7528 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007529 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007530 "\n"
7531 "layout(location=1) in float x;\n"
7532 "out gl_PerVertex {\n"
7533 " vec4 gl_Position;\n"
7534 "};\n"
7535 "void main(){\n"
7536 " gl_Position = vec4(x);\n"
7537 "}\n";
7538 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007539 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007540 "\n"
7541 "layout(location=0) out vec4 color;\n"
7542 "void main(){\n"
7543 " color = vec4(1);\n"
7544 "}\n";
7545
7546 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7547 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7548
7549 VkPipelineObj pipe(m_device);
7550 pipe.AddColorAttachment();
7551 pipe.AddShader(&vs);
7552 pipe.AddShader(&fs);
7553
7554 pipe.AddVertexInputBindings(&input_binding, 1);
7555 pipe.AddVertexInputAttribs(&input_attrib, 1);
7556
7557 VkDescriptorSetObj descriptorSet(m_device);
7558 descriptorSet.AppendDummy();
7559 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7560
7561 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7562
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007563 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13007564}
7565
Karl Schultz6addd812016-02-02 17:17:23 -07007566TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
7567 m_errorMonitor->SetDesiredFailureMsg(
7568 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007569 "VS consumes input at location 0 but not provided");
7570
Chris Forbes62e8e502015-05-25 11:13:29 +12007571 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007572 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12007573
7574 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007575 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007576 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007577 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07007578 "out gl_PerVertex {\n"
7579 " vec4 gl_Position;\n"
7580 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007581 "void main(){\n"
7582 " gl_Position = x;\n"
7583 "}\n";
7584 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007585 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007586 "\n"
7587 "layout(location=0) out vec4 color;\n"
7588 "void main(){\n"
7589 " color = vec4(1);\n"
7590 "}\n";
7591
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007592 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7593 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12007594
7595 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007596 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12007597 pipe.AddShader(&vs);
7598 pipe.AddShader(&fs);
7599
Chris Forbes62e8e502015-05-25 11:13:29 +12007600 VkDescriptorSetObj descriptorSet(m_device);
7601 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007602 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12007603
Tony Barbour5781e8f2015-08-04 16:23:11 -06007604 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12007605
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007606 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12007607}
7608
Karl Schultz6addd812016-02-02 17:17:23 -07007609TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
7610 m_errorMonitor->SetDesiredFailureMsg(
7611 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007612 "location 0 does not match VS input type");
7613
Chris Forbesc97d98e2015-05-25 11:13:31 +12007614 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007615 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12007616
7617 VkVertexInputBindingDescription input_binding;
7618 memset(&input_binding, 0, sizeof(input_binding));
7619
7620 VkVertexInputAttributeDescription input_attrib;
7621 memset(&input_attrib, 0, sizeof(input_attrib));
7622 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7623
7624 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007625 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007626 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007627 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007628 "out gl_PerVertex {\n"
7629 " vec4 gl_Position;\n"
7630 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007631 "void main(){\n"
7632 " gl_Position = vec4(x);\n"
7633 "}\n";
7634 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007635 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007636 "\n"
7637 "layout(location=0) out vec4 color;\n"
7638 "void main(){\n"
7639 " color = vec4(1);\n"
7640 "}\n";
7641
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007642 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7643 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12007644
7645 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007646 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12007647 pipe.AddShader(&vs);
7648 pipe.AddShader(&fs);
7649
7650 pipe.AddVertexInputBindings(&input_binding, 1);
7651 pipe.AddVertexInputAttribs(&input_attrib, 1);
7652
Chris Forbesc97d98e2015-05-25 11:13:31 +12007653 VkDescriptorSetObj descriptorSet(m_device);
7654 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007655 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12007656
Tony Barbour5781e8f2015-08-04 16:23:11 -06007657 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12007658
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007659 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12007660}
7661
Chris Forbesc68b43c2016-04-06 11:18:47 +12007662TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
7663 m_errorMonitor->SetDesiredFailureMsg(
7664 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7665 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
7666
7667 ASSERT_NO_FATAL_FAILURE(InitState());
7668 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7669
7670 char const *vsSource =
7671 "#version 450\n"
7672 "\n"
7673 "out gl_PerVertex {\n"
7674 " vec4 gl_Position;\n"
7675 "};\n"
7676 "void main(){\n"
7677 " gl_Position = vec4(1);\n"
7678 "}\n";
7679 char const *fsSource =
7680 "#version 450\n"
7681 "\n"
7682 "layout(location=0) out vec4 color;\n"
7683 "void main(){\n"
7684 " color = vec4(1);\n"
7685 "}\n";
7686
7687 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7688 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7689
7690 VkPipelineObj pipe(m_device);
7691 pipe.AddColorAttachment();
7692 pipe.AddShader(&vs);
7693 pipe.AddShader(&vs);
7694 pipe.AddShader(&fs);
7695
7696 VkDescriptorSetObj descriptorSet(m_device);
7697 descriptorSet.AppendDummy();
7698 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7699
7700 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7701
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007702 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12007703}
7704
Karl Schultz6addd812016-02-02 17:17:23 -07007705TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007706 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007707
7708 ASSERT_NO_FATAL_FAILURE(InitState());
7709 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7710
7711 VkVertexInputBindingDescription input_binding;
7712 memset(&input_binding, 0, sizeof(input_binding));
7713
7714 VkVertexInputAttributeDescription input_attribs[2];
7715 memset(input_attribs, 0, sizeof(input_attribs));
7716
7717 for (int i = 0; i < 2; i++) {
7718 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7719 input_attribs[i].location = i;
7720 }
7721
7722 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007723 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007724 "\n"
7725 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007726 "out gl_PerVertex {\n"
7727 " vec4 gl_Position;\n"
7728 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007729 "void main(){\n"
7730 " gl_Position = x[0] + x[1];\n"
7731 "}\n";
7732 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007733 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007734 "\n"
7735 "layout(location=0) out vec4 color;\n"
7736 "void main(){\n"
7737 " color = vec4(1);\n"
7738 "}\n";
7739
7740 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7741 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7742
7743 VkPipelineObj pipe(m_device);
7744 pipe.AddColorAttachment();
7745 pipe.AddShader(&vs);
7746 pipe.AddShader(&fs);
7747
7748 pipe.AddVertexInputBindings(&input_binding, 1);
7749 pipe.AddVertexInputAttribs(input_attribs, 2);
7750
7751 VkDescriptorSetObj descriptorSet(m_device);
7752 descriptorSet.AppendDummy();
7753 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7754
7755 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7756
7757 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007758 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007759}
7760
Chris Forbes2682b242015-11-24 11:13:14 +13007761TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
7762{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007763 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007764
7765 ASSERT_NO_FATAL_FAILURE(InitState());
7766 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7767
7768 VkVertexInputBindingDescription input_binding;
7769 memset(&input_binding, 0, sizeof(input_binding));
7770
7771 VkVertexInputAttributeDescription input_attribs[2];
7772 memset(input_attribs, 0, sizeof(input_attribs));
7773
7774 for (int i = 0; i < 2; i++) {
7775 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7776 input_attribs[i].location = i;
7777 }
7778
7779 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007780 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007781 "\n"
7782 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07007783 "out gl_PerVertex {\n"
7784 " vec4 gl_Position;\n"
7785 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007786 "void main(){\n"
7787 " gl_Position = x[0] + x[1];\n"
7788 "}\n";
7789 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007790 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007791 "\n"
7792 "layout(location=0) out vec4 color;\n"
7793 "void main(){\n"
7794 " color = vec4(1);\n"
7795 "}\n";
7796
7797 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7798 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7799
7800 VkPipelineObj pipe(m_device);
7801 pipe.AddColorAttachment();
7802 pipe.AddShader(&vs);
7803 pipe.AddShader(&fs);
7804
7805 pipe.AddVertexInputBindings(&input_binding, 1);
7806 pipe.AddVertexInputAttribs(input_attribs, 2);
7807
7808 VkDescriptorSetObj descriptorSet(m_device);
7809 descriptorSet.AppendDummy();
7810 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7811
7812 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7813
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007814 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007815}
Chris Forbes2682b242015-11-24 11:13:14 +13007816
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007817TEST_F(VkLayerTest, CreatePipelineSimplePositive)
7818{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007819 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007820
7821 ASSERT_NO_FATAL_FAILURE(InitState());
7822 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7823
7824 char const *vsSource =
7825 "#version 450\n"
7826 "out gl_PerVertex {\n"
7827 " vec4 gl_Position;\n"
7828 "};\n"
7829 "void main(){\n"
7830 " gl_Position = vec4(0);\n"
7831 "}\n";
7832 char const *fsSource =
7833 "#version 450\n"
7834 "\n"
7835 "layout(location=0) out vec4 color;\n"
7836 "void main(){\n"
7837 " color = vec4(1);\n"
7838 "}\n";
7839
7840 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7841 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7842
7843 VkPipelineObj pipe(m_device);
7844 pipe.AddColorAttachment();
7845 pipe.AddShader(&vs);
7846 pipe.AddShader(&fs);
7847
7848 VkDescriptorSetObj descriptorSet(m_device);
7849 descriptorSet.AppendDummy();
7850 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7851
7852 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7853
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007854 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007855}
7856
Chris Forbes912c9192016-04-05 17:50:35 +12007857TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
7858{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007859 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12007860
7861 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
7862
7863 ASSERT_NO_FATAL_FAILURE(InitState());
7864 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7865
7866 char const *vsSource =
7867 "#version 450\n"
7868 "out gl_PerVertex {\n"
7869 " vec4 gl_Position;\n"
7870 "};\n"
7871 "layout(location=0) out vec3 x;\n"
7872 "layout(location=1) out ivec3 y;\n"
7873 "layout(location=2) out vec3 z;\n"
7874 "void main(){\n"
7875 " gl_Position = vec4(0);\n"
7876 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
7877 "}\n";
7878 char const *fsSource =
7879 "#version 450\n"
7880 "\n"
7881 "layout(location=0) out vec4 color;\n"
7882 "layout(location=0) in float x;\n"
7883 "layout(location=1) flat in int y;\n"
7884 "layout(location=2) in vec2 z;\n"
7885 "void main(){\n"
7886 " color = vec4(1 + x + y + z.x);\n"
7887 "}\n";
7888
7889 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7890 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7891
7892 VkPipelineObj pipe(m_device);
7893 pipe.AddColorAttachment();
7894 pipe.AddShader(&vs);
7895 pipe.AddShader(&fs);
7896
7897 VkDescriptorSetObj descriptorSet(m_device);
7898 descriptorSet.AppendDummy();
7899 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7900
7901 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7902
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007903 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12007904}
7905
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007906TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
7907{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007908 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007909
7910 ASSERT_NO_FATAL_FAILURE(InitState());
7911 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7912
Chris Forbesc1e852d2016-04-04 19:26:42 +12007913 if (!m_device->phy().features().tessellationShader) {
7914 printf("Device does not support tessellation shaders; skipped.\n");
7915 return;
7916 }
7917
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007918 char const *vsSource =
7919 "#version 450\n"
7920 "void main(){}\n";
7921 char const *tcsSource =
7922 "#version 450\n"
7923 "layout(location=0) out int x[];\n"
7924 "layout(vertices=3) out;\n"
7925 "void main(){\n"
7926 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7927 " gl_TessLevelInner[0] = 1;\n"
7928 " x[gl_InvocationID] = gl_InvocationID;\n"
7929 "}\n";
7930 char const *tesSource =
7931 "#version 450\n"
7932 "layout(triangles, equal_spacing, cw) in;\n"
7933 "layout(location=0) in int x[];\n"
7934 "out gl_PerVertex { vec4 gl_Position; };\n"
7935 "void main(){\n"
7936 " gl_Position.xyz = gl_TessCoord;\n"
7937 " gl_Position.w = x[0] + x[1] + x[2];\n"
7938 "}\n";
7939 char const *fsSource =
7940 "#version 450\n"
7941 "layout(location=0) out vec4 color;\n"
7942 "void main(){\n"
7943 " color = vec4(1);\n"
7944 "}\n";
7945
7946 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7947 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7948 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7949 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7950
7951 VkPipelineInputAssemblyStateCreateInfo iasci{
7952 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7953 nullptr,
7954 0,
7955 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7956 VK_FALSE};
7957
Chris Forbesb4cacb62016-04-04 19:15:00 +12007958 VkPipelineTessellationStateCreateInfo tsci{
7959 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7960 nullptr,
7961 0,
7962 3};
7963
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007964 VkPipelineObj pipe(m_device);
7965 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12007966 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007967 pipe.AddColorAttachment();
7968 pipe.AddShader(&vs);
7969 pipe.AddShader(&tcs);
7970 pipe.AddShader(&tes);
7971 pipe.AddShader(&fs);
7972
7973 VkDescriptorSetObj descriptorSet(m_device);
7974 descriptorSet.AppendDummy();
7975 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7976
7977 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7978
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007979 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007980}
7981
Chris Forbesa0ab8152016-04-20 13:34:27 +12007982TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
7983{
7984 m_errorMonitor->ExpectSuccess();
7985
7986 ASSERT_NO_FATAL_FAILURE(InitState());
7987 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7988
7989 if (!m_device->phy().features().geometryShader) {
7990 printf("Device does not support geometry shaders; skipped.\n");
7991 return;
7992 }
7993
7994 char const *vsSource =
7995 "#version 450\n"
7996 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
7997 "void main(){\n"
7998 " vs_out.x = vec4(1);\n"
7999 "}\n";
8000 char const *gsSource =
8001 "#version 450\n"
8002 "layout(triangles) in;\n"
8003 "layout(triangle_strip, max_vertices=3) out;\n"
8004 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
8005 "out gl_PerVertex { vec4 gl_Position; };\n"
8006 "void main() {\n"
8007 " gl_Position = gs_in[0].x;\n"
8008 " EmitVertex();\n"
8009 "}\n";
8010 char const *fsSource =
8011 "#version 450\n"
8012 "layout(location=0) out vec4 color;\n"
8013 "void main(){\n"
8014 " color = vec4(1);\n"
8015 "}\n";
8016
8017 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8018 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
8019 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8020
8021 VkPipelineObj pipe(m_device);
8022 pipe.AddColorAttachment();
8023 pipe.AddShader(&vs);
8024 pipe.AddShader(&gs);
8025 pipe.AddShader(&fs);
8026
8027 VkDescriptorSetObj descriptorSet(m_device);
8028 descriptorSet.AppendDummy();
8029 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8030
8031 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8032
8033 m_errorMonitor->VerifyNotFound();
8034}
8035
Chris Forbesa0193bc2016-04-04 19:19:47 +12008036TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
8037{
8038 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8039 "is per-vertex in tessellation control shader stage "
8040 "but per-patch in tessellation evaluation shader stage");
8041
8042 ASSERT_NO_FATAL_FAILURE(InitState());
8043 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8044
Chris Forbesc1e852d2016-04-04 19:26:42 +12008045 if (!m_device->phy().features().tessellationShader) {
8046 printf("Device does not support tessellation shaders; skipped.\n");
8047 return;
8048 }
8049
Chris Forbesa0193bc2016-04-04 19:19:47 +12008050 char const *vsSource =
8051 "#version 450\n"
8052 "void main(){}\n";
8053 char const *tcsSource =
8054 "#version 450\n"
8055 "layout(location=0) out int x[];\n"
8056 "layout(vertices=3) out;\n"
8057 "void main(){\n"
8058 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
8059 " gl_TessLevelInner[0] = 1;\n"
8060 " x[gl_InvocationID] = gl_InvocationID;\n"
8061 "}\n";
8062 char const *tesSource =
8063 "#version 450\n"
8064 "layout(triangles, equal_spacing, cw) in;\n"
8065 "layout(location=0) patch in int x;\n"
8066 "out gl_PerVertex { vec4 gl_Position; };\n"
8067 "void main(){\n"
8068 " gl_Position.xyz = gl_TessCoord;\n"
8069 " gl_Position.w = x;\n"
8070 "}\n";
8071 char const *fsSource =
8072 "#version 450\n"
8073 "layout(location=0) out vec4 color;\n"
8074 "void main(){\n"
8075 " color = vec4(1);\n"
8076 "}\n";
8077
8078 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8079 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
8080 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
8081 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8082
8083 VkPipelineInputAssemblyStateCreateInfo iasci{
8084 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
8085 nullptr,
8086 0,
8087 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
8088 VK_FALSE};
8089
8090 VkPipelineTessellationStateCreateInfo tsci{
8091 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
8092 nullptr,
8093 0,
8094 3};
8095
8096 VkPipelineObj pipe(m_device);
8097 pipe.SetInputAssembly(&iasci);
8098 pipe.SetTessellation(&tsci);
8099 pipe.AddColorAttachment();
8100 pipe.AddShader(&vs);
8101 pipe.AddShader(&tcs);
8102 pipe.AddShader(&tes);
8103 pipe.AddShader(&fs);
8104
8105 VkDescriptorSetObj descriptorSet(m_device);
8106 descriptorSet.AppendDummy();
8107 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8108
8109 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8110
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008111 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12008112}
8113
Karl Schultz6addd812016-02-02 17:17:23 -07008114TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
8115 m_errorMonitor->SetDesiredFailureMsg(
8116 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008117 "Duplicate vertex input binding descriptions for binding 0");
8118
Chris Forbes280ba2c2015-06-12 11:16:41 +12008119 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008120 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12008121
8122 /* Two binding descriptions for binding 0 */
8123 VkVertexInputBindingDescription input_bindings[2];
8124 memset(input_bindings, 0, sizeof(input_bindings));
8125
8126 VkVertexInputAttributeDescription input_attrib;
8127 memset(&input_attrib, 0, sizeof(input_attrib));
8128 input_attrib.format = VK_FORMAT_R32_SFLOAT;
8129
8130 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008131 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12008132 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008133 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07008134 "out gl_PerVertex {\n"
8135 " vec4 gl_Position;\n"
8136 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12008137 "void main(){\n"
8138 " gl_Position = vec4(x);\n"
8139 "}\n";
8140 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008141 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12008142 "\n"
8143 "layout(location=0) out vec4 color;\n"
8144 "void main(){\n"
8145 " color = vec4(1);\n"
8146 "}\n";
8147
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008148 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8149 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12008150
8151 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008152 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12008153 pipe.AddShader(&vs);
8154 pipe.AddShader(&fs);
8155
8156 pipe.AddVertexInputBindings(input_bindings, 2);
8157 pipe.AddVertexInputAttribs(&input_attrib, 1);
8158
Chris Forbes280ba2c2015-06-12 11:16:41 +12008159 VkDescriptorSetObj descriptorSet(m_device);
8160 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008161 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12008162
Tony Barbour5781e8f2015-08-04 16:23:11 -06008163 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12008164
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008165 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12008166}
Chris Forbes8f68b562015-05-25 11:13:32 +12008167
Chris Forbes35efec72016-04-21 14:32:08 +12008168TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
8169 m_errorMonitor->ExpectSuccess();
8170
8171 ASSERT_NO_FATAL_FAILURE(InitState());
8172 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8173
8174 if (!m_device->phy().features().tessellationShader) {
8175 printf("Device does not support 64bit vertex attributes; skipped.\n");
8176 return;
8177 }
8178
8179 VkVertexInputBindingDescription input_bindings[1];
8180 memset(input_bindings, 0, sizeof(input_bindings));
8181
8182 VkVertexInputAttributeDescription input_attribs[4];
8183 memset(input_attribs, 0, sizeof(input_attribs));
8184 input_attribs[0].location = 0;
8185 input_attribs[0].offset = 0;
8186 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8187 input_attribs[1].location = 2;
8188 input_attribs[1].offset = 32;
8189 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8190 input_attribs[2].location = 4;
8191 input_attribs[2].offset = 64;
8192 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8193 input_attribs[3].location = 6;
8194 input_attribs[3].offset = 96;
8195 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8196
8197 char const *vsSource =
8198 "#version 450\n"
8199 "\n"
8200 "layout(location=0) in dmat4 x;\n"
8201 "out gl_PerVertex {\n"
8202 " vec4 gl_Position;\n"
8203 "};\n"
8204 "void main(){\n"
8205 " gl_Position = vec4(x[0][0]);\n"
8206 "}\n";
8207 char const *fsSource =
8208 "#version 450\n"
8209 "\n"
8210 "layout(location=0) out vec4 color;\n"
8211 "void main(){\n"
8212 " color = vec4(1);\n"
8213 "}\n";
8214
8215 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8216 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8217
8218 VkPipelineObj pipe(m_device);
8219 pipe.AddColorAttachment();
8220 pipe.AddShader(&vs);
8221 pipe.AddShader(&fs);
8222
8223 pipe.AddVertexInputBindings(input_bindings, 1);
8224 pipe.AddVertexInputAttribs(input_attribs, 4);
8225
8226 VkDescriptorSetObj descriptorSet(m_device);
8227 descriptorSet.AppendDummy();
8228 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8229
8230 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8231
8232 m_errorMonitor->VerifyNotFound();
8233}
8234
Karl Schultz6addd812016-02-02 17:17:23 -07008235TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008237 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008238
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008239 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008240
8241 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008242 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008243 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008244 "out gl_PerVertex {\n"
8245 " vec4 gl_Position;\n"
8246 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008247 "void main(){\n"
8248 " gl_Position = vec4(1);\n"
8249 "}\n";
8250 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008251 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008252 "\n"
8253 "void main(){\n"
8254 "}\n";
8255
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008256 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8257 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008258
8259 VkPipelineObj pipe(m_device);
8260 pipe.AddShader(&vs);
8261 pipe.AddShader(&fs);
8262
Chia-I Wu08accc62015-07-07 11:50:03 +08008263 /* set up CB 0, not written */
8264 pipe.AddColorAttachment();
8265 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008266
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008267 VkDescriptorSetObj descriptorSet(m_device);
8268 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008269 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008270
Tony Barbour5781e8f2015-08-04 16:23:11 -06008271 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008272
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008273 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008274}
8275
Karl Schultz6addd812016-02-02 17:17:23 -07008276TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07008277 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008278 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008279 "FS writes to output location 1 with no matching attachment");
8280
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008281 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008282
8283 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008284 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008285 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008286 "out gl_PerVertex {\n"
8287 " vec4 gl_Position;\n"
8288 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008289 "void main(){\n"
8290 " gl_Position = vec4(1);\n"
8291 "}\n";
8292 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008293 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008294 "\n"
8295 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008296 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008297 "void main(){\n"
8298 " x = vec4(1);\n"
8299 " y = vec4(1);\n"
8300 "}\n";
8301
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008302 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8303 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008304
8305 VkPipelineObj pipe(m_device);
8306 pipe.AddShader(&vs);
8307 pipe.AddShader(&fs);
8308
Chia-I Wu08accc62015-07-07 11:50:03 +08008309 /* set up CB 0, not written */
8310 pipe.AddColorAttachment();
8311 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008312 /* FS writes CB 1, but we don't configure it */
8313
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008314 VkDescriptorSetObj descriptorSet(m_device);
8315 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008316 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008317
Tony Barbour5781e8f2015-08-04 16:23:11 -06008318 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008319
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008320 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008321}
8322
Karl Schultz6addd812016-02-02 17:17:23 -07008323TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008325 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008326
Chris Forbesa36d69e2015-05-25 11:13:44 +12008327 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008328
8329 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008330 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008331 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008332 "out gl_PerVertex {\n"
8333 " vec4 gl_Position;\n"
8334 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008335 "void main(){\n"
8336 " gl_Position = vec4(1);\n"
8337 "}\n";
8338 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008339 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008340 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008341 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12008342 "void main(){\n"
8343 " x = ivec4(1);\n"
8344 "}\n";
8345
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008346 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8347 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12008348
8349 VkPipelineObj pipe(m_device);
8350 pipe.AddShader(&vs);
8351 pipe.AddShader(&fs);
8352
Chia-I Wu08accc62015-07-07 11:50:03 +08008353 /* set up CB 0; type is UNORM by default */
8354 pipe.AddColorAttachment();
8355 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008356
Chris Forbesa36d69e2015-05-25 11:13:44 +12008357 VkDescriptorSetObj descriptorSet(m_device);
8358 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008359 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12008360
Tony Barbour5781e8f2015-08-04 16:23:11 -06008361 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008362
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008363 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12008364}
Chris Forbes7b1b8932015-06-05 14:43:36 +12008365
Karl Schultz6addd812016-02-02 17:17:23 -07008366TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008367 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008368 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008369
Chris Forbes556c76c2015-08-14 12:04:59 +12008370 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12008371
8372 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008373 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008374 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008375 "out gl_PerVertex {\n"
8376 " vec4 gl_Position;\n"
8377 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008378 "void main(){\n"
8379 " gl_Position = vec4(1);\n"
8380 "}\n";
8381 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008382 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008383 "\n"
8384 "layout(location=0) out vec4 x;\n"
8385 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
8386 "void main(){\n"
8387 " x = vec4(bar.y);\n"
8388 "}\n";
8389
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008390 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8391 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12008392
Chris Forbes556c76c2015-08-14 12:04:59 +12008393 VkPipelineObj pipe(m_device);
8394 pipe.AddShader(&vs);
8395 pipe.AddShader(&fs);
8396
8397 /* set up CB 0; type is UNORM by default */
8398 pipe.AddColorAttachment();
8399 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8400
8401 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008402 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12008403
8404 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8405
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008406 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12008407}
8408
Chris Forbes5c59e902016-02-26 16:56:09 +13008409TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
8410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8411 "not declared in layout");
8412
8413 ASSERT_NO_FATAL_FAILURE(InitState());
8414
8415 char const *vsSource =
8416 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13008417 "\n"
8418 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
8419 "out gl_PerVertex {\n"
8420 " vec4 gl_Position;\n"
8421 "};\n"
8422 "void main(){\n"
8423 " gl_Position = vec4(consts.x);\n"
8424 "}\n";
8425 char const *fsSource =
8426 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13008427 "\n"
8428 "layout(location=0) out vec4 x;\n"
8429 "void main(){\n"
8430 " x = vec4(1);\n"
8431 "}\n";
8432
8433 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8434 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8435
8436 VkPipelineObj pipe(m_device);
8437 pipe.AddShader(&vs);
8438 pipe.AddShader(&fs);
8439
8440 /* set up CB 0; type is UNORM by default */
8441 pipe.AddColorAttachment();
8442 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8443
8444 VkDescriptorSetObj descriptorSet(m_device);
8445 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8446
8447 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8448
8449 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008450 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13008451}
8452
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008453#endif // SHADER_CHECKER_TESTS
8454
8455#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06008456TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07008457 m_errorMonitor->SetDesiredFailureMsg(
8458 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008459 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008460
8461 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008462
8463 // Create an image
8464 VkImage image;
8465
Karl Schultz6addd812016-02-02 17:17:23 -07008466 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8467 const int32_t tex_width = 32;
8468 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008469
8470 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008471 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8472 image_create_info.pNext = NULL;
8473 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8474 image_create_info.format = tex_format;
8475 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008476 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07008477 image_create_info.extent.depth = 1;
8478 image_create_info.mipLevels = 1;
8479 image_create_info.arrayLayers = 1;
8480 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8481 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8482 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8483 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008484
8485 // Introduce error by sending down a bogus width extent
8486 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008487 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008488
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008489 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008490}
8491
Mark Youngc48c4c12016-04-11 14:26:49 -06008492TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
8493 m_errorMonitor->SetDesiredFailureMsg(
8494 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8495 "CreateImage extents is 0 for at least one required dimension");
8496
8497 ASSERT_NO_FATAL_FAILURE(InitState());
8498
8499 // Create an image
8500 VkImage image;
8501
8502 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8503 const int32_t tex_width = 32;
8504 const int32_t tex_height = 32;
8505
8506 VkImageCreateInfo image_create_info = {};
8507 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8508 image_create_info.pNext = NULL;
8509 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8510 image_create_info.format = tex_format;
8511 image_create_info.extent.width = tex_width;
8512 image_create_info.extent.height = tex_height;
8513 image_create_info.extent.depth = 1;
8514 image_create_info.mipLevels = 1;
8515 image_create_info.arrayLayers = 1;
8516 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8517 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8518 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8519 image_create_info.flags = 0;
8520
8521 // Introduce error by sending down a bogus width extent
8522 image_create_info.extent.width = 0;
8523 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8524
8525 m_errorMonitor->VerifyFound();
8526}
8527
Karl Schultz6addd812016-02-02 17:17:23 -07008528TEST_F(VkLayerTest, UpdateBufferAlignment) {
8529 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06008530
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008531 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008532 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008533
Mike Stroyana3082432015-09-25 13:39:21 -06008534 ASSERT_NO_FATAL_FAILURE(InitState());
8535
8536 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8537 vk_testing::Buffer buffer;
8538 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8539
8540 BeginCommandBuffer();
8541 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008542 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008543 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008544
Mike Stroyana3082432015-09-25 13:39:21 -06008545 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008546 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008547 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008548
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008549 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008550 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008551 EndCommandBuffer();
8552}
8553
Karl Schultz6addd812016-02-02 17:17:23 -07008554TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008555 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008556 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06008557
8558 ASSERT_NO_FATAL_FAILURE(InitState());
8559
8560 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8561 vk_testing::Buffer buffer;
8562 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8563
8564 BeginCommandBuffer();
8565 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008566 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008567 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008568
Mike Stroyana3082432015-09-25 13:39:21 -06008569 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008571 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008572
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008573 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008574
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008575 m_errorMonitor->VerifyFound();
8576
Mike Stroyana3082432015-09-25 13:39:21 -06008577 EndCommandBuffer();
8578}
8579
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008580#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12008581
Tobin Ehliscde08892015-09-22 10:11:37 -06008582#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07008583TEST_F(VkLayerTest, InvalidImageView) {
8584 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06008585
Karl Schultz6addd812016-02-02 17:17:23 -07008586 m_errorMonitor->SetDesiredFailureMsg(
8587 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008588 "vkCreateImageView called with baseMipLevel 10 ");
8589
Tobin Ehliscde08892015-09-22 10:11:37 -06008590 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06008591
Mike Stroyana3082432015-09-25 13:39:21 -06008592 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07008593 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06008594
Karl Schultz6addd812016-02-02 17:17:23 -07008595 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8596 const int32_t tex_width = 32;
8597 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06008598
8599 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008600 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8601 image_create_info.pNext = NULL;
8602 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8603 image_create_info.format = tex_format;
8604 image_create_info.extent.width = tex_width;
8605 image_create_info.extent.height = tex_height;
8606 image_create_info.extent.depth = 1;
8607 image_create_info.mipLevels = 1;
8608 image_create_info.arrayLayers = 1;
8609 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8610 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8611 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8612 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06008613
Chia-I Wuf7458c52015-10-26 21:10:41 +08008614 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06008615 ASSERT_VK_SUCCESS(err);
8616
8617 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008618 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8619 image_view_create_info.image = image;
8620 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8621 image_view_create_info.format = tex_format;
8622 image_view_create_info.subresourceRange.layerCount = 1;
8623 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
8624 image_view_create_info.subresourceRange.levelCount = 1;
8625 image_view_create_info.subresourceRange.aspectMask =
8626 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06008627
8628 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008629 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8630 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06008631
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008632 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06008633}
Mike Stroyana3082432015-09-25 13:39:21 -06008634
Karl Schultz6addd812016-02-02 17:17:23 -07008635TEST_F(VkLayerTest, InvalidImageViewAspect) {
8636 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008637
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008639 "vkCreateImageView: Color image "
8640 "formats must have ONLY the "
8641 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008642
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008643 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008644
8645 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07008646 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008647
Karl Schultz6addd812016-02-02 17:17:23 -07008648 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8649 const int32_t tex_width = 32;
8650 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008651
8652 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008653 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8654 image_create_info.pNext = NULL;
8655 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8656 image_create_info.format = tex_format;
8657 image_create_info.extent.width = tex_width;
8658 image_create_info.extent.height = tex_height;
8659 image_create_info.extent.depth = 1;
8660 image_create_info.mipLevels = 1;
8661 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8662 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8663 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8664 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008665
Chia-I Wuf7458c52015-10-26 21:10:41 +08008666 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008667 ASSERT_VK_SUCCESS(err);
8668
8669 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008670 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8671 image_view_create_info.image = image;
8672 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8673 image_view_create_info.format = tex_format;
8674 image_view_create_info.subresourceRange.baseMipLevel = 0;
8675 image_view_create_info.subresourceRange.levelCount = 1;
8676 // Cause an error by setting an invalid image aspect
8677 image_view_create_info.subresourceRange.aspectMask =
8678 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008679
8680 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008681 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8682 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008683
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008684 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008685}
8686
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008687TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008688 VkResult err;
8689 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008690
Karl Schultz6addd812016-02-02 17:17:23 -07008691 m_errorMonitor->SetDesiredFailureMsg(
8692 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008693 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008694
Mike Stroyana3082432015-09-25 13:39:21 -06008695 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008696
8697 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008698 VkImage srcImage;
8699 VkImage dstImage;
8700 VkDeviceMemory srcMem;
8701 VkDeviceMemory destMem;
8702 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008703
8704 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008705 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8706 image_create_info.pNext = NULL;
8707 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8708 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8709 image_create_info.extent.width = 32;
8710 image_create_info.extent.height = 32;
8711 image_create_info.extent.depth = 1;
8712 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008713 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07008714 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8715 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8716 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8717 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008718
Karl Schultz6addd812016-02-02 17:17:23 -07008719 err =
8720 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008721 ASSERT_VK_SUCCESS(err);
8722
Karl Schultz6addd812016-02-02 17:17:23 -07008723 err =
8724 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008725 ASSERT_VK_SUCCESS(err);
8726
8727 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008728 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008729 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8730 memAlloc.pNext = NULL;
8731 memAlloc.allocationSize = 0;
8732 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008733
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008734 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008735 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008736 pass =
8737 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008738 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008739 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008740 ASSERT_VK_SUCCESS(err);
8741
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008742 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008743 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008744 pass =
8745 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008746 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008747 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008748 ASSERT_VK_SUCCESS(err);
8749
8750 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8751 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008752 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008753 ASSERT_VK_SUCCESS(err);
8754
8755 BeginCommandBuffer();
8756 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008757 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008758 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008759 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008760 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06008761 copyRegion.srcOffset.x = 0;
8762 copyRegion.srcOffset.y = 0;
8763 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008764 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008765 copyRegion.dstSubresource.mipLevel = 0;
8766 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008767 // Introduce failure by forcing the dst layerCount to differ from src
8768 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008769 copyRegion.dstOffset.x = 0;
8770 copyRegion.dstOffset.y = 0;
8771 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008772 copyRegion.extent.width = 1;
8773 copyRegion.extent.height = 1;
8774 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008775 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8776 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008777 EndCommandBuffer();
8778
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008779 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008780
Chia-I Wuf7458c52015-10-26 21:10:41 +08008781 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008782 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008783 vkFreeMemory(m_device->device(), srcMem, NULL);
8784 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008785}
8786
Tony Barbourd6673642016-05-05 14:46:39 -06008787TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
8788
8789 TEST_DESCRIPTION("Creating images with unsuported formats ");
8790
8791 ASSERT_NO_FATAL_FAILURE(InitState());
8792 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8793 VkImageObj image(m_device);
8794 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
8795 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
8796 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
8797 VK_IMAGE_TILING_OPTIMAL, 0);
8798 ASSERT_TRUE(image.initialized());
8799
8800 VkFormat unsupported = VK_FORMAT_UNDEFINED;
8801 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
8802 VkFormat format = static_cast<VkFormat>(f);
8803 VkFormatProperties fProps = m_device->format_properties(format);
8804 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
8805 fProps.optimalTilingFeatures == 0) {
8806 unsupported = format;
8807 break;
8808 }
8809 }
8810 if (unsupported != VK_FORMAT_UNDEFINED) {
8811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8812 "vkCreateImage parameter, "
8813 "VkFormat pCreateInfo->format, "
8814 "contains unsupported format");
8815 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
8816 VkImageCreateInfo image_create_info;
8817 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8818 image_create_info.pNext = NULL;
8819 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8820 image_create_info.format = unsupported;
8821 image_create_info.extent.width = 32;
8822 image_create_info.extent.height = 32;
8823 image_create_info.extent.depth = 1;
8824 image_create_info.mipLevels = 1;
8825 image_create_info.arrayLayers = 1;
8826 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8827 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8828 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8829 image_create_info.flags = 0;
8830
8831 VkImage localImage;
8832 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
8833 m_errorMonitor->VerifyFound();
8834
8835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8836 "vkCreateRenderPass parameter, "
8837 "VkFormat in "
8838 "pCreateInfo->pAttachments");
8839 // Create renderpass with unsupported format - Expect FORMAT_UNSUPPORTED
8840 VkAttachmentDescription att;
8841 att.format = unsupported;
8842 att.samples = VK_SAMPLE_COUNT_1_BIT;
8843 att.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
8844 att.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
8845 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
8846 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
8847 att.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8848 att.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8849
8850 VkRenderPassCreateInfo rp_info = {};
8851 VkRenderPass rp;
8852 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8853 rp_info.attachmentCount = 1;
8854 rp_info.pAttachments = &att;
8855 rp_info.subpassCount = 0;
8856 rp_info.pSubpasses = NULL;
8857 vkCreateRenderPass(m_device->handle(), &rp_info, NULL, &rp);
8858 m_errorMonitor->VerifyFound();
8859 }
8860}
8861
8862TEST_F(VkLayerTest, ImageLayerViewTests) {
8863 VkResult ret;
8864 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
8865
8866 ASSERT_NO_FATAL_FAILURE(InitState());
8867
8868 VkImageObj image(m_device);
8869 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
8870 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
8871 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
8872 VK_IMAGE_TILING_OPTIMAL, 0);
8873 ASSERT_TRUE(image.initialized());
8874
8875 VkImageView imgView;
8876 VkImageViewCreateInfo imgViewInfo = {};
8877 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8878 imgViewInfo.image = image.handle();
8879 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
8880 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
8881 imgViewInfo.subresourceRange.layerCount = 1;
8882 imgViewInfo.subresourceRange.baseMipLevel = 0;
8883 imgViewInfo.subresourceRange.levelCount = 1;
8884 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8885
8886 m_errorMonitor->SetDesiredFailureMsg(
8887 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8888 "vkCreateImageView called with baseMipLevel");
8889 // View can't have baseMipLevel >= image's mipLevels - Expect
8890 // VIEW_CREATE_ERROR
8891 imgViewInfo.subresourceRange.baseMipLevel = 1;
8892 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
8893 m_errorMonitor->VerifyFound();
8894 imgViewInfo.subresourceRange.baseMipLevel = 0;
8895
8896 m_errorMonitor->SetDesiredFailureMsg(
8897 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8898 "vkCreateImageView called with baseArrayLayer");
8899 // View can't have baseArrayLayer >= image's arraySize - Expect
8900 // VIEW_CREATE_ERROR
8901 imgViewInfo.subresourceRange.baseArrayLayer = 1;
8902 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
8903 m_errorMonitor->VerifyFound();
8904 imgViewInfo.subresourceRange.baseArrayLayer = 0;
8905
8906 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8907 "vkCreateImageView called with 0 in "
8908 "pCreateInfo->subresourceRange."
8909 "levelCount");
8910 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
8911 imgViewInfo.subresourceRange.levelCount = 0;
8912 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
8913 m_errorMonitor->VerifyFound();
8914 imgViewInfo.subresourceRange.levelCount = 1;
8915
8916 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8917 "vkCreateImageView called with 0 in "
8918 "pCreateInfo->subresourceRange."
8919 "layerCount");
8920 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
8921 imgViewInfo.subresourceRange.layerCount = 0;
8922 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
8923 m_errorMonitor->VerifyFound();
8924 imgViewInfo.subresourceRange.layerCount = 1;
8925
8926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8927 "but both must be color formats");
8928 // Can't use depth format for view into color image - Expect INVALID_FORMAT
8929 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
8930 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
8931 m_errorMonitor->VerifyFound();
8932 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
8933
8934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8935 "Formats MUST be IDENTICAL unless "
8936 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
8937 "was set on image creation.");
8938 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
8939 // VIEW_CREATE_ERROR
8940 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
8941 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
8942 m_errorMonitor->VerifyFound();
8943 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
8944
8945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8946 "can support ImageViews with "
8947 "differing formats but they must be "
8948 "in the same compatibility class.");
8949 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
8950 // VIEW_CREATE_ERROR
8951 VkImageCreateInfo mutImgInfo = image.create_info();
8952 VkImage mutImage;
8953 mutImgInfo.format = VK_FORMAT_R8_UINT;
8954 assert(
8955 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
8956 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
8957 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
8958 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8959 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
8960 ASSERT_VK_SUCCESS(ret);
8961 imgViewInfo.image = mutImage;
8962 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
8963 m_errorMonitor->VerifyFound();
8964 imgViewInfo.image = image.handle();
8965 vkDestroyImage(m_device->handle(), mutImage, NULL);
8966}
8967
8968TEST_F(VkLayerTest, MiscImageLayerTests) {
8969
8970 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
8971
8972 ASSERT_NO_FATAL_FAILURE(InitState());
8973
8974 VkImageObj image(m_device);
8975 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
8976 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
8977 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
8978 VK_IMAGE_TILING_OPTIMAL, 0);
8979 ASSERT_TRUE(image.initialized());
8980
8981 m_errorMonitor->SetDesiredFailureMsg(
8982 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8983 "number of layers in image subresource is zero");
8984 vk_testing::Buffer buffer;
8985 VkMemoryPropertyFlags reqs = 0;
8986 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
8987 VkBufferImageCopy region = {};
8988 region.bufferRowLength = 128;
8989 region.bufferImageHeight = 128;
8990 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8991 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
8992 region.imageSubresource.layerCount = 0;
8993 region.imageExtent.height = 4;
8994 region.imageExtent.width = 4;
8995 region.imageExtent.depth = 1;
8996 m_commandBuffer->BeginCommandBuffer();
8997 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
8998 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
8999 1, &region);
9000 m_errorMonitor->VerifyFound();
9001 region.imageSubresource.layerCount = 1;
9002
9003 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9004 "aspectMasks for each region must "
9005 "specify only COLOR or DEPTH or "
9006 "STENCIL");
9007 // Expect MISMATCHED_IMAGE_ASPECT
9008 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
9009 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
9010 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
9011 1, &region);
9012 m_errorMonitor->VerifyFound();
9013 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9014
9015 m_errorMonitor->SetDesiredFailureMsg(
9016 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9017 "If the format of srcImage is a depth, stencil, depth stencil or "
9018 "integer-based format then filter must be VK_FILTER_NEAREST");
9019 // Expect INVALID_FILTER
9020 VkImageObj intImage1(m_device);
9021 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
9022 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
9023 0);
9024 VkImageObj intImage2(m_device);
9025 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
9026 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
9027 0);
9028 VkImageBlit blitRegion = {};
9029 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9030 blitRegion.srcSubresource.baseArrayLayer = 0;
9031 blitRegion.srcSubresource.layerCount = 1;
9032 blitRegion.srcSubresource.mipLevel = 0;
9033 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9034 blitRegion.dstSubresource.baseArrayLayer = 0;
9035 blitRegion.dstSubresource.layerCount = 1;
9036 blitRegion.dstSubresource.mipLevel = 0;
9037
9038 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
9039 intImage1.layout(), intImage2.handle(), intImage2.layout(),
9040 16, &blitRegion, VK_FILTER_LINEAR);
9041 m_errorMonitor->VerifyFound();
9042
9043 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9044 "called with 0 in ppMemoryBarriers");
9045 VkImageMemoryBarrier img_barrier;
9046 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9047 img_barrier.pNext = NULL;
9048 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9049 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9050 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9051 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9052 img_barrier.image = image.handle();
9053 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9054 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9055 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9056 img_barrier.subresourceRange.baseArrayLayer = 0;
9057 img_barrier.subresourceRange.baseMipLevel = 0;
9058 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
9059 img_barrier.subresourceRange.layerCount = 0;
9060 img_barrier.subresourceRange.levelCount = 1;
9061 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9062 VK_PIPELINE_STAGE_HOST_BIT,
9063 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9064 nullptr, 1, &img_barrier);
9065 m_errorMonitor->VerifyFound();
9066 img_barrier.subresourceRange.layerCount = 1;
9067}
9068
9069TEST_F(VkLayerTest, ImageFormatLimits) {
9070
9071 TEST_DESCRIPTION("Exceed the limits of image format ");
9072
9073 m_errorMonitor->SetDesiredFailureMsg(
9074 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9075 "CreateImage extents exceed allowable limits for format");
9076 VkImageCreateInfo image_create_info = {};
9077 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9078 image_create_info.pNext = NULL;
9079 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9080 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9081 image_create_info.extent.width = 32;
9082 image_create_info.extent.height = 32;
9083 image_create_info.extent.depth = 1;
9084 image_create_info.mipLevels = 1;
9085 image_create_info.arrayLayers = 1;
9086 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9087 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9088 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9089 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9090 image_create_info.flags = 0;
9091
9092 VkImage nullImg;
9093 VkImageFormatProperties imgFmtProps;
9094 vkGetPhysicalDeviceImageFormatProperties(
9095 gpu(), image_create_info.format, image_create_info.imageType,
9096 image_create_info.tiling, image_create_info.usage,
9097 image_create_info.flags, &imgFmtProps);
9098 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
9099 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9100 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9101 m_errorMonitor->VerifyFound();
9102 image_create_info.extent.depth = 1;
9103
9104 m_errorMonitor->SetDesiredFailureMsg(
9105 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9106 "exceeds allowable maximum supported by format of");
9107 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
9108 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9109 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9110 m_errorMonitor->VerifyFound();
9111 image_create_info.mipLevels = 1;
9112
9113 m_errorMonitor->SetDesiredFailureMsg(
9114 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9115 "exceeds allowable maximum supported by format of");
9116 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
9117 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9118 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9119 m_errorMonitor->VerifyFound();
9120 image_create_info.arrayLayers = 1;
9121
9122 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9123 "is not supported by format");
9124 int samples = imgFmtProps.sampleCounts >> 1;
9125 image_create_info.samples = (VkSampleCountFlagBits)samples;
9126 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9127 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9128 m_errorMonitor->VerifyFound();
9129 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9130
9131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9132 "pCreateInfo->initialLayout, must be "
9133 "VK_IMAGE_LAYOUT_UNDEFINED or "
9134 "VK_IMAGE_LAYOUT_PREINITIALIZED");
9135 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9136 // Expect INVALID_LAYOUT
9137 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9138 m_errorMonitor->VerifyFound();
9139 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9140}
9141
Karl Schultz6addd812016-02-02 17:17:23 -07009142TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06009143 VkResult err;
9144 bool pass;
9145
9146 // Create color images with different format sizes and try to copy between them
9147 m_errorMonitor->SetDesiredFailureMsg(
9148 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9149 "vkCmdCopyImage called with unmatched source and dest image format sizes");
9150
9151 ASSERT_NO_FATAL_FAILURE(InitState());
9152
9153 // Create two images of different types and try to copy between them
9154 VkImage srcImage;
9155 VkImage dstImage;
9156 VkDeviceMemory srcMem;
9157 VkDeviceMemory destMem;
9158 VkMemoryRequirements memReqs;
9159
9160 VkImageCreateInfo image_create_info = {};
9161 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9162 image_create_info.pNext = NULL;
9163 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9164 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9165 image_create_info.extent.width = 32;
9166 image_create_info.extent.height = 32;
9167 image_create_info.extent.depth = 1;
9168 image_create_info.mipLevels = 1;
9169 image_create_info.arrayLayers = 1;
9170 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9171 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9172 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9173 image_create_info.flags = 0;
9174
9175 err =
9176 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
9177 ASSERT_VK_SUCCESS(err);
9178
9179 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
9180 // Introduce failure by creating second image with a different-sized format.
9181 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
9182
9183 err =
9184 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
9185 ASSERT_VK_SUCCESS(err);
9186
9187 // Allocate memory
9188 VkMemoryAllocateInfo memAlloc = {};
9189 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9190 memAlloc.pNext = NULL;
9191 memAlloc.allocationSize = 0;
9192 memAlloc.memoryTypeIndex = 0;
9193
9194 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
9195 memAlloc.allocationSize = memReqs.size;
9196 pass =
9197 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
9198 ASSERT_TRUE(pass);
9199 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
9200 ASSERT_VK_SUCCESS(err);
9201
9202 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
9203 memAlloc.allocationSize = memReqs.size;
9204 pass =
9205 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
9206 ASSERT_TRUE(pass);
9207 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
9208 ASSERT_VK_SUCCESS(err);
9209
9210 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9211 ASSERT_VK_SUCCESS(err);
9212 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
9213 ASSERT_VK_SUCCESS(err);
9214
9215 BeginCommandBuffer();
9216 VkImageCopy copyRegion;
9217 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9218 copyRegion.srcSubresource.mipLevel = 0;
9219 copyRegion.srcSubresource.baseArrayLayer = 0;
9220 copyRegion.srcSubresource.layerCount = 0;
9221 copyRegion.srcOffset.x = 0;
9222 copyRegion.srcOffset.y = 0;
9223 copyRegion.srcOffset.z = 0;
9224 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9225 copyRegion.dstSubresource.mipLevel = 0;
9226 copyRegion.dstSubresource.baseArrayLayer = 0;
9227 copyRegion.dstSubresource.layerCount = 0;
9228 copyRegion.dstOffset.x = 0;
9229 copyRegion.dstOffset.y = 0;
9230 copyRegion.dstOffset.z = 0;
9231 copyRegion.extent.width = 1;
9232 copyRegion.extent.height = 1;
9233 copyRegion.extent.depth = 1;
9234 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9235 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
9236 EndCommandBuffer();
9237
9238 m_errorMonitor->VerifyFound();
9239
9240 vkDestroyImage(m_device->device(), srcImage, NULL);
9241 vkDestroyImage(m_device->device(), dstImage, NULL);
9242 vkFreeMemory(m_device->device(), srcMem, NULL);
9243 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009244}
9245
Karl Schultz6addd812016-02-02 17:17:23 -07009246TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
9247 VkResult err;
9248 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009249
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009250 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009251 m_errorMonitor->SetDesiredFailureMsg(
9252 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009253 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009254
Mike Stroyana3082432015-09-25 13:39:21 -06009255 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009256
9257 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009258 VkImage srcImage;
9259 VkImage dstImage;
9260 VkDeviceMemory srcMem;
9261 VkDeviceMemory destMem;
9262 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009263
9264 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009265 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9266 image_create_info.pNext = NULL;
9267 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9268 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9269 image_create_info.extent.width = 32;
9270 image_create_info.extent.height = 32;
9271 image_create_info.extent.depth = 1;
9272 image_create_info.mipLevels = 1;
9273 image_create_info.arrayLayers = 1;
9274 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9275 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9276 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9277 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009278
Karl Schultz6addd812016-02-02 17:17:23 -07009279 err =
9280 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009281 ASSERT_VK_SUCCESS(err);
9282
Karl Schultzbdb75952016-04-19 11:36:49 -06009283 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
9284
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009285 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07009286 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009287 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
9288 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009289
Karl Schultz6addd812016-02-02 17:17:23 -07009290 err =
9291 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009292 ASSERT_VK_SUCCESS(err);
9293
9294 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009295 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009296 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9297 memAlloc.pNext = NULL;
9298 memAlloc.allocationSize = 0;
9299 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009300
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009301 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009302 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009303 pass =
9304 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009305 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009306 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009307 ASSERT_VK_SUCCESS(err);
9308
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009309 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009310 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009311 pass =
9312 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009313 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009314 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009315 ASSERT_VK_SUCCESS(err);
9316
9317 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9318 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009319 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009320 ASSERT_VK_SUCCESS(err);
9321
9322 BeginCommandBuffer();
9323 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009324 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009325 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009326 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009327 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009328 copyRegion.srcOffset.x = 0;
9329 copyRegion.srcOffset.y = 0;
9330 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009331 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009332 copyRegion.dstSubresource.mipLevel = 0;
9333 copyRegion.dstSubresource.baseArrayLayer = 0;
9334 copyRegion.dstSubresource.layerCount = 0;
9335 copyRegion.dstOffset.x = 0;
9336 copyRegion.dstOffset.y = 0;
9337 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009338 copyRegion.extent.width = 1;
9339 copyRegion.extent.height = 1;
9340 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009341 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9342 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009343 EndCommandBuffer();
9344
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009345 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009346
Chia-I Wuf7458c52015-10-26 21:10:41 +08009347 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009348 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009349 vkFreeMemory(m_device->device(), srcMem, NULL);
9350 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009351}
9352
Karl Schultz6addd812016-02-02 17:17:23 -07009353TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
9354 VkResult err;
9355 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009356
Karl Schultz6addd812016-02-02 17:17:23 -07009357 m_errorMonitor->SetDesiredFailureMsg(
9358 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009359 "vkCmdResolveImage called with source sample count less than 2.");
9360
Mike Stroyana3082432015-09-25 13:39:21 -06009361 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009362
9363 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07009364 VkImage srcImage;
9365 VkImage dstImage;
9366 VkDeviceMemory srcMem;
9367 VkDeviceMemory destMem;
9368 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009369
9370 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009371 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9372 image_create_info.pNext = NULL;
9373 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9374 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9375 image_create_info.extent.width = 32;
9376 image_create_info.extent.height = 1;
9377 image_create_info.extent.depth = 1;
9378 image_create_info.mipLevels = 1;
9379 image_create_info.arrayLayers = 1;
9380 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9381 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9382 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9383 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009384
Karl Schultz6addd812016-02-02 17:17:23 -07009385 err =
9386 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009387 ASSERT_VK_SUCCESS(err);
9388
Karl Schultz6addd812016-02-02 17:17:23 -07009389 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009390
Karl Schultz6addd812016-02-02 17:17:23 -07009391 err =
9392 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009393 ASSERT_VK_SUCCESS(err);
9394
9395 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009396 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009397 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9398 memAlloc.pNext = NULL;
9399 memAlloc.allocationSize = 0;
9400 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009401
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009402 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009403 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009404 pass =
9405 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009406 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009407 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009408 ASSERT_VK_SUCCESS(err);
9409
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009410 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009411 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009412 pass =
9413 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009414 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009415 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009416 ASSERT_VK_SUCCESS(err);
9417
9418 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9419 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009420 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009421 ASSERT_VK_SUCCESS(err);
9422
9423 BeginCommandBuffer();
9424 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009425 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9426 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009427 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009428 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009429 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009430 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009431 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009432 resolveRegion.srcOffset.x = 0;
9433 resolveRegion.srcOffset.y = 0;
9434 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009435 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009436 resolveRegion.dstSubresource.mipLevel = 0;
9437 resolveRegion.dstSubresource.baseArrayLayer = 0;
9438 resolveRegion.dstSubresource.layerCount = 0;
9439 resolveRegion.dstOffset.x = 0;
9440 resolveRegion.dstOffset.y = 0;
9441 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009442 resolveRegion.extent.width = 1;
9443 resolveRegion.extent.height = 1;
9444 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009445 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9446 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009447 EndCommandBuffer();
9448
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009449 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009450
Chia-I Wuf7458c52015-10-26 21:10:41 +08009451 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009452 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009453 vkFreeMemory(m_device->device(), srcMem, NULL);
9454 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009455}
9456
Karl Schultz6addd812016-02-02 17:17:23 -07009457TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
9458 VkResult err;
9459 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009460
Karl Schultz6addd812016-02-02 17:17:23 -07009461 m_errorMonitor->SetDesiredFailureMsg(
9462 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009463 "vkCmdResolveImage called with dest sample count greater than 1.");
9464
Mike Stroyana3082432015-09-25 13:39:21 -06009465 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009466
Chris Forbesa7530692016-05-08 12:35:39 +12009467 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07009468 VkImage srcImage;
9469 VkImage dstImage;
9470 VkDeviceMemory srcMem;
9471 VkDeviceMemory destMem;
9472 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009473
9474 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009475 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9476 image_create_info.pNext = NULL;
9477 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9478 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9479 image_create_info.extent.width = 32;
9480 image_create_info.extent.height = 1;
9481 image_create_info.extent.depth = 1;
9482 image_create_info.mipLevels = 1;
9483 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +12009484 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07009485 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9486 // Note: Some implementations expect color attachment usage for any
9487 // multisample surface
9488 image_create_info.usage =
9489 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9490 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009491
Karl Schultz6addd812016-02-02 17:17:23 -07009492 err =
9493 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009494 ASSERT_VK_SUCCESS(err);
9495
Karl Schultz6addd812016-02-02 17:17:23 -07009496 // Note: Some implementations expect color attachment usage for any
9497 // multisample surface
9498 image_create_info.usage =
9499 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009500
Karl Schultz6addd812016-02-02 17:17:23 -07009501 err =
9502 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009503 ASSERT_VK_SUCCESS(err);
9504
9505 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009506 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009507 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9508 memAlloc.pNext = NULL;
9509 memAlloc.allocationSize = 0;
9510 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009511
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009512 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009513 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009514 pass =
9515 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009516 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009517 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009518 ASSERT_VK_SUCCESS(err);
9519
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009520 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009521 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009522 pass =
9523 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009524 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009525 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009526 ASSERT_VK_SUCCESS(err);
9527
9528 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9529 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009530 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009531 ASSERT_VK_SUCCESS(err);
9532
9533 BeginCommandBuffer();
9534 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009535 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9536 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009537 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009538 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009539 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009540 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009541 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009542 resolveRegion.srcOffset.x = 0;
9543 resolveRegion.srcOffset.y = 0;
9544 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009545 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009546 resolveRegion.dstSubresource.mipLevel = 0;
9547 resolveRegion.dstSubresource.baseArrayLayer = 0;
9548 resolveRegion.dstSubresource.layerCount = 0;
9549 resolveRegion.dstOffset.x = 0;
9550 resolveRegion.dstOffset.y = 0;
9551 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009552 resolveRegion.extent.width = 1;
9553 resolveRegion.extent.height = 1;
9554 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009555 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9556 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009557 EndCommandBuffer();
9558
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009559 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009560
Chia-I Wuf7458c52015-10-26 21:10:41 +08009561 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009562 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009563 vkFreeMemory(m_device->device(), srcMem, NULL);
9564 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009565}
9566
Karl Schultz6addd812016-02-02 17:17:23 -07009567TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
9568 VkResult err;
9569 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009570
Karl Schultz6addd812016-02-02 17:17:23 -07009571 m_errorMonitor->SetDesiredFailureMsg(
9572 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009573 "vkCmdResolveImage called with unmatched source and dest formats.");
9574
Mike Stroyana3082432015-09-25 13:39:21 -06009575 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009576
9577 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009578 VkImage srcImage;
9579 VkImage dstImage;
9580 VkDeviceMemory srcMem;
9581 VkDeviceMemory destMem;
9582 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009583
9584 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009585 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9586 image_create_info.pNext = NULL;
9587 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9588 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9589 image_create_info.extent.width = 32;
9590 image_create_info.extent.height = 1;
9591 image_create_info.extent.depth = 1;
9592 image_create_info.mipLevels = 1;
9593 image_create_info.arrayLayers = 1;
9594 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
9595 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9596 // Note: Some implementations expect color attachment usage for any
9597 // multisample surface
9598 image_create_info.usage =
9599 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9600 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009601
Karl Schultz6addd812016-02-02 17:17:23 -07009602 err =
9603 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009604 ASSERT_VK_SUCCESS(err);
9605
Karl Schultz6addd812016-02-02 17:17:23 -07009606 // Set format to something other than source image
9607 image_create_info.format = VK_FORMAT_R32_SFLOAT;
9608 // Note: Some implementations expect color attachment usage for any
9609 // multisample surface
9610 image_create_info.usage =
9611 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9612 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009613
Karl Schultz6addd812016-02-02 17:17:23 -07009614 err =
9615 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009616 ASSERT_VK_SUCCESS(err);
9617
9618 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009619 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009620 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9621 memAlloc.pNext = NULL;
9622 memAlloc.allocationSize = 0;
9623 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009624
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009625 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009626 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009627 pass =
9628 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009629 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009630 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009631 ASSERT_VK_SUCCESS(err);
9632
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009633 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009634 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009635 pass =
9636 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009637 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009638 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009639 ASSERT_VK_SUCCESS(err);
9640
9641 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9642 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009643 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009644 ASSERT_VK_SUCCESS(err);
9645
9646 BeginCommandBuffer();
9647 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009648 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9649 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009650 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009651 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009652 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009653 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009654 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009655 resolveRegion.srcOffset.x = 0;
9656 resolveRegion.srcOffset.y = 0;
9657 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009658 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009659 resolveRegion.dstSubresource.mipLevel = 0;
9660 resolveRegion.dstSubresource.baseArrayLayer = 0;
9661 resolveRegion.dstSubresource.layerCount = 0;
9662 resolveRegion.dstOffset.x = 0;
9663 resolveRegion.dstOffset.y = 0;
9664 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009665 resolveRegion.extent.width = 1;
9666 resolveRegion.extent.height = 1;
9667 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009668 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9669 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009670 EndCommandBuffer();
9671
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009672 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009673
Chia-I Wuf7458c52015-10-26 21:10:41 +08009674 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009675 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009676 vkFreeMemory(m_device->device(), srcMem, NULL);
9677 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009678}
9679
Karl Schultz6addd812016-02-02 17:17:23 -07009680TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
9681 VkResult err;
9682 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009683
Karl Schultz6addd812016-02-02 17:17:23 -07009684 m_errorMonitor->SetDesiredFailureMsg(
9685 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009686 "vkCmdResolveImage called with unmatched source and dest image types.");
9687
Mike Stroyana3082432015-09-25 13:39:21 -06009688 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009689
9690 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009691 VkImage srcImage;
9692 VkImage dstImage;
9693 VkDeviceMemory srcMem;
9694 VkDeviceMemory destMem;
9695 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009696
9697 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009698 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9699 image_create_info.pNext = NULL;
9700 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9701 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9702 image_create_info.extent.width = 32;
9703 image_create_info.extent.height = 1;
9704 image_create_info.extent.depth = 1;
9705 image_create_info.mipLevels = 1;
9706 image_create_info.arrayLayers = 1;
9707 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
9708 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9709 // Note: Some implementations expect color attachment usage for any
9710 // multisample surface
9711 image_create_info.usage =
9712 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9713 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009714
Karl Schultz6addd812016-02-02 17:17:23 -07009715 err =
9716 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009717 ASSERT_VK_SUCCESS(err);
9718
Karl Schultz6addd812016-02-02 17:17:23 -07009719 image_create_info.imageType = VK_IMAGE_TYPE_1D;
9720 // Note: Some implementations expect color attachment usage for any
9721 // multisample surface
9722 image_create_info.usage =
9723 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9724 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009725
Karl Schultz6addd812016-02-02 17:17:23 -07009726 err =
9727 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009728 ASSERT_VK_SUCCESS(err);
9729
9730 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009731 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009732 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9733 memAlloc.pNext = NULL;
9734 memAlloc.allocationSize = 0;
9735 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009736
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009737 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009738 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009739 pass =
9740 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009741 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009742 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009743 ASSERT_VK_SUCCESS(err);
9744
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009745 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009746 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009747 pass =
9748 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009749 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009750 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009751 ASSERT_VK_SUCCESS(err);
9752
9753 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9754 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009755 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009756 ASSERT_VK_SUCCESS(err);
9757
9758 BeginCommandBuffer();
9759 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009760 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9761 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009762 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009763 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009764 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009765 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009766 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009767 resolveRegion.srcOffset.x = 0;
9768 resolveRegion.srcOffset.y = 0;
9769 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009770 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009771 resolveRegion.dstSubresource.mipLevel = 0;
9772 resolveRegion.dstSubresource.baseArrayLayer = 0;
9773 resolveRegion.dstSubresource.layerCount = 0;
9774 resolveRegion.dstOffset.x = 0;
9775 resolveRegion.dstOffset.y = 0;
9776 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009777 resolveRegion.extent.width = 1;
9778 resolveRegion.extent.height = 1;
9779 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009780 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9781 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009782 EndCommandBuffer();
9783
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009784 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009785
Chia-I Wuf7458c52015-10-26 21:10:41 +08009786 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009787 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009788 vkFreeMemory(m_device->device(), srcMem, NULL);
9789 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009790}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009791
Karl Schultz6addd812016-02-02 17:17:23 -07009792TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009793 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07009794 // to using a DS format, then cause it to hit error due to COLOR_BIT not
9795 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009796 // The image format check comes 2nd in validation so we trigger it first,
9797 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07009798 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009799
Karl Schultz6addd812016-02-02 17:17:23 -07009800 m_errorMonitor->SetDesiredFailureMsg(
9801 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009802 "Combination depth/stencil image formats can have only the ");
9803
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009804 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009805
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009806 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009807 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
9808 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009809
9810 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009811 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9812 ds_pool_ci.pNext = NULL;
9813 ds_pool_ci.maxSets = 1;
9814 ds_pool_ci.poolSizeCount = 1;
9815 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009816
9817 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009818 err =
9819 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009820 ASSERT_VK_SUCCESS(err);
9821
9822 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009823 dsl_binding.binding = 0;
9824 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
9825 dsl_binding.descriptorCount = 1;
9826 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9827 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009828
9829 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009830 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9831 ds_layout_ci.pNext = NULL;
9832 ds_layout_ci.bindingCount = 1;
9833 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009834 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009835 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9836 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009837 ASSERT_VK_SUCCESS(err);
9838
9839 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009840 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009841 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009842 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009843 alloc_info.descriptorPool = ds_pool;
9844 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009845 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9846 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009847 ASSERT_VK_SUCCESS(err);
9848
Karl Schultz6addd812016-02-02 17:17:23 -07009849 VkImage image_bad;
9850 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009851 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07009852 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009853 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07009854 const int32_t tex_width = 32;
9855 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009856
9857 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009858 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9859 image_create_info.pNext = NULL;
9860 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9861 image_create_info.format = tex_format_bad;
9862 image_create_info.extent.width = tex_width;
9863 image_create_info.extent.height = tex_height;
9864 image_create_info.extent.depth = 1;
9865 image_create_info.mipLevels = 1;
9866 image_create_info.arrayLayers = 1;
9867 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9868 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9869 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
9870 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
9871 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009872
Karl Schultz6addd812016-02-02 17:17:23 -07009873 err =
9874 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009875 ASSERT_VK_SUCCESS(err);
9876 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07009877 image_create_info.usage =
9878 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9879 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
9880 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009881 ASSERT_VK_SUCCESS(err);
9882
9883 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009884 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9885 image_view_create_info.image = image_bad;
9886 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
9887 image_view_create_info.format = tex_format_bad;
9888 image_view_create_info.subresourceRange.baseArrayLayer = 0;
9889 image_view_create_info.subresourceRange.baseMipLevel = 0;
9890 image_view_create_info.subresourceRange.layerCount = 1;
9891 image_view_create_info.subresourceRange.levelCount = 1;
9892 image_view_create_info.subresourceRange.aspectMask =
9893 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009894
9895 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07009896 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
9897 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009898
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009899 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009900
Chia-I Wuf7458c52015-10-26 21:10:41 +08009901 vkDestroyImage(m_device->device(), image_bad, NULL);
9902 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009903 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9904 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009905}
Tobin Ehliscde08892015-09-22 10:11:37 -06009906#endif // IMAGE_TESTS
9907
Tony Barbour300a6082015-04-07 13:44:53 -06009908int main(int argc, char **argv) {
9909 int result;
9910
Cody Northrop8e54a402016-03-08 22:25:52 -07009911#ifdef ANDROID
9912 int vulkanSupport = InitVulkan();
9913 if (vulkanSupport == 0)
9914 return 1;
9915#endif
9916
Tony Barbour300a6082015-04-07 13:44:53 -06009917 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06009918 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06009919
9920 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
9921
9922 result = RUN_ALL_TESTS();
9923
Tony Barbour6918cd52015-04-09 12:58:51 -06009924 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06009925 return result;
9926}