blob: 8bf5bd969ac89df72643d17dad9877f4354a376c [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 = {};
Dustin Graves47b6cba2016-05-10 17:34:38 -0600673 VkMemoryAllocateInfo memory_alloc_info = {};
674 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
675 memory_alloc_info.pNext = &app_info;
676 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600677 m_errorMonitor->VerifyFound();
678
Dustin Graves47b6cba2016-05-10 17:34:38 -0600679 m_errorMonitor->SetDesiredFailureMsg(
680 VK_DEBUG_REPORT_ERROR_BIT_EXT,
681 " chain includes a structure with unexpected VkStructureType ");
682 // Set VkGraphicsPipelineCreateInfo::VkPipelineRasterizationStateCreateInfo::pNext to an invalid structure, when pNext is allowed to be a non-NULL value
683 // Expected to trigger an error with
684 // parameter_validation::validate_struct_pnext
685 VkDescriptorPoolSize ds_type_count = {};
686 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
687 ds_type_count.descriptorCount = 1;
688
689 VkDescriptorPoolCreateInfo ds_pool_ci = {};
690 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
691 ds_pool_ci.pNext = NULL;
692 ds_pool_ci.maxSets = 1;
693 ds_pool_ci.poolSizeCount = 1;
694 ds_pool_ci.pPoolSizes = &ds_type_count;
695
696 VkDescriptorPool ds_pool;
697 VkResult err =
698 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
699 ASSERT_VK_SUCCESS(err);
700
701 VkDescriptorSetLayoutBinding dsl_binding = {};
702 dsl_binding.binding = 0;
703 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
704 dsl_binding.descriptorCount = 1;
705 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
706 dsl_binding.pImmutableSamplers = NULL;
707
708 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
709 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
710 ds_layout_ci.pNext = NULL;
711 ds_layout_ci.bindingCount = 1;
712 ds_layout_ci.pBindings = &dsl_binding;
713
714 VkDescriptorSetLayout ds_layout;
715 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
716 &ds_layout);
717 ASSERT_VK_SUCCESS(err);
718
719 VkDescriptorSet descriptorSet;
720 VkDescriptorSetAllocateInfo ds_alloc_info = {};
721 ds_alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
722 ds_alloc_info.descriptorSetCount = 1;
723 ds_alloc_info.descriptorPool = ds_pool;
724 ds_alloc_info.pSetLayouts = &ds_layout;
725 err = vkAllocateDescriptorSets(m_device->device(), &ds_alloc_info,
726 &descriptorSet);
727 ASSERT_VK_SUCCESS(err);
728
729 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
730 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
731 pipeline_layout_ci.setLayoutCount = 1;
732 pipeline_layout_ci.pSetLayouts = &ds_layout;
733
734 VkPipelineLayout pipeline_layout;
735 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
736 &pipeline_layout);
737 ASSERT_VK_SUCCESS(err);
738
739 VkViewport vp = {}; // Just need dummy vp to point to
740 VkRect2D sc = {}; // dummy scissor to point to
741
742 VkPipelineViewportStateCreateInfo vp_state_ci = {};
743 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
744 vp_state_ci.scissorCount = 1;
745 vp_state_ci.pScissors = &sc;
746 vp_state_ci.viewportCount = 1;
747 vp_state_ci.pViewports = &vp;
748
749 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
750 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
751 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
752 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
753 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
754 rs_state_ci.depthClampEnable = VK_FALSE;
755 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
756 rs_state_ci.depthBiasEnable = VK_FALSE;
757
758 VkGraphicsPipelineCreateInfo gp_ci = {};
759 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
760 gp_ci.pViewportState = &vp_state_ci;
761 gp_ci.pRasterizationState = &rs_state_ci;
762 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
763 gp_ci.layout = pipeline_layout;
764 gp_ci.renderPass = renderPass();
765
766 VkPipelineCacheCreateInfo pc_ci = {};
767 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
768 pc_ci.initialDataSize = 0;
769 pc_ci.pInitialData = 0;
770
771 VkPipeline pipeline;
772 VkPipelineCache pipelineCache;
773
774 err =
775 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
776 ASSERT_VK_SUCCESS(err);
777
778 // Set VkPipelineRasterizationStateCreateInfo::pNext to an invalid value
779 VkApplicationInfo invalid_pnext_struct = {};
780 rs_state_ci.pNext = &invalid_pnext_struct;
781
782 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
783 &gp_ci, NULL, &pipeline);
784 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600785}
Dustin Graves5d33d532016-05-09 16:21:12 -0600786
787TEST_F(VkLayerTest, UnrecognizedValue) {
788 TEST_DESCRIPTION(
789 "Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
790
791 ASSERT_NO_FATAL_FAILURE(InitState());
792
793 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
794 "does not fall within the begin..end "
795 "range of the core VkFormat "
796 "enumeration tokens");
797 // Specify an invalid VkFormat value
798 // Expected to trigger an error with
799 // parameter_validation::validate_ranged_enum
800 VkFormatProperties format_properties;
801 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000),
802 &format_properties);
803 m_errorMonitor->VerifyFound();
804
805 m_errorMonitor->SetDesiredFailureMsg(
806 VK_DEBUG_REPORT_ERROR_BIT_EXT,
807 "contains flag bits that are not recognized members of");
808 // Specify an invalid VkFlags bitmask value
809 // Expected to trigger an error with parameter_validation::validate_flags
810 VkImageFormatProperties image_format_properties;
811 vkGetPhysicalDeviceImageFormatProperties(
812 gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D,
813 VK_IMAGE_TILING_OPTIMAL, static_cast<VkImageUsageFlags>(1 << 25), 0,
814 &image_format_properties);
815 m_errorMonitor->VerifyFound();
816
817 m_errorMonitor->SetDesiredFailureMsg(
818 VK_DEBUG_REPORT_ERROR_BIT_EXT,
819 "contains flag bits that are not recognized members of");
820 // Specify an invalid VkFlags array entry
821 // Expected to trigger an error with
822 // parameter_validation::validate_flags_array
823 VkSemaphore semaphore = VK_NULL_HANDLE;
824 VkPipelineStageFlags stage_flags =
825 static_cast<VkPipelineStageFlags>(1 << 25);
826 VkSubmitInfo submit_info = {};
827 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
828 submit_info.waitSemaphoreCount = 1;
829 submit_info.pWaitSemaphores = &semaphore;
830 submit_info.pWaitDstStageMask = &stage_flags;
831 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
832 m_errorMonitor->VerifyFound();
833
834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
835 "is neither VK_TRUE nor VK_FALSE");
836 // Specify an invalid VkBool32 value
837 // Expected to trigger a warning with
838 // parameter_validation::validate_bool32
839 VkSampler sampler = VK_NULL_HANDLE;
840 VkSamplerCreateInfo sampler_info = {};
841 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
842 sampler_info.pNext = NULL;
843 sampler_info.magFilter = VK_FILTER_NEAREST;
844 sampler_info.minFilter = VK_FILTER_NEAREST;
845 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
846 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
847 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
848 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
849 sampler_info.mipLodBias = 1.0;
850 sampler_info.maxAnisotropy = 1;
851 sampler_info.compareEnable = VK_FALSE;
852 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
853 sampler_info.minLod = 1.0;
854 sampler_info.maxLod = 1.0;
855 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
856 sampler_info.unnormalizedCoordinates = VK_FALSE;
857 // Not VK_TRUE or VK_FALSE
858 sampler_info.anisotropyEnable = 3;
859 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
860 m_errorMonitor->VerifyFound();
861}
Dustin Gravesfce74c02016-05-10 11:42:58 -0600862
863TEST_F(VkLayerTest, FailedReturnValue) {
864 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
865
866 ASSERT_NO_FATAL_FAILURE(InitState());
867
868 m_errorMonitor->SetDesiredFailureMsg(
869 VK_DEBUG_REPORT_WARNING_BIT_EXT,
870 "the requested format is not supported on this device");
871 // Specify invalid VkFormat value to generate a
872 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
873 // Expected to trigger a warning from parameter_validation::validate_result
874 VkImageFormatProperties image_format_properties;
875 VkResult err = vkGetPhysicalDeviceImageFormatProperties(
876 gpu(), static_cast<VkFormat>(0x8000), VK_IMAGE_TYPE_2D,
877 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0,
878 &image_format_properties);
879 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
880 m_errorMonitor->VerifyFound();
881}
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600882#endif // PARAMETER_VALIDATION_TESTS
883
Tobin Ehlis0788f522015-05-26 16:11:58 -0600884#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700885#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800886TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500887{
888 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500889 VkFenceCreateInfo fenceInfo = {};
890 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
891 fenceInfo.pNext = NULL;
892 fenceInfo.flags = 0;
893
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700894 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600895
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500896 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600897
898 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
899 vk_testing::Buffer buffer;
900 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500901
Tony Barbourfe3351b2015-07-28 10:17:20 -0600902 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800903 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600904 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500905
906 testFence.init(*m_device, fenceInfo);
907
908 // Bypass framework since it does the waits automatically
909 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600910 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800911 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
912 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800913 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600914 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700915 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800916 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800917 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800918 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600919 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600920
921 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500922 ASSERT_VK_SUCCESS( err );
923
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500924 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800925 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500926
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200927 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500928}
929
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800930TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500931{
932 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500933 VkFenceCreateInfo fenceInfo = {};
934 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
935 fenceInfo.pNext = NULL;
936 fenceInfo.flags = 0;
937
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600939
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500940 ASSERT_NO_FATAL_FAILURE(InitState());
941 ASSERT_NO_FATAL_FAILURE(InitViewport());
942 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
943
Tony Barbourfe3351b2015-07-28 10:17:20 -0600944 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800945 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600946 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500947
948 testFence.init(*m_device, fenceInfo);
949
950 // Bypass framework since it does the waits automatically
951 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600952 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800953 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
954 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800955 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600956 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700957 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800958 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800959 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800960 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600961 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600962
963 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500964 ASSERT_VK_SUCCESS( err );
965
Jon Ashburnf19916e2016-01-11 13:12:43 -0700966 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800967 VkCommandBufferBeginInfo info = {};
968 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
969 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600970 info.renderPass = VK_NULL_HANDLE;
971 info.subpass = 0;
972 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800973 info.occlusionQueryEnable = VK_FALSE;
974 info.queryFlags = 0;
975 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600976
977 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800978 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500979
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200980 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500981}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700982#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200983
Mark Lobodzinski152fe252016-05-03 16:49:15 -0600984// This is a positive test. No failures are expected.
985TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
986 VkResult err;
987 bool pass;
988
989 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
990 "the buffer, create an image, and bind the same memory to "
991 "it");
992
993 m_errorMonitor->ExpectSuccess();
994
995 ASSERT_NO_FATAL_FAILURE(InitState());
996
997 VkBuffer buffer;
998 VkImage image;
999 VkDeviceMemory mem;
1000 VkMemoryRequirements mem_reqs;
1001
1002 VkBufferCreateInfo buf_info = {};
1003 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1004 buf_info.pNext = NULL;
1005 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1006 buf_info.size = 256;
1007 buf_info.queueFamilyIndexCount = 0;
1008 buf_info.pQueueFamilyIndices = NULL;
1009 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1010 buf_info.flags = 0;
1011 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1012 ASSERT_VK_SUCCESS(err);
1013
1014 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1015
1016 VkMemoryAllocateInfo alloc_info = {};
1017 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1018 alloc_info.pNext = NULL;
1019 alloc_info.memoryTypeIndex = 0;
1020
1021 // Ensure memory is big enough for both bindings
1022 alloc_info.allocationSize = 0x10000;
1023
1024 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1025 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1026 if (!pass) {
1027 vkDestroyBuffer(m_device->device(), buffer, NULL);
1028 return;
1029 }
1030
1031 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1032 ASSERT_VK_SUCCESS(err);
1033
1034 uint8_t *pData;
1035 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1036 (void **)&pData);
1037 ASSERT_VK_SUCCESS(err);
1038
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001039 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001040
1041 vkUnmapMemory(m_device->device(), mem);
1042
1043 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1044 ASSERT_VK_SUCCESS(err);
1045
1046 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1047 // memory. In fact, it was never used by the GPU.
1048 // Just be be sure, wait for idle.
1049 vkDestroyBuffer(m_device->device(), buffer, NULL);
1050 vkDeviceWaitIdle(m_device->device());
1051
1052 VkImageCreateInfo image_create_info = {};
1053 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1054 image_create_info.pNext = NULL;
1055 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1056 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1057 image_create_info.extent.width = 64;
1058 image_create_info.extent.height = 64;
1059 image_create_info.extent.depth = 1;
1060 image_create_info.mipLevels = 1;
1061 image_create_info.arrayLayers = 1;
1062 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1063 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1064 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1065 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1066 image_create_info.queueFamilyIndexCount = 0;
1067 image_create_info.pQueueFamilyIndices = NULL;
1068 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1069 image_create_info.flags = 0;
1070
1071 VkMemoryAllocateInfo mem_alloc = {};
1072 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1073 mem_alloc.pNext = NULL;
1074 mem_alloc.allocationSize = 0;
1075 mem_alloc.memoryTypeIndex = 0;
1076
1077 /* Create a mappable image. It will be the texture if linear images are ok
1078 * to be textures or it will be the staging image if they are not.
1079 */
1080 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1081 ASSERT_VK_SUCCESS(err);
1082
1083 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1084
1085 mem_alloc.allocationSize = mem_reqs.size;
1086
1087 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
1088 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1089 if (!pass) {
1090 vkDestroyImage(m_device->device(), image, NULL);
1091 return;
1092 }
1093
1094 // VALDIATION FAILURE:
1095 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1096 ASSERT_VK_SUCCESS(err);
1097
1098 m_errorMonitor->VerifyNotFound();
1099
1100 vkDestroyBuffer(m_device->device(), buffer, NULL);
1101 vkDestroyImage(m_device->device(), image, NULL);
1102}
1103
Ian Elliott1c32c772016-04-28 14:47:13 -06001104TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1105 VkResult err;
1106 bool pass;
1107
Ian Elliott489eec02016-05-05 14:12:44 -06001108// FIXME: After we turn on this code for non-Linux platforms, uncomment the
1109// following declaration (which is temporarily being moved below):
1110// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001111 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
1112 VkSwapchainCreateInfoKHR swapchain_create_info = {};
1113 uint32_t swapchain_image_count = 0;
1114// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
1115 uint32_t image_index = 0;
1116// VkPresentInfoKHR present_info = {};
1117
1118 ASSERT_NO_FATAL_FAILURE(InitState());
1119
Ian Elliott3f06ce52016-04-29 14:46:21 -06001120#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1121#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1122 // Use the functions from the VK_KHR_android_surface extension without
1123 // enabling that extension:
1124
1125 // Create a surface:
1126 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
1127#if 0
1128#endif
1129 m_errorMonitor->SetDesiredFailureMsg(
1130 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1131 "extension was not enabled for this");
1132 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
1133 &surface);
1134 pass = (err != VK_SUCCESS);
1135 ASSERT_TRUE(pass);
1136 m_errorMonitor->VerifyFound();
1137#endif // VK_USE_PLATFORM_ANDROID_KHR
1138
1139
1140#if defined(VK_USE_PLATFORM_MIR_KHR)
1141 // Use the functions from the VK_KHR_mir_surface extension without enabling
1142 // that extension:
1143
1144 // Create a surface:
1145 VkMirSurfaceCreateInfoKHR mir_create_info = {};
1146#if 0
1147#endif
1148 m_errorMonitor->SetDesiredFailureMsg(
1149 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1150 "extension was not enabled for this");
1151 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1152 pass = (err != VK_SUCCESS);
1153 ASSERT_TRUE(pass);
1154 m_errorMonitor->VerifyFound();
1155
1156 // Tell whether an mir_connection supports presentation:
1157 MirConnection *mir_connection = NULL;
1158 m_errorMonitor->SetDesiredFailureMsg(
1159 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1160 "extension was not enabled for this");
1161 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
1162 visual_id);
1163 m_errorMonitor->VerifyFound();
1164#endif // VK_USE_PLATFORM_MIR_KHR
1165
1166
1167#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1168 // Use the functions from the VK_KHR_wayland_surface extension without
1169 // enabling that extension:
1170
1171 // Create a surface:
1172 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
1173#if 0
1174#endif
1175 m_errorMonitor->SetDesiredFailureMsg(
1176 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1177 "extension was not enabled for this");
1178 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
1179 &surface);
1180 pass = (err != VK_SUCCESS);
1181 ASSERT_TRUE(pass);
1182 m_errorMonitor->VerifyFound();
1183
1184 // Tell whether an wayland_display supports presentation:
1185 struct wl_display wayland_display = {};
1186 m_errorMonitor->SetDesiredFailureMsg(
1187 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1188 "extension was not enabled for this");
1189 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
1190 &wayland_display);
1191 m_errorMonitor->VerifyFound();
1192#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06001193#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001194
1195
1196#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06001197// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1198// TO NON-LINUX PLATFORMS:
1199VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001200 // Use the functions from the VK_KHR_win32_surface extension without
1201 // enabling that extension:
1202
1203 // Create a surface:
1204 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
1205#if 0
1206#endif
1207 m_errorMonitor->SetDesiredFailureMsg(
1208 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1209 "extension was not enabled for this");
1210 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
1211 &surface);
1212 pass = (err != VK_SUCCESS);
1213 ASSERT_TRUE(pass);
1214 m_errorMonitor->VerifyFound();
1215
1216 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001217 m_errorMonitor->SetDesiredFailureMsg(
1218 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1219 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001220 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001221 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001222// Set this (for now, until all platforms are supported and tested):
1223#define NEED_TO_TEST_THIS_ON_PLATFORM
1224#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001225
1226
Ian Elliott1c32c772016-04-28 14:47:13 -06001227#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06001228// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1229// TO NON-LINUX PLATFORMS:
1230VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001231 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1232 // that extension:
1233
1234 // Create a surface:
1235 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
1236#if 0
1237#endif
1238 m_errorMonitor->SetDesiredFailureMsg(
1239 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1240 "extension was not enabled for this");
1241 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1242 pass = (err != VK_SUCCESS);
1243 ASSERT_TRUE(pass);
1244 m_errorMonitor->VerifyFound();
1245
1246 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001247 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001248 xcb_visualid_t visual_id = 0;
1249 m_errorMonitor->SetDesiredFailureMsg(
1250 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1251 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001252 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06001253 visual_id);
1254 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001255// Set this (for now, until all platforms are supported and tested):
1256#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001257#endif // VK_USE_PLATFORM_XCB_KHR
1258
1259
Ian Elliott12630812016-04-29 14:35:43 -06001260#if defined(VK_USE_PLATFORM_XLIB_KHR)
1261 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1262 // that extension:
1263
1264 // Create a surface:
1265 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
1266#if 0
1267#endif
1268 m_errorMonitor->SetDesiredFailureMsg(
1269 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1270 "extension was not enabled for this");
1271 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1272 pass = (err != VK_SUCCESS);
1273 ASSERT_TRUE(pass);
1274 m_errorMonitor->VerifyFound();
1275
1276 // Tell whether an Xlib VisualID supports presentation:
1277 Display *dpy = NULL;
1278 VisualID visual = 0;
1279 m_errorMonitor->SetDesiredFailureMsg(
1280 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1281 "extension was not enabled for this");
1282 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1283 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001284// Set this (for now, until all platforms are supported and tested):
1285#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06001286#endif // VK_USE_PLATFORM_XLIB_KHR
1287
1288
Ian Elliott1c32c772016-04-28 14:47:13 -06001289 // Use the functions from the VK_KHR_surface extension without enabling
1290 // that extension:
1291
Ian Elliott489eec02016-05-05 14:12:44 -06001292#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001293 // Destroy a surface:
1294 m_errorMonitor->SetDesiredFailureMsg(
1295 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1296 "extension was not enabled for this");
1297 vkDestroySurfaceKHR(instance(), surface, NULL);
1298 m_errorMonitor->VerifyFound();
1299
1300 // Check if surface supports presentation:
1301 VkBool32 supported = false;
1302 m_errorMonitor->SetDesiredFailureMsg(
1303 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1304 "extension was not enabled for this");
1305 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1306 pass = (err != VK_SUCCESS);
1307 ASSERT_TRUE(pass);
1308 m_errorMonitor->VerifyFound();
1309
1310 // Check surface capabilities:
1311 VkSurfaceCapabilitiesKHR capabilities = {};
1312 m_errorMonitor->SetDesiredFailureMsg(
1313 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1314 "extension was not enabled for this");
1315 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
1316 &capabilities);
1317 pass = (err != VK_SUCCESS);
1318 ASSERT_TRUE(pass);
1319 m_errorMonitor->VerifyFound();
1320
1321 // Check surface formats:
1322 uint32_t format_count = 0;
1323 VkSurfaceFormatKHR *formats = NULL;
1324 m_errorMonitor->SetDesiredFailureMsg(
1325 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1326 "extension was not enabled for this");
1327 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1328 &format_count, formats);
1329 pass = (err != VK_SUCCESS);
1330 ASSERT_TRUE(pass);
1331 m_errorMonitor->VerifyFound();
1332
1333 // Check surface present modes:
1334 uint32_t present_mode_count = 0;
1335 VkSurfaceFormatKHR *present_modes = NULL;
1336 m_errorMonitor->SetDesiredFailureMsg(
1337 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1338 "extension was not enabled for this");
1339 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1340 &present_mode_count, present_modes);
1341 pass = (err != VK_SUCCESS);
1342 ASSERT_TRUE(pass);
1343 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001344#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001345
1346
1347 // Use the functions from the VK_KHR_swapchain extension without enabling
1348 // that extension:
1349
1350 // Create a swapchain:
1351 m_errorMonitor->SetDesiredFailureMsg(
1352 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1353 "extension was not enabled for this");
1354 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1355 swapchain_create_info.pNext = NULL;
1356#if 0
1357 swapchain_create_info.flags = 0;
1358 swapchain_create_info.surface = 0;
1359 swapchain_create_info.minImageCount = 0;
1360 swapchain_create_info.imageFormat = 0;
1361 swapchain_create_info.imageColorSpace = 0;
1362 swapchain_create_info.imageExtent.width = 0;
1363 swapchain_create_info.imageExtent.height = 0;
1364 swapchain_create_info.imageArrayLayers = 0;
1365 swapchain_create_info.imageUsage = 0;
1366 swapchain_create_info.imageSharingMode = 0;
1367 swapchain_create_info.queueFamilyIndexCount = 0;
1368 swapchain_create_info.preTransform = 0;
1369 swapchain_create_info.compositeAlpha = 0;
1370 swapchain_create_info.presentMode = 0;
1371 swapchain_create_info.clipped = 0;
1372 swapchain_create_info.oldSwapchain = NULL;
1373#endif
1374 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1375 NULL, &swapchain);
1376 pass = (err != VK_SUCCESS);
1377 ASSERT_TRUE(pass);
1378 m_errorMonitor->VerifyFound();
1379
1380 // Get the images from the swapchain:
1381 m_errorMonitor->SetDesiredFailureMsg(
1382 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1383 "extension was not enabled for this");
1384 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
1385 &swapchain_image_count, NULL);
1386 pass = (err != VK_SUCCESS);
1387 ASSERT_TRUE(pass);
1388 m_errorMonitor->VerifyFound();
1389
1390 // Try to acquire an image:
1391 m_errorMonitor->SetDesiredFailureMsg(
1392 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1393 "extension was not enabled for this");
1394 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
1395 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
1396 pass = (err != VK_SUCCESS);
1397 ASSERT_TRUE(pass);
1398 m_errorMonitor->VerifyFound();
1399
1400 // Try to present an image:
1401#if 0 // NOTE: Currently can't test this because a real swapchain is needed
1402 // (as opposed to the fake one we created) in order for the layer to
1403 // lookup the VkDevice used to enable the extension:
1404 m_errorMonitor->SetDesiredFailureMsg(
1405 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1406 "extension was not enabled for this");
1407 present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
1408 present_info.pNext = NULL;
1409#if 0
1410#endif
1411 err = vkQueuePresentKHR(m_device->m_queue, &present_info);
1412 pass = (err != VK_SUCCESS);
1413 ASSERT_TRUE(pass);
1414 m_errorMonitor->VerifyFound();
1415#endif
1416
1417 // Destroy the swapchain:
1418 m_errorMonitor->SetDesiredFailureMsg(
1419 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1420 "extension was not enabled for this");
1421 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1422 m_errorMonitor->VerifyFound();
1423}
1424
Karl Schultz6addd812016-02-02 17:17:23 -07001425TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1426 VkResult err;
1427 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001428
Karl Schultz6addd812016-02-02 17:17:23 -07001429 m_errorMonitor->SetDesiredFailureMsg(
1430 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001431 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
1432
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001433 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001434
1435 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001436 VkImage image;
1437 VkDeviceMemory mem;
1438 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001439
Karl Schultz6addd812016-02-02 17:17:23 -07001440 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1441 const int32_t tex_width = 32;
1442 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001443
Tony Barboureb254902015-07-15 12:50:33 -06001444 VkImageCreateInfo image_create_info = {};
1445 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001446 image_create_info.pNext = NULL;
1447 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1448 image_create_info.format = tex_format;
1449 image_create_info.extent.width = tex_width;
1450 image_create_info.extent.height = tex_height;
1451 image_create_info.extent.depth = 1;
1452 image_create_info.mipLevels = 1;
1453 image_create_info.arrayLayers = 1;
1454 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1455 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1456 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1457 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001458
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001459 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001460 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001461 mem_alloc.pNext = NULL;
1462 mem_alloc.allocationSize = 0;
1463 // Introduce failure, do NOT set memProps to
1464 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
1465 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001466
Chia-I Wuf7458c52015-10-26 21:10:41 +08001467 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001468 ASSERT_VK_SUCCESS(err);
1469
Karl Schultz6addd812016-02-02 17:17:23 -07001470 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001471
Mark Lobodzinski23065352015-05-29 09:32:35 -05001472 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001473
Karl Schultz6addd812016-02-02 17:17:23 -07001474 pass =
1475 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
1476 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1477 if (!pass) { // If we can't find any unmappable memory this test doesn't
1478 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08001479 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06001480 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06001481 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06001482
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001483 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001484 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001485 ASSERT_VK_SUCCESS(err);
1486
1487 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06001488 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001489 ASSERT_VK_SUCCESS(err);
1490
1491 // Map memory as if to initialize the image
1492 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07001493 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
1494 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001495
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001496 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001497
Chia-I Wuf7458c52015-10-26 21:10:41 +08001498 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001499}
1500
Karl Schultz6addd812016-02-02 17:17:23 -07001501TEST_F(VkLayerTest, RebindMemory) {
1502 VkResult err;
1503 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001504
Karl Schultz6addd812016-02-02 17:17:23 -07001505 m_errorMonitor->SetDesiredFailureMsg(
1506 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001507 "which has already been bound to mem object");
1508
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001509 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001510
1511 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001512 VkImage image;
1513 VkDeviceMemory mem1;
1514 VkDeviceMemory mem2;
1515 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001516
Karl Schultz6addd812016-02-02 17:17:23 -07001517 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1518 const int32_t tex_width = 32;
1519 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001520
Tony Barboureb254902015-07-15 12:50:33 -06001521 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001522 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1523 image_create_info.pNext = NULL;
1524 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1525 image_create_info.format = tex_format;
1526 image_create_info.extent.width = tex_width;
1527 image_create_info.extent.height = tex_height;
1528 image_create_info.extent.depth = 1;
1529 image_create_info.mipLevels = 1;
1530 image_create_info.arrayLayers = 1;
1531 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1532 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1533 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1534 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001535
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001536 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001537 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1538 mem_alloc.pNext = NULL;
1539 mem_alloc.allocationSize = 0;
1540 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06001541
Karl Schultz6addd812016-02-02 17:17:23 -07001542 // Introduce failure, do NOT set memProps to
1543 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06001544 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001545 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001546 ASSERT_VK_SUCCESS(err);
1547
Karl Schultz6addd812016-02-02 17:17:23 -07001548 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001549
1550 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001551 pass =
1552 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001553 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001554
1555 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001556 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001557 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001558 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001559 ASSERT_VK_SUCCESS(err);
1560
1561 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06001562 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001563 ASSERT_VK_SUCCESS(err);
1564
Karl Schultz6addd812016-02-02 17:17:23 -07001565 // Introduce validation failure, try to bind a different memory object to
1566 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06001567 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001568
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001569 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001570
Chia-I Wuf7458c52015-10-26 21:10:41 +08001571 vkDestroyImage(m_device->device(), image, NULL);
1572 vkFreeMemory(m_device->device(), mem1, NULL);
1573 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001574}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001575
Karl Schultz6addd812016-02-02 17:17:23 -07001576TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001577 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001578
Karl Schultz6addd812016-02-02 17:17:23 -07001579 m_errorMonitor->SetDesiredFailureMsg(
1580 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
1581 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001582
1583 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001584 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1585 fenceInfo.pNext = NULL;
1586 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06001587
Tony Barbour300a6082015-04-07 13:44:53 -06001588 ASSERT_NO_FATAL_FAILURE(InitState());
1589 ASSERT_NO_FATAL_FAILURE(InitViewport());
1590 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1591
Tony Barbourfe3351b2015-07-28 10:17:20 -06001592 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001593 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1594 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001595 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06001596
1597 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001598
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001599 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001600 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1601 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001602 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001603 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001604 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001605 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001606 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001607 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001608 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001609
1610 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001611 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001612
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001613 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001614}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001615// This is a positive test. We used to expect error in this case but spec now
1616// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07001617TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001618 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001619 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001620 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001621 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1622 fenceInfo.pNext = NULL;
1623
Tony Barbour0b4d9562015-04-09 10:48:04 -06001624 ASSERT_NO_FATAL_FAILURE(InitState());
1625 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08001626 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001627 VkResult result = vkResetFences(m_device->device(), 1, fences);
1628 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06001629
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001630 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06001631}
Tobin Ehlis41376e12015-07-03 08:45:14 -06001632
1633TEST_F(VkLayerTest, InvalidUsageBits)
1634{
Tony Barbourf92621a2016-05-02 14:28:12 -06001635 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001636 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06001637 "Initialize buffer with wrong usage then perform copy expecting errors "
1638 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001639 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001640 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001641
1642 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06001643 VkImageObj image(m_device);
1644 // Initialize image with USAGE_INPUT_ATTACHMENT
1645 image.init(128, 128, VK_FORMAT_D32_SFLOAT_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001646 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1647 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06001648
Tony Barbourf92621a2016-05-02 14:28:12 -06001649 VkImageView dsv;
1650 VkImageViewCreateInfo dsvci = {};
1651 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1652 dsvci.image = image.handle();
1653 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
1654 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
1655 dsvci.subresourceRange.layerCount = 1;
1656 dsvci.subresourceRange.baseMipLevel = 0;
1657 dsvci.subresourceRange.levelCount = 1;
1658 dsvci.subresourceRange.aspectMask =
1659 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06001660
Tony Barbourf92621a2016-05-02 14:28:12 -06001661 // Create a view with depth / stencil aspect for image with different usage
1662 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001663
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001664 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06001665
1666 // Initialize buffer with TRANSFER_DST usage
1667 vk_testing::Buffer buffer;
1668 VkMemoryPropertyFlags reqs = 0;
1669 buffer.init_as_dst(*m_device, 128 * 128, reqs);
1670 VkBufferImageCopy region = {};
1671 region.bufferRowLength = 128;
1672 region.bufferImageHeight = 128;
1673 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1674 region.imageSubresource.layerCount = 1;
1675 region.imageExtent.height = 16;
1676 region.imageExtent.width = 16;
1677 region.imageExtent.depth = 1;
1678
1679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1680 "Invalid usage flag for buffer ");
1681 // Buffer usage not set to TRANSFER_SRC and image usage not set to
1682 // TRANSFER_DST
1683 BeginCommandBuffer();
1684 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1685 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1686 1, &region);
1687 m_errorMonitor->VerifyFound();
1688
1689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1690 "Invalid usage flag for image ");
1691 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1692 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1693 1, &region);
1694 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06001695}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001696#endif // MEM_TRACKER_TESTS
1697
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06001698#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06001699
1700TEST_F(VkLayerTest, LeakAnObject) {
1701 VkResult err;
1702
1703 TEST_DESCRIPTION(
1704 "Create a fence and destroy its device without first destroying the fence.");
1705
1706 // Note that we have to create a new device since destroying the
1707 // framework's device causes Teardown() to fail and just calling Teardown
1708 // will destroy the errorMonitor.
1709
1710 m_errorMonitor->SetDesiredFailureMsg(
1711 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1712 "OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT object");
1713
1714 ASSERT_NO_FATAL_FAILURE(InitState());
1715
1716 const std::vector<VkQueueFamilyProperties> queue_props =
1717 m_device->queue_props;
1718 std::vector<VkDeviceQueueCreateInfo> queue_info;
1719 queue_info.reserve(queue_props.size());
1720 std::vector<std::vector<float>> queue_priorities;
1721 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
1722 VkDeviceQueueCreateInfo qi = {};
1723 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
1724 qi.pNext = NULL;
1725 qi.queueFamilyIndex = i;
1726 qi.queueCount = queue_props[i].queueCount;
1727 queue_priorities.emplace_back(qi.queueCount, 0.0f);
1728 qi.pQueuePriorities = queue_priorities[i].data();
1729 queue_info.push_back(qi);
1730 }
1731
1732 std::vector<const char *> device_layer_names;
1733 std::vector<const char *> device_extension_names;
1734 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
1735 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
1736 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
1737 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
1738 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
1739 device_layer_names.push_back("VK_LAYER_LUNARG_image");
1740 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
1741
1742 // The sacrificial device object
1743 VkDevice testDevice;
1744 VkDeviceCreateInfo device_create_info = {};
1745 auto features = m_device->phy().features();
1746 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
1747 device_create_info.pNext = NULL;
1748 device_create_info.queueCreateInfoCount = queue_info.size();
1749 device_create_info.pQueueCreateInfos = queue_info.data();
1750 device_create_info.enabledLayerCount = device_layer_names.size();
1751 device_create_info.ppEnabledLayerNames = device_layer_names.data();
1752 device_create_info.pEnabledFeatures = &features;
1753 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
1754 ASSERT_VK_SUCCESS(err);
1755
1756 VkFence fence;
1757 VkFenceCreateInfo fence_create_info = {};
1758 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1759 fence_create_info.pNext = NULL;
1760 fence_create_info.flags = 0;
1761 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
1762 ASSERT_VK_SUCCESS(err);
1763
1764 // Induce failure by not calling vkDestroyFence
1765 vkDestroyDevice(testDevice, NULL);
1766 m_errorMonitor->VerifyFound();
1767}
1768
1769TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
1770
1771 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
1772 "attempt to delete them from another.");
1773
1774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1775 "FreeCommandBuffers is attempting to free Command Buffer");
1776
1777 VkCommandPool command_pool_one;
1778 VkCommandPool command_pool_two;
1779
1780 VkCommandPoolCreateInfo pool_create_info{};
1781 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1782 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1783 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1784
1785 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1786 &command_pool_one);
1787
1788 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1789 &command_pool_two);
1790
1791 VkCommandBuffer command_buffer[9];
1792 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1793 command_buffer_allocate_info.sType =
1794 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1795 command_buffer_allocate_info.commandPool = command_pool_one;
1796 command_buffer_allocate_info.commandBufferCount = 9;
1797 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1798 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1799 command_buffer);
1800
1801 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
1802 &command_buffer[3]);
1803
1804 m_errorMonitor->VerifyFound();
1805
1806 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
1807 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
1808}
1809
1810TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
1811 VkResult err;
1812
1813 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
1814 "attempt to delete them from another.");
1815
1816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1817 "FreeDescriptorSets is attempting to free descriptorSet");
1818
1819 ASSERT_NO_FATAL_FAILURE(InitState());
1820 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1821
1822 VkDescriptorPoolSize ds_type_count = {};
1823 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
1824 ds_type_count.descriptorCount = 1;
1825
1826 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1827 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1828 ds_pool_ci.pNext = NULL;
1829 ds_pool_ci.flags = 0;
1830 ds_pool_ci.maxSets = 1;
1831 ds_pool_ci.poolSizeCount = 1;
1832 ds_pool_ci.pPoolSizes = &ds_type_count;
1833
1834 VkDescriptorPool ds_pool_one;
1835 err =
1836 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
1837 ASSERT_VK_SUCCESS(err);
1838
1839 // Create a second descriptor pool
1840 VkDescriptorPool ds_pool_two;
1841 err =
1842 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
1843 ASSERT_VK_SUCCESS(err);
1844
1845 VkDescriptorSetLayoutBinding dsl_binding = {};
1846 dsl_binding.binding = 0;
1847 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1848 dsl_binding.descriptorCount = 1;
1849 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1850 dsl_binding.pImmutableSamplers = NULL;
1851
1852 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1853 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1854 ds_layout_ci.pNext = NULL;
1855 ds_layout_ci.bindingCount = 1;
1856 ds_layout_ci.pBindings = &dsl_binding;
1857
1858 VkDescriptorSetLayout ds_layout;
1859 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1860 &ds_layout);
1861 ASSERT_VK_SUCCESS(err);
1862
1863 VkDescriptorSet descriptorSet;
1864 VkDescriptorSetAllocateInfo alloc_info = {};
1865 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1866 alloc_info.descriptorSetCount = 1;
1867 alloc_info.descriptorPool = ds_pool_one;
1868 alloc_info.pSetLayouts = &ds_layout;
1869 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1870 &descriptorSet);
1871 ASSERT_VK_SUCCESS(err);
1872
1873 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
1874
1875 m_errorMonitor->VerifyFound();
1876
1877 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1878 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
1879 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
1880}
1881
1882TEST_F(VkLayerTest, CreateUnknownObject) {
1883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1884 "Invalid VkImage Object ");
1885
1886 TEST_DESCRIPTION(
1887 "Pass an invalid image object handle into a Vulkan API call.");
1888
1889 ASSERT_NO_FATAL_FAILURE(InitState());
1890
1891 // Pass bogus handle into GetImageMemoryRequirements
1892 VkMemoryRequirements mem_reqs;
1893 uint64_t fakeImageHandle = 0xCADECADE;
1894 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
1895
1896 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
1897
1898 m_errorMonitor->VerifyFound();
1899}
1900
Karl Schultz6addd812016-02-02 17:17:23 -07001901TEST_F(VkLayerTest, PipelineNotBound) {
1902 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001903
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06001904 TEST_DESCRIPTION(
1905 "Pass in an invalid pipeline object handle into a Vulkan API call.");
1906
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001908 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001909
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001910 ASSERT_NO_FATAL_FAILURE(InitState());
1911 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001912
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001913 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001914 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1915 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001916
1917 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001918 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1919 ds_pool_ci.pNext = NULL;
1920 ds_pool_ci.maxSets = 1;
1921 ds_pool_ci.poolSizeCount = 1;
1922 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001923
1924 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001925 err =
1926 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001927 ASSERT_VK_SUCCESS(err);
1928
1929 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001930 dsl_binding.binding = 0;
1931 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1932 dsl_binding.descriptorCount = 1;
1933 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1934 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001935
1936 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001937 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1938 ds_layout_ci.pNext = NULL;
1939 ds_layout_ci.bindingCount = 1;
1940 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001941
1942 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001943 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1944 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001945 ASSERT_VK_SUCCESS(err);
1946
1947 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001948 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001949 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001950 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001951 alloc_info.descriptorPool = ds_pool;
1952 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001953 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1954 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001955 ASSERT_VK_SUCCESS(err);
1956
1957 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001958 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1959 pipeline_layout_ci.pNext = NULL;
1960 pipeline_layout_ci.setLayoutCount = 1;
1961 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001962
1963 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001964 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1965 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001966 ASSERT_VK_SUCCESS(err);
1967
Mark Youngad779052016-01-06 14:26:04 -07001968 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001969
1970 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001971 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1972 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001973
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001974 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001975
Chia-I Wuf7458c52015-10-26 21:10:41 +08001976 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1977 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1978 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001979}
1980
Karl Schultz6addd812016-02-02 17:17:23 -07001981TEST_F(VkLayerTest, BindInvalidMemory) {
1982 VkResult err;
1983 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001984
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001986 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001987
Tobin Ehlisec598302015-09-15 15:02:17 -06001988 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001989
1990 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001991 VkImage image;
1992 VkDeviceMemory mem;
1993 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001994
Karl Schultz6addd812016-02-02 17:17:23 -07001995 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1996 const int32_t tex_width = 32;
1997 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001998
1999 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002000 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2001 image_create_info.pNext = NULL;
2002 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2003 image_create_info.format = tex_format;
2004 image_create_info.extent.width = tex_width;
2005 image_create_info.extent.height = tex_height;
2006 image_create_info.extent.depth = 1;
2007 image_create_info.mipLevels = 1;
2008 image_create_info.arrayLayers = 1;
2009 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2010 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2011 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2012 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002013
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002014 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002015 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2016 mem_alloc.pNext = NULL;
2017 mem_alloc.allocationSize = 0;
2018 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002019
Chia-I Wuf7458c52015-10-26 21:10:41 +08002020 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002021 ASSERT_VK_SUCCESS(err);
2022
Karl Schultz6addd812016-02-02 17:17:23 -07002023 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002024
2025 mem_alloc.allocationSize = mem_reqs.size;
2026
Karl Schultz6addd812016-02-02 17:17:23 -07002027 pass =
2028 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002029 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002030
2031 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002032 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002033 ASSERT_VK_SUCCESS(err);
2034
2035 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002036 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002037
2038 // Try to bind free memory that has been freed
2039 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2040 // This may very well return an error.
2041 (void)err;
2042
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002043 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002044
Chia-I Wuf7458c52015-10-26 21:10:41 +08002045 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002046}
2047
Karl Schultz6addd812016-02-02 17:17:23 -07002048TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2049 VkResult err;
2050 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002051
Karl Schultz6addd812016-02-02 17:17:23 -07002052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2053 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002054
Tobin Ehlisec598302015-09-15 15:02:17 -06002055 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002056
Karl Schultz6addd812016-02-02 17:17:23 -07002057 // Create an image object, allocate memory, destroy the object and then try
2058 // to bind it
2059 VkImage image;
2060 VkDeviceMemory mem;
2061 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002062
Karl Schultz6addd812016-02-02 17:17:23 -07002063 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2064 const int32_t tex_width = 32;
2065 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002066
2067 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002068 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2069 image_create_info.pNext = NULL;
2070 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2071 image_create_info.format = tex_format;
2072 image_create_info.extent.width = tex_width;
2073 image_create_info.extent.height = tex_height;
2074 image_create_info.extent.depth = 1;
2075 image_create_info.mipLevels = 1;
2076 image_create_info.arrayLayers = 1;
2077 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2078 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2079 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2080 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002081
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002082 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002083 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2084 mem_alloc.pNext = NULL;
2085 mem_alloc.allocationSize = 0;
2086 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002087
Chia-I Wuf7458c52015-10-26 21:10:41 +08002088 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002089 ASSERT_VK_SUCCESS(err);
2090
Karl Schultz6addd812016-02-02 17:17:23 -07002091 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002092
2093 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002094 pass =
2095 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002096 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002097
2098 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002099 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002100 ASSERT_VK_SUCCESS(err);
2101
2102 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002103 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002104 ASSERT_VK_SUCCESS(err);
2105
2106 // Now Try to bind memory to this destroyed object
2107 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2108 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002109 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002110
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002111 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002112
Chia-I Wuf7458c52015-10-26 21:10:41 +08002113 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002114}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002115
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002116#endif // OBJ_TRACKER_TESTS
2117
Tobin Ehlis0788f522015-05-26 16:11:58 -06002118#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002119
2120// This is a positive test. No errors should be generated.
2121TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
2122
2123 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2124 "submitted on separate queues followed by a QueueWaitIdle.");
2125
Dustin Graves48458142016-04-29 16:11:55 -06002126 if ((m_device->queue_props.empty()) ||
2127 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002128 return;
2129
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002130 m_errorMonitor->ExpectSuccess();
2131
2132 VkSemaphore semaphore;
2133 VkSemaphoreCreateInfo semaphore_create_info{};
2134 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2135 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2136 &semaphore);
2137
2138 VkCommandPool command_pool;
2139 VkCommandPoolCreateInfo pool_create_info{};
2140 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2141 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2142 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2143 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2144 &command_pool);
2145
2146 VkCommandBuffer command_buffer[2];
2147 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2148 command_buffer_allocate_info.sType =
2149 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2150 command_buffer_allocate_info.commandPool = command_pool;
2151 command_buffer_allocate_info.commandBufferCount = 2;
2152 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2153 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2154 command_buffer);
2155
2156 VkQueue queue = VK_NULL_HANDLE;
2157 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2158 1, &queue);
2159
2160 {
2161 VkCommandBufferBeginInfo begin_info{};
2162 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2163 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2164
2165 vkCmdPipelineBarrier(command_buffer[0],
2166 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2167 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2168 0, nullptr, 0, nullptr);
2169
2170 VkViewport viewport{};
2171 viewport.maxDepth = 1.0f;
2172 viewport.minDepth = 0.0f;
2173 viewport.width = 512;
2174 viewport.height = 512;
2175 viewport.x = 0;
2176 viewport.y = 0;
2177 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2178 vkEndCommandBuffer(command_buffer[0]);
2179 }
2180 {
2181 VkCommandBufferBeginInfo begin_info{};
2182 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2183 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2184
2185 VkViewport viewport{};
2186 viewport.maxDepth = 1.0f;
2187 viewport.minDepth = 0.0f;
2188 viewport.width = 512;
2189 viewport.height = 512;
2190 viewport.x = 0;
2191 viewport.y = 0;
2192 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2193 vkEndCommandBuffer(command_buffer[1]);
2194 }
2195 {
2196 VkSubmitInfo submit_info{};
2197 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2198 submit_info.commandBufferCount = 1;
2199 submit_info.pCommandBuffers = &command_buffer[0];
2200 submit_info.signalSemaphoreCount = 1;
2201 submit_info.pSignalSemaphores = &semaphore;
2202 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2203 }
2204 {
2205 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2206 VkSubmitInfo submit_info{};
2207 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2208 submit_info.commandBufferCount = 1;
2209 submit_info.pCommandBuffers = &command_buffer[1];
2210 submit_info.waitSemaphoreCount = 1;
2211 submit_info.pWaitSemaphores = &semaphore;
2212 submit_info.pWaitDstStageMask = flags;
2213 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2214 }
2215
2216 vkQueueWaitIdle(m_device->m_queue);
2217
2218 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2219 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2220 &command_buffer[0]);
2221 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2222
2223 m_errorMonitor->VerifyNotFound();
2224}
2225
2226// This is a positive test. No errors should be generated.
2227TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
2228
2229 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2230 "submitted on separate queues, the second having a fence"
2231 "followed by a QueueWaitIdle.");
2232
Dustin Graves48458142016-04-29 16:11:55 -06002233 if ((m_device->queue_props.empty()) ||
2234 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002235 return;
2236
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002237 m_errorMonitor->ExpectSuccess();
2238
2239 VkFence fence;
2240 VkFenceCreateInfo fence_create_info{};
2241 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2242 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2243
2244 VkSemaphore semaphore;
2245 VkSemaphoreCreateInfo semaphore_create_info{};
2246 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2247 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2248 &semaphore);
2249
2250 VkCommandPool command_pool;
2251 VkCommandPoolCreateInfo pool_create_info{};
2252 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2253 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2254 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2255 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2256 &command_pool);
2257
2258 VkCommandBuffer command_buffer[2];
2259 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2260 command_buffer_allocate_info.sType =
2261 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2262 command_buffer_allocate_info.commandPool = command_pool;
2263 command_buffer_allocate_info.commandBufferCount = 2;
2264 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2265 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2266 command_buffer);
2267
2268 VkQueue queue = VK_NULL_HANDLE;
2269 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2270 1, &queue);
2271
2272 {
2273 VkCommandBufferBeginInfo begin_info{};
2274 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2275 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2276
2277 vkCmdPipelineBarrier(command_buffer[0],
2278 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2279 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2280 0, nullptr, 0, nullptr);
2281
2282 VkViewport viewport{};
2283 viewport.maxDepth = 1.0f;
2284 viewport.minDepth = 0.0f;
2285 viewport.width = 512;
2286 viewport.height = 512;
2287 viewport.x = 0;
2288 viewport.y = 0;
2289 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2290 vkEndCommandBuffer(command_buffer[0]);
2291 }
2292 {
2293 VkCommandBufferBeginInfo begin_info{};
2294 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2295 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2296
2297 VkViewport viewport{};
2298 viewport.maxDepth = 1.0f;
2299 viewport.minDepth = 0.0f;
2300 viewport.width = 512;
2301 viewport.height = 512;
2302 viewport.x = 0;
2303 viewport.y = 0;
2304 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2305 vkEndCommandBuffer(command_buffer[1]);
2306 }
2307 {
2308 VkSubmitInfo submit_info{};
2309 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2310 submit_info.commandBufferCount = 1;
2311 submit_info.pCommandBuffers = &command_buffer[0];
2312 submit_info.signalSemaphoreCount = 1;
2313 submit_info.pSignalSemaphores = &semaphore;
2314 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2315 }
2316 {
2317 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2318 VkSubmitInfo submit_info{};
2319 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2320 submit_info.commandBufferCount = 1;
2321 submit_info.pCommandBuffers = &command_buffer[1];
2322 submit_info.waitSemaphoreCount = 1;
2323 submit_info.pWaitSemaphores = &semaphore;
2324 submit_info.pWaitDstStageMask = flags;
2325 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2326 }
2327
2328 vkQueueWaitIdle(m_device->m_queue);
2329
2330 vkDestroyFence(m_device->device(), fence, nullptr);
2331 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2332 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2333 &command_buffer[0]);
2334 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2335
2336 m_errorMonitor->VerifyNotFound();
2337}
2338
2339// This is a positive test. No errors should be generated.
2340TEST_F(VkLayerTest,
2341 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
2342
2343 TEST_DESCRIPTION(
2344 "Two command buffers, each in a separate QueueSubmit call "
2345 "submitted on separate queues, the second having a fence"
2346 "followed by two consecutive WaitForFences calls on the same fence.");
2347
Dustin Graves48458142016-04-29 16:11:55 -06002348 if ((m_device->queue_props.empty()) ||
2349 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002350 return;
2351
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002352 m_errorMonitor->ExpectSuccess();
2353
2354 VkFence fence;
2355 VkFenceCreateInfo fence_create_info{};
2356 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2357 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2358
2359 VkSemaphore semaphore;
2360 VkSemaphoreCreateInfo semaphore_create_info{};
2361 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2362 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2363 &semaphore);
2364
2365 VkCommandPool command_pool;
2366 VkCommandPoolCreateInfo pool_create_info{};
2367 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2368 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2369 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2370 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2371 &command_pool);
2372
2373 VkCommandBuffer command_buffer[2];
2374 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2375 command_buffer_allocate_info.sType =
2376 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2377 command_buffer_allocate_info.commandPool = command_pool;
2378 command_buffer_allocate_info.commandBufferCount = 2;
2379 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2380 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2381 command_buffer);
2382
2383 VkQueue queue = VK_NULL_HANDLE;
2384 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2385 1, &queue);
2386
2387 {
2388 VkCommandBufferBeginInfo begin_info{};
2389 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2390 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2391
2392 vkCmdPipelineBarrier(command_buffer[0],
2393 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2394 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2395 0, nullptr, 0, nullptr);
2396
2397 VkViewport viewport{};
2398 viewport.maxDepth = 1.0f;
2399 viewport.minDepth = 0.0f;
2400 viewport.width = 512;
2401 viewport.height = 512;
2402 viewport.x = 0;
2403 viewport.y = 0;
2404 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2405 vkEndCommandBuffer(command_buffer[0]);
2406 }
2407 {
2408 VkCommandBufferBeginInfo begin_info{};
2409 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2410 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2411
2412 VkViewport viewport{};
2413 viewport.maxDepth = 1.0f;
2414 viewport.minDepth = 0.0f;
2415 viewport.width = 512;
2416 viewport.height = 512;
2417 viewport.x = 0;
2418 viewport.y = 0;
2419 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2420 vkEndCommandBuffer(command_buffer[1]);
2421 }
2422 {
2423 VkSubmitInfo submit_info{};
2424 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2425 submit_info.commandBufferCount = 1;
2426 submit_info.pCommandBuffers = &command_buffer[0];
2427 submit_info.signalSemaphoreCount = 1;
2428 submit_info.pSignalSemaphores = &semaphore;
2429 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2430 }
2431 {
2432 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2433 VkSubmitInfo submit_info{};
2434 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2435 submit_info.commandBufferCount = 1;
2436 submit_info.pCommandBuffers = &command_buffer[1];
2437 submit_info.waitSemaphoreCount = 1;
2438 submit_info.pWaitSemaphores = &semaphore;
2439 submit_info.pWaitDstStageMask = flags;
2440 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2441 }
2442
2443 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2444 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2445
2446 vkDestroyFence(m_device->device(), fence, nullptr);
2447 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2448 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2449 &command_buffer[0]);
2450 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2451
2452 m_errorMonitor->VerifyNotFound();
2453}
2454
2455// This is a positive test. No errors should be generated.
2456TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
2457
2458 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2459 "submitted on separate queues, the second having a fence, "
2460 "followed by a WaitForFences call.");
2461
Dustin Graves48458142016-04-29 16:11:55 -06002462 if ((m_device->queue_props.empty()) ||
2463 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002464 return;
2465
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002466 m_errorMonitor->ExpectSuccess();
2467
2468 VkFence fence;
2469 VkFenceCreateInfo fence_create_info{};
2470 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2471 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2472
2473 VkSemaphore semaphore;
2474 VkSemaphoreCreateInfo semaphore_create_info{};
2475 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2476 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2477 &semaphore);
2478
2479 VkCommandPool command_pool;
2480 VkCommandPoolCreateInfo pool_create_info{};
2481 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2482 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2483 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2484 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2485 &command_pool);
2486
2487 VkCommandBuffer command_buffer[2];
2488 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2489 command_buffer_allocate_info.sType =
2490 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2491 command_buffer_allocate_info.commandPool = command_pool;
2492 command_buffer_allocate_info.commandBufferCount = 2;
2493 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2494 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2495 command_buffer);
2496
2497 VkQueue queue = VK_NULL_HANDLE;
2498 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2499 1, &queue);
2500
2501
2502 {
2503 VkCommandBufferBeginInfo begin_info{};
2504 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2505 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2506
2507 vkCmdPipelineBarrier(command_buffer[0],
2508 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2509 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2510 0, nullptr, 0, nullptr);
2511
2512 VkViewport viewport{};
2513 viewport.maxDepth = 1.0f;
2514 viewport.minDepth = 0.0f;
2515 viewport.width = 512;
2516 viewport.height = 512;
2517 viewport.x = 0;
2518 viewport.y = 0;
2519 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2520 vkEndCommandBuffer(command_buffer[0]);
2521 }
2522 {
2523 VkCommandBufferBeginInfo begin_info{};
2524 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2525 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2526
2527 VkViewport viewport{};
2528 viewport.maxDepth = 1.0f;
2529 viewport.minDepth = 0.0f;
2530 viewport.width = 512;
2531 viewport.height = 512;
2532 viewport.x = 0;
2533 viewport.y = 0;
2534 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2535 vkEndCommandBuffer(command_buffer[1]);
2536 }
2537 {
2538 VkSubmitInfo submit_info{};
2539 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2540 submit_info.commandBufferCount = 1;
2541 submit_info.pCommandBuffers = &command_buffer[0];
2542 submit_info.signalSemaphoreCount = 1;
2543 submit_info.pSignalSemaphores = &semaphore;
2544 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2545 }
2546 {
2547 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2548 VkSubmitInfo submit_info{};
2549 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2550 submit_info.commandBufferCount = 1;
2551 submit_info.pCommandBuffers = &command_buffer[1];
2552 submit_info.waitSemaphoreCount = 1;
2553 submit_info.pWaitSemaphores = &semaphore;
2554 submit_info.pWaitDstStageMask = flags;
2555 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2556 }
2557
2558 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2559
2560 vkDestroyFence(m_device->device(), fence, nullptr);
2561 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2562 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2563 &command_buffer[0]);
2564 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2565
2566 m_errorMonitor->VerifyNotFound();
2567}
2568
2569// This is a positive test. No errors should be generated.
2570TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
2571
2572 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2573 "on the same queue, sharing a signal/wait semaphore, the "
2574 "second having a fence, "
2575 "followed by a WaitForFences call.");
2576
2577 m_errorMonitor->ExpectSuccess();
2578
2579 VkFence fence;
2580 VkFenceCreateInfo fence_create_info{};
2581 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2582 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2583
2584 VkSemaphore semaphore;
2585 VkSemaphoreCreateInfo semaphore_create_info{};
2586 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2587 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2588 &semaphore);
2589
2590 VkCommandPool command_pool;
2591 VkCommandPoolCreateInfo pool_create_info{};
2592 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2593 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2594 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2595 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2596 &command_pool);
2597
2598 VkCommandBuffer command_buffer[2];
2599 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2600 command_buffer_allocate_info.sType =
2601 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2602 command_buffer_allocate_info.commandPool = command_pool;
2603 command_buffer_allocate_info.commandBufferCount = 2;
2604 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2605 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2606 command_buffer);
2607
2608 {
2609 VkCommandBufferBeginInfo begin_info{};
2610 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2611 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2612
2613 vkCmdPipelineBarrier(command_buffer[0],
2614 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2615 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2616 0, nullptr, 0, nullptr);
2617
2618 VkViewport viewport{};
2619 viewport.maxDepth = 1.0f;
2620 viewport.minDepth = 0.0f;
2621 viewport.width = 512;
2622 viewport.height = 512;
2623 viewport.x = 0;
2624 viewport.y = 0;
2625 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2626 vkEndCommandBuffer(command_buffer[0]);
2627 }
2628 {
2629 VkCommandBufferBeginInfo begin_info{};
2630 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2631 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2632
2633 VkViewport viewport{};
2634 viewport.maxDepth = 1.0f;
2635 viewport.minDepth = 0.0f;
2636 viewport.width = 512;
2637 viewport.height = 512;
2638 viewport.x = 0;
2639 viewport.y = 0;
2640 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2641 vkEndCommandBuffer(command_buffer[1]);
2642 }
2643 {
2644 VkSubmitInfo submit_info{};
2645 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2646 submit_info.commandBufferCount = 1;
2647 submit_info.pCommandBuffers = &command_buffer[0];
2648 submit_info.signalSemaphoreCount = 1;
2649 submit_info.pSignalSemaphores = &semaphore;
2650 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2651 }
2652 {
2653 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2654 VkSubmitInfo submit_info{};
2655 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2656 submit_info.commandBufferCount = 1;
2657 submit_info.pCommandBuffers = &command_buffer[1];
2658 submit_info.waitSemaphoreCount = 1;
2659 submit_info.pWaitSemaphores = &semaphore;
2660 submit_info.pWaitDstStageMask = flags;
2661 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2662 }
2663
2664 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2665
2666 vkDestroyFence(m_device->device(), fence, nullptr);
2667 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2668 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2669 &command_buffer[0]);
2670 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2671
2672 m_errorMonitor->VerifyNotFound();
2673}
2674
2675// This is a positive test. No errors should be generated.
2676TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
2677
2678 TEST_DESCRIPTION(
2679 "Two command buffers, each in a separate QueueSubmit call "
2680 "on the same queue, no fences, followed by a third QueueSubmit with NO "
2681 "SubmitInfos but with a fence, followed by a WaitForFences call.");
2682
2683 m_errorMonitor->ExpectSuccess();
2684
2685 VkFence fence;
2686 VkFenceCreateInfo fence_create_info{};
2687 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2688 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2689
2690 VkCommandPool command_pool;
2691 VkCommandPoolCreateInfo pool_create_info{};
2692 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2693 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2694 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2695 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2696 &command_pool);
2697
2698 VkCommandBuffer command_buffer[2];
2699 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2700 command_buffer_allocate_info.sType =
2701 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2702 command_buffer_allocate_info.commandPool = command_pool;
2703 command_buffer_allocate_info.commandBufferCount = 2;
2704 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2705 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2706 command_buffer);
2707
2708 {
2709 VkCommandBufferBeginInfo begin_info{};
2710 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2711 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2712
2713 vkCmdPipelineBarrier(command_buffer[0],
2714 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2715 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2716 0, nullptr, 0, nullptr);
2717
2718 VkViewport viewport{};
2719 viewport.maxDepth = 1.0f;
2720 viewport.minDepth = 0.0f;
2721 viewport.width = 512;
2722 viewport.height = 512;
2723 viewport.x = 0;
2724 viewport.y = 0;
2725 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2726 vkEndCommandBuffer(command_buffer[0]);
2727 }
2728 {
2729 VkCommandBufferBeginInfo begin_info{};
2730 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2731 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2732
2733 VkViewport viewport{};
2734 viewport.maxDepth = 1.0f;
2735 viewport.minDepth = 0.0f;
2736 viewport.width = 512;
2737 viewport.height = 512;
2738 viewport.x = 0;
2739 viewport.y = 0;
2740 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2741 vkEndCommandBuffer(command_buffer[1]);
2742 }
2743 {
2744 VkSubmitInfo submit_info{};
2745 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2746 submit_info.commandBufferCount = 1;
2747 submit_info.pCommandBuffers = &command_buffer[0];
2748 submit_info.signalSemaphoreCount = 0;
2749 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2750 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2751 }
2752 {
2753 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2754 VkSubmitInfo submit_info{};
2755 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2756 submit_info.commandBufferCount = 1;
2757 submit_info.pCommandBuffers = &command_buffer[1];
2758 submit_info.waitSemaphoreCount = 0;
2759 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2760 submit_info.pWaitDstStageMask = flags;
2761 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2762 }
2763
2764 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
2765
2766 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2767
2768 vkDestroyFence(m_device->device(), fence, nullptr);
2769 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2770 &command_buffer[0]);
2771 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2772
2773 m_errorMonitor->VerifyNotFound();
2774}
2775
2776// This is a positive test. No errors should be generated.
2777TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
2778
2779 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2780 "on the same queue, the second having a fence, followed "
2781 "by a WaitForFences call.");
2782
2783 m_errorMonitor->ExpectSuccess();
2784
2785 VkFence fence;
2786 VkFenceCreateInfo fence_create_info{};
2787 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2788 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2789
2790 VkCommandPool command_pool;
2791 VkCommandPoolCreateInfo pool_create_info{};
2792 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2793 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2794 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2795 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2796 &command_pool);
2797
2798 VkCommandBuffer command_buffer[2];
2799 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2800 command_buffer_allocate_info.sType =
2801 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2802 command_buffer_allocate_info.commandPool = command_pool;
2803 command_buffer_allocate_info.commandBufferCount = 2;
2804 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2805 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2806 command_buffer);
2807
2808 {
2809 VkCommandBufferBeginInfo begin_info{};
2810 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2811 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2812
2813 vkCmdPipelineBarrier(command_buffer[0],
2814 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2815 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2816 0, nullptr, 0, nullptr);
2817
2818 VkViewport viewport{};
2819 viewport.maxDepth = 1.0f;
2820 viewport.minDepth = 0.0f;
2821 viewport.width = 512;
2822 viewport.height = 512;
2823 viewport.x = 0;
2824 viewport.y = 0;
2825 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2826 vkEndCommandBuffer(command_buffer[0]);
2827 }
2828 {
2829 VkCommandBufferBeginInfo begin_info{};
2830 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2831 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2832
2833 VkViewport viewport{};
2834 viewport.maxDepth = 1.0f;
2835 viewport.minDepth = 0.0f;
2836 viewport.width = 512;
2837 viewport.height = 512;
2838 viewport.x = 0;
2839 viewport.y = 0;
2840 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2841 vkEndCommandBuffer(command_buffer[1]);
2842 }
2843 {
2844 VkSubmitInfo submit_info{};
2845 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2846 submit_info.commandBufferCount = 1;
2847 submit_info.pCommandBuffers = &command_buffer[0];
2848 submit_info.signalSemaphoreCount = 0;
2849 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2850 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2851 }
2852 {
2853 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2854 VkSubmitInfo submit_info{};
2855 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2856 submit_info.commandBufferCount = 1;
2857 submit_info.pCommandBuffers = &command_buffer[1];
2858 submit_info.waitSemaphoreCount = 0;
2859 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2860 submit_info.pWaitDstStageMask = flags;
2861 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2862 }
2863
2864 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2865
2866 vkDestroyFence(m_device->device(), fence, nullptr);
2867 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2868 &command_buffer[0]);
2869 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2870
2871 m_errorMonitor->VerifyNotFound();
2872}
2873
2874// This is a positive test. No errors should be generated.
2875TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
2876
2877 TEST_DESCRIPTION(
2878 "Two command buffers each in a separate SubmitInfo sent in a single "
2879 "QueueSubmit call followed by a WaitForFences call.");
2880
2881 m_errorMonitor->ExpectSuccess();
2882
2883 VkFence fence;
2884 VkFenceCreateInfo fence_create_info{};
2885 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2886 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2887
2888 VkSemaphore semaphore;
2889 VkSemaphoreCreateInfo semaphore_create_info{};
2890 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2891 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2892 &semaphore);
2893
2894 VkCommandPool command_pool;
2895 VkCommandPoolCreateInfo pool_create_info{};
2896 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2897 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2898 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2899 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2900 &command_pool);
2901
2902 VkCommandBuffer command_buffer[2];
2903 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2904 command_buffer_allocate_info.sType =
2905 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2906 command_buffer_allocate_info.commandPool = command_pool;
2907 command_buffer_allocate_info.commandBufferCount = 2;
2908 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2909 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2910 command_buffer);
2911
2912 {
2913 VkCommandBufferBeginInfo begin_info{};
2914 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2915 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2916
2917 vkCmdPipelineBarrier(command_buffer[0],
2918 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2919 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2920 0, nullptr, 0, nullptr);
2921
2922 VkViewport viewport{};
2923 viewport.maxDepth = 1.0f;
2924 viewport.minDepth = 0.0f;
2925 viewport.width = 512;
2926 viewport.height = 512;
2927 viewport.x = 0;
2928 viewport.y = 0;
2929 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2930 vkEndCommandBuffer(command_buffer[0]);
2931 }
2932 {
2933 VkCommandBufferBeginInfo begin_info{};
2934 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2935 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2936
2937 VkViewport viewport{};
2938 viewport.maxDepth = 1.0f;
2939 viewport.minDepth = 0.0f;
2940 viewport.width = 512;
2941 viewport.height = 512;
2942 viewport.x = 0;
2943 viewport.y = 0;
2944 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2945 vkEndCommandBuffer(command_buffer[1]);
2946 }
2947 {
2948 VkSubmitInfo submit_info[2];
2949 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2950
2951 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2952 submit_info[0].pNext = NULL;
2953 submit_info[0].commandBufferCount = 1;
2954 submit_info[0].pCommandBuffers = &command_buffer[0];
2955 submit_info[0].signalSemaphoreCount = 1;
2956 submit_info[0].pSignalSemaphores = &semaphore;
2957 submit_info[0].waitSemaphoreCount = 0;
2958 submit_info[0].pWaitSemaphores = NULL;
2959 submit_info[0].pWaitDstStageMask = 0;
2960
2961 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2962 submit_info[1].pNext = NULL;
2963 submit_info[1].commandBufferCount = 1;
2964 submit_info[1].pCommandBuffers = &command_buffer[1];
2965 submit_info[1].waitSemaphoreCount = 1;
2966 submit_info[1].pWaitSemaphores = &semaphore;
2967 submit_info[1].pWaitDstStageMask = flags;
2968 submit_info[1].signalSemaphoreCount = 0;
2969 submit_info[1].pSignalSemaphores = NULL;
2970 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
2971 }
2972
2973 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2974
2975 vkDestroyFence(m_device->device(), fence, nullptr);
2976 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2977 &command_buffer[0]);
2978 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2979
2980 m_errorMonitor->VerifyNotFound();
2981}
2982
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002983TEST_F(VkLayerTest, DynamicStatesNotBound) {
2984 TEST_DESCRIPTION(
2985 "Run a series of simple draw calls to validate all the different "
2986 "failure cases that can occur when dynamic state is required but not "
2987 "correctly bound."
2988 "Here are the different dynamic state cases verified by this test:\n"
2989 "-Line Width\n-Depth Bias\n-Viewport State\n-Scissor State\n-Blend "
2990 "State\n-Depth Bounds\n-Stencil Read Mask\n-Stencil Write "
2991 "Mask\n-Stencil Reference");
2992
2993 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07002994 m_errorMonitor->SetDesiredFailureMsg(
2995 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002996 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002997 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2998 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002999 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003000 // Dynamic depth bias
Karl Schultz6addd812016-02-02 17:17:23 -07003001 m_errorMonitor->SetDesiredFailureMsg(
3002 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003003 "Dynamic depth bias state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003004 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3005 BsoFailDepthBias);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003006 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003007 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07003008 m_errorMonitor->SetDesiredFailureMsg(
3009 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003010 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003011 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3012 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003013 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003014 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07003015 m_errorMonitor->SetDesiredFailureMsg(
3016 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003017 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003018 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3019 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003020 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003021 // Dynamic blend state
Karl Schultz6addd812016-02-02 17:17:23 -07003022 m_errorMonitor->SetDesiredFailureMsg(
3023 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003024 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003025 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3026 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003027 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003028 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07003029 m_errorMonitor->SetDesiredFailureMsg(
3030 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003031 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003032 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3033 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003034 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003035 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07003036 m_errorMonitor->SetDesiredFailureMsg(
3037 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003038 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003039 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3040 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003041 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003042 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07003043 m_errorMonitor->SetDesiredFailureMsg(
3044 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003045 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003046 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3047 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003048 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06003049}
3050
Karl Schultz6addd812016-02-02 17:17:23 -07003051TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003052 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003053
Karl Schultz6addd812016-02-02 17:17:23 -07003054 m_errorMonitor->SetDesiredFailureMsg(
3055 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3056 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
3057 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003058
3059 VkFenceCreateInfo fenceInfo = {};
3060 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3061 fenceInfo.pNext = NULL;
3062 fenceInfo.flags = 0;
3063
3064 ASSERT_NO_FATAL_FAILURE(InitState());
3065 ASSERT_NO_FATAL_FAILURE(InitViewport());
3066 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3067
Karl Schultz6addd812016-02-02 17:17:23 -07003068 // We luck out b/c by default the framework creates CB w/ the
3069 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003070 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003071 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
3072 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003073 EndCommandBuffer();
3074
3075 testFence.init(*m_device, fenceInfo);
3076
3077 // Bypass framework since it does the waits automatically
3078 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003079 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003080 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3081 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003082 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003083 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003084 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003085 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003086 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003087 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003088 submit_info.pSignalSemaphores = NULL;
3089
Karl Schultz6addd812016-02-02 17:17:23 -07003090 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
3091 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003092
Karl Schultz6addd812016-02-02 17:17:23 -07003093 // Cause validation error by re-submitting cmd buffer that should only be
3094 // submitted once
3095 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003096
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003097 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003098}
3099
Karl Schultz6addd812016-02-02 17:17:23 -07003100TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003101 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07003102 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003103
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003105 "Unable to allocate 1 descriptors of "
3106 "type "
3107 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003108
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003109 ASSERT_NO_FATAL_FAILURE(InitState());
3110 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003111
Karl Schultz6addd812016-02-02 17:17:23 -07003112 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
3113 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003114 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003115 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3116 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003117
3118 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003119 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3120 ds_pool_ci.pNext = NULL;
3121 ds_pool_ci.flags = 0;
3122 ds_pool_ci.maxSets = 1;
3123 ds_pool_ci.poolSizeCount = 1;
3124 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003125
3126 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003127 err =
3128 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003129 ASSERT_VK_SUCCESS(err);
3130
3131 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003132 dsl_binding.binding = 0;
3133 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3134 dsl_binding.descriptorCount = 1;
3135 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3136 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003137
3138 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003139 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3140 ds_layout_ci.pNext = NULL;
3141 ds_layout_ci.bindingCount = 1;
3142 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003143
3144 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003145 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3146 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003147 ASSERT_VK_SUCCESS(err);
3148
3149 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003150 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003151 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003152 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003153 alloc_info.descriptorPool = ds_pool;
3154 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003155 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3156 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003157
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003158 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003159
Chia-I Wuf7458c52015-10-26 21:10:41 +08003160 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3161 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003162}
3163
Karl Schultz6addd812016-02-02 17:17:23 -07003164TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
3165 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06003166
Karl Schultz6addd812016-02-02 17:17:23 -07003167 m_errorMonitor->SetDesiredFailureMsg(
3168 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3169 "It is invalid to call vkFreeDescriptorSets() with a pool created "
3170 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003171
Tobin Ehlise735c692015-10-08 13:13:50 -06003172 ASSERT_NO_FATAL_FAILURE(InitState());
3173 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06003174
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003175 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003176 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3177 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06003178
3179 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003180 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3181 ds_pool_ci.pNext = NULL;
3182 ds_pool_ci.maxSets = 1;
3183 ds_pool_ci.poolSizeCount = 1;
3184 ds_pool_ci.flags = 0;
3185 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
3186 // app can only call vkResetDescriptorPool on this pool.;
3187 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06003188
3189 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003190 err =
3191 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06003192 ASSERT_VK_SUCCESS(err);
3193
3194 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003195 dsl_binding.binding = 0;
3196 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3197 dsl_binding.descriptorCount = 1;
3198 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3199 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06003200
3201 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003202 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3203 ds_layout_ci.pNext = NULL;
3204 ds_layout_ci.bindingCount = 1;
3205 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06003206
3207 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003208 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3209 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06003210 ASSERT_VK_SUCCESS(err);
3211
3212 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003213 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003214 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003215 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003216 alloc_info.descriptorPool = ds_pool;
3217 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003218 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3219 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06003220 ASSERT_VK_SUCCESS(err);
3221
3222 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003223 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06003224
Chia-I Wuf7458c52015-10-26 21:10:41 +08003225 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3226 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06003227}
3228
Karl Schultz6addd812016-02-02 17:17:23 -07003229TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003230 // Attempt to clear Descriptor Pool with bad object.
3231 // ObjectTracker should catch this.
3232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3233 "Invalid VkDescriptorPool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003234 uint64_t fake_pool_handle = 0xbaad6001;
3235 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
3236 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06003237 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003238}
3239
Karl Schultz6addd812016-02-02 17:17:23 -07003240TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003241 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
3242 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003243 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06003244 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003245
3246 uint64_t fake_set_handle = 0xbaad6001;
3247 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003248 VkResult err;
3249 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3250 "Invalid VkDescriptorSet Object 0xbaad6001");
3251
3252 ASSERT_NO_FATAL_FAILURE(InitState());
3253
3254 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
3255 layout_bindings[0].binding = 0;
3256 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3257 layout_bindings[0].descriptorCount = 1;
3258 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3259 layout_bindings[0].pImmutableSamplers = NULL;
3260
3261 VkDescriptorSetLayout descriptor_set_layout;
3262 VkDescriptorSetLayoutCreateInfo dslci = {};
3263 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3264 dslci.pNext = NULL;
3265 dslci.bindingCount = 1;
3266 dslci.pBindings = layout_bindings;
3267 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003268 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003269
3270 VkPipelineLayout pipeline_layout;
3271 VkPipelineLayoutCreateInfo plci = {};
3272 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3273 plci.pNext = NULL;
3274 plci.setLayoutCount = 1;
3275 plci.pSetLayouts = &descriptor_set_layout;
3276 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003277 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003278
3279 BeginCommandBuffer();
3280 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003281 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06003282 m_errorMonitor->VerifyFound();
3283 EndCommandBuffer();
3284 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
3285 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003286}
3287
Karl Schultz6addd812016-02-02 17:17:23 -07003288TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003289 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
3290 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003291 uint64_t fake_layout_handle = 0xbaad6001;
3292 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3294 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
3295
3296 VkPipelineLayout pipeline_layout;
3297 VkPipelineLayoutCreateInfo plci = {};
3298 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3299 plci.pNext = NULL;
3300 plci.setLayoutCount = 1;
3301 plci.pSetLayouts = &bad_layout;
3302 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
3303
3304 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003305}
3306
Karl Schultz6addd812016-02-02 17:17:23 -07003307TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003308 // Attempt to bind an invalid Pipeline to a valid Command Buffer
3309 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003310 // Create a valid cmd buffer
3311 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003312 uint64_t fake_pipeline_handle = 0xbaad6001;
3313 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3315 "Invalid VkPipeline Object 0xbaad6001");
3316 ASSERT_NO_FATAL_FAILURE(InitState());
3317 BeginCommandBuffer();
3318 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3319 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
3320 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06003321
3322 // Now issue a draw call with no pipeline bound
3323 m_errorMonitor->SetDesiredFailureMsg(
3324 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3325 "At Draw/Dispatch time no valid VkPipeline is bound!");
3326 ASSERT_NO_FATAL_FAILURE(InitState());
3327 BeginCommandBuffer();
3328 Draw(1, 0, 0, 0);
3329 m_errorMonitor->VerifyFound();
3330 // Finally same check once more but with Dispatch/Compute
3331 m_errorMonitor->SetDesiredFailureMsg(
3332 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3333 "At Draw/Dispatch time no valid VkPipeline is bound!");
3334 ASSERT_NO_FATAL_FAILURE(InitState());
3335 BeginCommandBuffer();
3336 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
3337 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003338}
3339
Karl Schultz6addd812016-02-02 17:17:23 -07003340TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
3341 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
3342 // CommandBuffer
3343 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003344
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003346 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003347
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003348 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06003349 ASSERT_NO_FATAL_FAILURE(InitViewport());
3350 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003351 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003352 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3353 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003354
3355 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003356 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3357 ds_pool_ci.pNext = NULL;
3358 ds_pool_ci.maxSets = 1;
3359 ds_pool_ci.poolSizeCount = 1;
3360 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06003361
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003362 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003363 err =
3364 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003365 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003366
Tony Barboureb254902015-07-15 12:50:33 -06003367 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003368 dsl_binding.binding = 0;
3369 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3370 dsl_binding.descriptorCount = 1;
3371 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3372 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003373
Tony Barboureb254902015-07-15 12:50:33 -06003374 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003375 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3376 ds_layout_ci.pNext = NULL;
3377 ds_layout_ci.bindingCount = 1;
3378 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003379 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003380 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3381 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003382 ASSERT_VK_SUCCESS(err);
3383
3384 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003385 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003386 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003387 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003388 alloc_info.descriptorPool = ds_pool;
3389 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003390 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3391 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003392 ASSERT_VK_SUCCESS(err);
3393
Tony Barboureb254902015-07-15 12:50:33 -06003394 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003395 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3396 pipeline_layout_ci.pNext = NULL;
3397 pipeline_layout_ci.setLayoutCount = 1;
3398 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003399
3400 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003401 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3402 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003403 ASSERT_VK_SUCCESS(err);
3404
Karl Schultz6addd812016-02-02 17:17:23 -07003405 VkShaderObj vs(m_device, bindStateVertShaderText,
3406 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06003407 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07003408 // on more devices
3409 VkShaderObj fs(m_device, bindStateFragShaderText,
3410 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003411
Tony Barbourc95e4ac2015-08-04 17:05:26 -06003412 VkPipelineObj pipe(m_device);
3413 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06003414 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06003415 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06003416 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06003417
3418 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003419 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3420 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3421 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3422 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3423 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003424
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003425 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003426
Chia-I Wuf7458c52015-10-26 21:10:41 +08003427 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3428 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3429 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003430}
3431
Karl Schultz6addd812016-02-02 17:17:23 -07003432TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003433 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07003434 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003435
Karl Schultz6addd812016-02-02 17:17:23 -07003436 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003437 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
3438 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003439
3440 ASSERT_NO_FATAL_FAILURE(InitState());
3441 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003442 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3443 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003444
3445 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003446 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3447 ds_pool_ci.pNext = NULL;
3448 ds_pool_ci.maxSets = 1;
3449 ds_pool_ci.poolSizeCount = 1;
3450 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003451
3452 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003453 err =
3454 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003455 ASSERT_VK_SUCCESS(err);
3456
3457 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003458 dsl_binding.binding = 0;
3459 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3460 dsl_binding.descriptorCount = 1;
3461 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3462 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003463
3464 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003465 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3466 ds_layout_ci.pNext = NULL;
3467 ds_layout_ci.bindingCount = 1;
3468 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003469 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003470 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3471 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003472 ASSERT_VK_SUCCESS(err);
3473
3474 VkDescriptorSet descriptorSet;
3475 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003476 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003477 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003478 alloc_info.descriptorPool = ds_pool;
3479 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003480 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3481 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003482 ASSERT_VK_SUCCESS(err);
3483
Karl Schultz6addd812016-02-02 17:17:23 -07003484 VkBufferView view =
3485 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003486 VkWriteDescriptorSet descriptor_write;
3487 memset(&descriptor_write, 0, sizeof(descriptor_write));
3488 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3489 descriptor_write.dstSet = descriptorSet;
3490 descriptor_write.dstBinding = 0;
3491 descriptor_write.descriptorCount = 1;
3492 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3493 descriptor_write.pTexelBufferView = &view;
3494
3495 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3496
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003497 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003498
3499 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3500 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3501}
3502
Karl Schultz6addd812016-02-02 17:17:23 -07003503TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
3504 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
3505 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07003506 // 1. No dynamicOffset supplied
3507 // 2. Too many dynamicOffsets supplied
3508 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07003509 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003511 " requires 1 dynamicOffsets, but only "
3512 "0 dynamicOffsets are left in "
3513 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003514
3515 ASSERT_NO_FATAL_FAILURE(InitState());
3516 ASSERT_NO_FATAL_FAILURE(InitViewport());
3517 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3518
3519 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003520 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3521 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003522
3523 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003524 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3525 ds_pool_ci.pNext = NULL;
3526 ds_pool_ci.maxSets = 1;
3527 ds_pool_ci.poolSizeCount = 1;
3528 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003529
3530 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003531 err =
3532 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003533 ASSERT_VK_SUCCESS(err);
3534
3535 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003536 dsl_binding.binding = 0;
3537 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3538 dsl_binding.descriptorCount = 1;
3539 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3540 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003541
3542 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003543 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3544 ds_layout_ci.pNext = NULL;
3545 ds_layout_ci.bindingCount = 1;
3546 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003547 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003548 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3549 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003550 ASSERT_VK_SUCCESS(err);
3551
3552 VkDescriptorSet descriptorSet;
3553 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003554 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003555 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003556 alloc_info.descriptorPool = ds_pool;
3557 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003558 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3559 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003560 ASSERT_VK_SUCCESS(err);
3561
3562 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003563 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3564 pipeline_layout_ci.pNext = NULL;
3565 pipeline_layout_ci.setLayoutCount = 1;
3566 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003567
3568 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003569 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3570 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003571 ASSERT_VK_SUCCESS(err);
3572
3573 // Create a buffer to update the descriptor with
3574 uint32_t qfi = 0;
3575 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003576 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3577 buffCI.size = 1024;
3578 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3579 buffCI.queueFamilyIndexCount = 1;
3580 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003581
3582 VkBuffer dyub;
3583 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3584 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003585 // Allocate memory and bind to buffer so we can make it to the appropriate
3586 // error
3587 VkMemoryAllocateInfo mem_alloc = {};
3588 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3589 mem_alloc.pNext = NULL;
3590 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12003591 mem_alloc.memoryTypeIndex = 0;
3592
3593 VkMemoryRequirements memReqs;
3594 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
3595 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
3596 0);
3597 if (!pass) {
3598 vkDestroyBuffer(m_device->device(), dyub, NULL);
3599 return;
3600 }
3601
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003602 VkDeviceMemory mem;
3603 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3604 ASSERT_VK_SUCCESS(err);
3605 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
3606 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003607 // Correctly update descriptor to avoid "NOT_UPDATED" error
3608 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003609 buffInfo.buffer = dyub;
3610 buffInfo.offset = 0;
3611 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003612
3613 VkWriteDescriptorSet descriptor_write;
3614 memset(&descriptor_write, 0, sizeof(descriptor_write));
3615 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3616 descriptor_write.dstSet = descriptorSet;
3617 descriptor_write.dstBinding = 0;
3618 descriptor_write.descriptorCount = 1;
3619 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3620 descriptor_write.pBufferInfo = &buffInfo;
3621
3622 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3623
3624 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003625 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3626 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3627 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003628 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003629 uint32_t pDynOff[2] = {512, 756};
3630 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07003631 m_errorMonitor->SetDesiredFailureMsg(
3632 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07003633 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07003634 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3635 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3636 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12003637 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003638 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003639 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3640 " dynamic offset 512 combined with "
3641 "offset 0 and range 1024 that "
3642 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07003643 // Create PSO to be used for draw-time errors below
3644 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003645 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003646 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003647 "out gl_PerVertex { \n"
3648 " vec4 gl_Position;\n"
3649 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003650 "void main(){\n"
3651 " gl_Position = vec4(1);\n"
3652 "}\n";
3653 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003654 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003655 "\n"
3656 "layout(location=0) out vec4 x;\n"
3657 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3658 "void main(){\n"
3659 " x = vec4(bar.y);\n"
3660 "}\n";
3661 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3662 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3663 VkPipelineObj pipe(m_device);
3664 pipe.AddShader(&vs);
3665 pipe.AddShader(&fs);
3666 pipe.AddColorAttachment();
3667 pipe.CreateVKPipeline(pipeline_layout, renderPass());
3668
Karl Schultz6addd812016-02-02 17:17:23 -07003669 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3670 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3671 // This update should succeed, but offset size of 512 will overstep buffer
3672 // /w range 1024 & size 1024
3673 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3674 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3675 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07003676 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003677 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003678
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003679 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06003680 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003681
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003682 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3683 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3684}
3685
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003686TEST_F(VkLayerTest, InvalidPushConstants) {
3687 // Hit push constant error cases:
3688 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
3689 // 2. Incorrectly set push constant size to 0
3690 // 3. Incorrectly set push constant size to non-multiple of 4
3691 // 4. Attempt push constant update that exceeds maxPushConstantSize
3692 VkResult err;
3693 m_errorMonitor->SetDesiredFailureMsg(
3694 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3695 "vkCreatePipelineLayout() call has push constants with offset ");
3696
3697 ASSERT_NO_FATAL_FAILURE(InitState());
3698 ASSERT_NO_FATAL_FAILURE(InitViewport());
3699 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3700
3701 VkPushConstantRange pc_range = {};
3702 pc_range.size = 0xFFFFFFFFu;
3703 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3704 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3705 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3706 pipeline_layout_ci.pushConstantRangeCount = 1;
3707 pipeline_layout_ci.pPushConstantRanges = &pc_range;
3708
3709 VkPipelineLayout pipeline_layout;
3710 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3711 &pipeline_layout);
3712
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003713 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003714 // Now cause errors due to size 0 and non-4 byte aligned size
3715 pc_range.size = 0;
3716 m_errorMonitor->SetDesiredFailureMsg(
3717 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3718 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
3719 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3720 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003721 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003722 pc_range.size = 1;
3723 m_errorMonitor->SetDesiredFailureMsg(
3724 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3725 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
3726 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3727 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003728 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003729 // Cause error due to bad size in vkCmdPushConstants() call
3730 m_errorMonitor->SetDesiredFailureMsg(
3731 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3732 "vkCmdPushConstants() call has push constants with offset ");
3733 pipeline_layout_ci.pushConstantRangeCount = 0;
3734 pipeline_layout_ci.pPushConstantRanges = NULL;
3735 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3736 &pipeline_layout);
3737 ASSERT_VK_SUCCESS(err);
3738 BeginCommandBuffer();
3739 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
3740 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003741 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003742 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3743}
3744
Karl Schultz6addd812016-02-02 17:17:23 -07003745TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003746 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07003747 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003748
3749 ASSERT_NO_FATAL_FAILURE(InitState());
3750 ASSERT_NO_FATAL_FAILURE(InitViewport());
3751 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3752
3753 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
3754 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003755 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3756 ds_type_count[0].descriptorCount = 10;
3757 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3758 ds_type_count[1].descriptorCount = 2;
3759 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3760 ds_type_count[2].descriptorCount = 2;
3761 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
3762 ds_type_count[3].descriptorCount = 5;
3763 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
3764 // type
3765 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3766 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
3767 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003768
3769 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003770 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3771 ds_pool_ci.pNext = NULL;
3772 ds_pool_ci.maxSets = 5;
3773 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
3774 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003775
3776 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003777 err =
3778 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003779 ASSERT_VK_SUCCESS(err);
3780
3781 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
3782 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003783 dsl_binding[0].binding = 0;
3784 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3785 dsl_binding[0].descriptorCount = 5;
3786 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3787 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003788
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003789 // Create layout identical to set0 layout but w/ different stageFlags
3790 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003791 dsl_fs_stage_only.binding = 0;
3792 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3793 dsl_fs_stage_only.descriptorCount = 5;
3794 dsl_fs_stage_only.stageFlags =
3795 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
3796 // bind time
3797 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003798 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003799 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3800 ds_layout_ci.pNext = NULL;
3801 ds_layout_ci.bindingCount = 1;
3802 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003803 static const uint32_t NUM_LAYOUTS = 4;
3804 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003805 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003806 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
3807 // layout for error case
3808 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3809 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003810 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003811 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003812 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3813 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003814 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003815 dsl_binding[0].binding = 0;
3816 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003817 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003818 dsl_binding[1].binding = 1;
3819 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3820 dsl_binding[1].descriptorCount = 2;
3821 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
3822 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003823 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003824 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003825 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3826 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003827 ASSERT_VK_SUCCESS(err);
3828 dsl_binding[0].binding = 0;
3829 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003830 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003831 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07003832 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3833 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003834 ASSERT_VK_SUCCESS(err);
3835 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003836 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003837 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3838 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003839 ASSERT_VK_SUCCESS(err);
3840
3841 static const uint32_t NUM_SETS = 4;
3842 VkDescriptorSet descriptorSet[NUM_SETS] = {};
3843 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003844 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003845 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003846 alloc_info.descriptorPool = ds_pool;
3847 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003848 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3849 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003850 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003851 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003852 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003853 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003854 err =
3855 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003856 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003857
3858 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003859 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3860 pipeline_layout_ci.pNext = NULL;
3861 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
3862 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003863
3864 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003865 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3866 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003867 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003868 // Create pipelineLayout with only one setLayout
3869 pipeline_layout_ci.setLayoutCount = 1;
3870 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003871 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3872 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003873 ASSERT_VK_SUCCESS(err);
3874 // Create pipelineLayout with 2 descriptor setLayout at index 0
3875 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
3876 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07003877 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3878 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003879 ASSERT_VK_SUCCESS(err);
3880 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
3881 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
3882 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07003883 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3884 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003885 ASSERT_VK_SUCCESS(err);
3886 // Create pipelineLayout with UB type, but stageFlags for FS only
3887 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
3888 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003889 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3890 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003891 ASSERT_VK_SUCCESS(err);
3892 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
3893 VkDescriptorSetLayout pl_bad_s0[2] = {};
3894 pl_bad_s0[0] = ds_layout_fs_only;
3895 pl_bad_s0[1] = ds_layout[1];
3896 pipeline_layout_ci.setLayoutCount = 2;
3897 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
3898 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07003899 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3900 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003901 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003902
3903 // Create a buffer to update the descriptor with
3904 uint32_t qfi = 0;
3905 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003906 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3907 buffCI.size = 1024;
3908 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3909 buffCI.queueFamilyIndexCount = 1;
3910 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003911
3912 VkBuffer dyub;
3913 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3914 ASSERT_VK_SUCCESS(err);
3915 // Correctly update descriptor to avoid "NOT_UPDATED" error
3916 static const uint32_t NUM_BUFFS = 5;
3917 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003918 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003919 buffInfo[i].buffer = dyub;
3920 buffInfo[i].offset = 0;
3921 buffInfo[i].range = 1024;
3922 }
Karl Schultz6addd812016-02-02 17:17:23 -07003923 VkImage image;
3924 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3925 const int32_t tex_width = 32;
3926 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003927 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003928 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3929 image_create_info.pNext = NULL;
3930 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3931 image_create_info.format = tex_format;
3932 image_create_info.extent.width = tex_width;
3933 image_create_info.extent.height = tex_height;
3934 image_create_info.extent.depth = 1;
3935 image_create_info.mipLevels = 1;
3936 image_create_info.arrayLayers = 1;
3937 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3938 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3939 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3940 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003941 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3942 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003943
Karl Schultz6addd812016-02-02 17:17:23 -07003944 VkMemoryRequirements memReqs;
3945 VkDeviceMemory imageMem;
3946 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003947 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003948 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3949 memAlloc.pNext = NULL;
3950 memAlloc.allocationSize = 0;
3951 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003952 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
3953 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003954 pass =
3955 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003956 ASSERT_TRUE(pass);
3957 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
3958 ASSERT_VK_SUCCESS(err);
3959 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
3960 ASSERT_VK_SUCCESS(err);
3961
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003962 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003963 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3964 image_view_create_info.image = image;
3965 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
3966 image_view_create_info.format = tex_format;
3967 image_view_create_info.subresourceRange.layerCount = 1;
3968 image_view_create_info.subresourceRange.baseMipLevel = 0;
3969 image_view_create_info.subresourceRange.levelCount = 1;
3970 image_view_create_info.subresourceRange.aspectMask =
3971 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003972
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003973 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07003974 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
3975 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003976 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003977 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003978 imageInfo[0].imageView = view;
3979 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3980 imageInfo[1].imageView = view;
3981 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003982 imageInfo[2].imageView = view;
3983 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3984 imageInfo[3].imageView = view;
3985 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003986
3987 static const uint32_t NUM_SET_UPDATES = 3;
3988 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
3989 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3990 descriptor_write[0].dstSet = descriptorSet[0];
3991 descriptor_write[0].dstBinding = 0;
3992 descriptor_write[0].descriptorCount = 5;
3993 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3994 descriptor_write[0].pBufferInfo = buffInfo;
3995 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3996 descriptor_write[1].dstSet = descriptorSet[1];
3997 descriptor_write[1].dstBinding = 0;
3998 descriptor_write[1].descriptorCount = 2;
3999 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
4000 descriptor_write[1].pImageInfo = imageInfo;
4001 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4002 descriptor_write[2].dstSet = descriptorSet[1];
4003 descriptor_write[2].dstBinding = 1;
4004 descriptor_write[2].descriptorCount = 2;
4005 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004006 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004007
4008 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004009
Tobin Ehlis88452832015-12-03 09:40:56 -07004010 // Create PSO to be used for draw-time errors below
4011 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004012 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004013 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07004014 "out gl_PerVertex {\n"
4015 " vec4 gl_Position;\n"
4016 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004017 "void main(){\n"
4018 " gl_Position = vec4(1);\n"
4019 "}\n";
4020 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004021 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004022 "\n"
4023 "layout(location=0) out vec4 x;\n"
4024 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
4025 "void main(){\n"
4026 " x = vec4(bar.y);\n"
4027 "}\n";
4028 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4029 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004030 VkPipelineObj pipe(m_device);
4031 pipe.AddShader(&vs);
4032 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07004033 pipe.AddColorAttachment();
4034 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07004035
4036 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07004037
Karl Schultz6addd812016-02-02 17:17:23 -07004038 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4039 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4040 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
4041 // of PSO
4042 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
4043 // cmd_pipeline.c
4044 // due to the fact that cmd_alloc_dset_data() has not been called in
4045 // cmd_bind_graphics_pipeline()
4046 // TODO : Want to cause various binding incompatibility issues here to test
4047 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07004048 // First cause various verify_layout_compatibility() fails
4049 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004050 // verify_set_layout_compatibility fail cases:
4051 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07004052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4053 " due to: invalid VkPipelineLayout ");
4054 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4055 VK_PIPELINE_BIND_POINT_GRAPHICS,
4056 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
4057 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004058 m_errorMonitor->VerifyFound();
4059
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004060 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07004061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4062 " attempting to bind set to index 1");
4063 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4064 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
4065 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004066 m_errorMonitor->VerifyFound();
4067
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004068 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004069 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
4070 // descriptors
4071 m_errorMonitor->SetDesiredFailureMsg(
4072 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06004073 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07004074 vkCmdBindDescriptorSets(
4075 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4076 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004077 m_errorMonitor->VerifyFound();
4078
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004079 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
4080 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07004081 m_errorMonitor->SetDesiredFailureMsg(
4082 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06004083 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07004084 vkCmdBindDescriptorSets(
4085 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4086 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004087 m_errorMonitor->VerifyFound();
4088
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004089 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
4090 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07004091 m_errorMonitor->SetDesiredFailureMsg(
4092 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06004093 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07004094 vkCmdBindDescriptorSets(
4095 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4096 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004097 m_errorMonitor->VerifyFound();
4098
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004099 // Cause INFO messages due to disturbing previously bound Sets
4100 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07004101 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4102 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4103 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004104 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07004105 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004106 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004107 " previously bound as set #0 was disturbed ");
4108 vkCmdBindDescriptorSets(
4109 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4110 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004111 m_errorMonitor->VerifyFound();
4112
Karl Schultz6addd812016-02-02 17:17:23 -07004113 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4114 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4115 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004116 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004118 " newly bound as set #0 so set #1 and "
4119 "any subsequent sets were disturbed ");
4120 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4121 VK_PIPELINE_BIND_POINT_GRAPHICS,
4122 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004123 m_errorMonitor->VerifyFound();
4124
Tobin Ehlis88452832015-12-03 09:40:56 -07004125 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07004126 // 1. Error due to not binding required set (we actually use same code as
4127 // above to disturb set0)
4128 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4129 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4130 2, &descriptorSet[0], 0, NULL);
4131 vkCmdBindDescriptorSets(
4132 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4133 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
4134 m_errorMonitor->SetDesiredFailureMsg(
4135 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4136 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07004137 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004138 m_errorMonitor->VerifyFound();
4139
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004140 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004141 // 2. Error due to bound set not being compatible with PSO's
4142 // VkPipelineLayout (diff stageFlags in this case)
4143 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4144 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4145 2, &descriptorSet[0], 0, NULL);
4146 m_errorMonitor->SetDesiredFailureMsg(
4147 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4148 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07004149 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004150 m_errorMonitor->VerifyFound();
4151
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004152 // Remaining clean-up
4153 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004154 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004155 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
4156 }
4157 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06004158 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
4159 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004160 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004161 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4162 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4163}
Tobin Ehlis559c6382015-11-05 09:52:49 -07004164
Karl Schultz6addd812016-02-02 17:17:23 -07004165TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004166
Karl Schultz6addd812016-02-02 17:17:23 -07004167 m_errorMonitor->SetDesiredFailureMsg(
4168 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004169 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004170
4171 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004172 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004173 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004174 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004175
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004176 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004177}
4178
Karl Schultz6addd812016-02-02 17:17:23 -07004179TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
4180 VkResult err;
4181 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004182
Karl Schultz6addd812016-02-02 17:17:23 -07004183 m_errorMonitor->SetDesiredFailureMsg(
4184 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07004185 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004186
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004187 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004188
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004189 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004190 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06004191 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004192 cmd.commandPool = m_commandPool;
4193 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004194 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06004195
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004196 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06004197 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004198
4199 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004200 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07004201 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004202 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06004203 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07004204 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
4205 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004206 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004207
4208 // The error should be caught by validation of the BeginCommandBuffer call
4209 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
4210
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004211 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004212 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004213}
4214
Karl Schultz6addd812016-02-02 17:17:23 -07004215TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004216 // Cause error due to Begin while recording CB
4217 // Then cause 2 errors for attempting to reset CB w/o having
4218 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
4219 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004221 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004222
4223 ASSERT_NO_FATAL_FAILURE(InitState());
4224
4225 // Calls AllocateCommandBuffers
4226 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
4227
Karl Schultz6addd812016-02-02 17:17:23 -07004228 // Force the failure by setting the Renderpass and Framebuffer fields with
4229 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004230 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07004231 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004232 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4233 cmd_buf_info.pNext = NULL;
4234 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004235 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004236
4237 // Begin CB to transition to recording state
4238 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
4239 // Can't re-begin. This should trigger error
4240 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004241 m_errorMonitor->VerifyFound();
4242
Karl Schultz6addd812016-02-02 17:17:23 -07004243 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4244 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004245 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
4246 // Reset attempt will trigger error due to incorrect CommandPool state
4247 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004248 m_errorMonitor->VerifyFound();
4249
Karl Schultz6addd812016-02-02 17:17:23 -07004250 m_errorMonitor->SetDesiredFailureMsg(
4251 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4252 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004253 // Transition CB to RECORDED state
4254 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
4255 // Now attempting to Begin will implicitly reset, which triggers error
4256 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004257 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004258}
4259
Karl Schultz6addd812016-02-02 17:17:23 -07004260TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004261 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07004262 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004263
Karl Schultz6addd812016-02-02 17:17:23 -07004264 m_errorMonitor->SetDesiredFailureMsg(
4265 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004266 "Invalid Pipeline CreateInfo State: Vtx Shader required");
4267
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004268 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06004269 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004270
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004271 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004272 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4273 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004274
4275 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004276 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4277 ds_pool_ci.pNext = NULL;
4278 ds_pool_ci.maxSets = 1;
4279 ds_pool_ci.poolSizeCount = 1;
4280 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004281
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004282 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004283 err =
4284 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004285 ASSERT_VK_SUCCESS(err);
4286
Tony Barboureb254902015-07-15 12:50:33 -06004287 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004288 dsl_binding.binding = 0;
4289 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4290 dsl_binding.descriptorCount = 1;
4291 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4292 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004293
Tony Barboureb254902015-07-15 12:50:33 -06004294 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004295 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4296 ds_layout_ci.pNext = NULL;
4297 ds_layout_ci.bindingCount = 1;
4298 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004299
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004300 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004301 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4302 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004303 ASSERT_VK_SUCCESS(err);
4304
4305 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004306 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004307 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004308 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004309 alloc_info.descriptorPool = ds_pool;
4310 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004311 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4312 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004313 ASSERT_VK_SUCCESS(err);
4314
Tony Barboureb254902015-07-15 12:50:33 -06004315 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004316 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4317 pipeline_layout_ci.setLayoutCount = 1;
4318 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004319
4320 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004321 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4322 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004323 ASSERT_VK_SUCCESS(err);
4324
Tobin Ehlise68360f2015-10-01 11:15:13 -06004325 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07004326 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06004327
4328 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004329 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4330 vp_state_ci.scissorCount = 1;
4331 vp_state_ci.pScissors = &sc;
4332 vp_state_ci.viewportCount = 1;
4333 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004334
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004335 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4336 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4337 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4338 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4339 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4340 rs_state_ci.depthClampEnable = VK_FALSE;
4341 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4342 rs_state_ci.depthBiasEnable = VK_FALSE;
4343
Tony Barboureb254902015-07-15 12:50:33 -06004344 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004345 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4346 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004347 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004348 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4349 gp_ci.layout = pipeline_layout;
4350 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06004351
4352 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004353 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4354 pc_ci.initialDataSize = 0;
4355 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004356
4357 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06004358 VkPipelineCache pipelineCache;
4359
Karl Schultz6addd812016-02-02 17:17:23 -07004360 err =
4361 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06004362 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004363 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4364 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004365
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004366 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004367
Chia-I Wuf7458c52015-10-26 21:10:41 +08004368 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4369 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4370 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4371 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004372}
Tobin Ehlis912df022015-09-17 08:46:18 -06004373/*// TODO : This test should be good, but needs Tess support in compiler to run
4374TEST_F(VkLayerTest, InvalidPatchControlPoints)
4375{
4376 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06004377 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004378
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004380 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
4381primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004382
Tobin Ehlis912df022015-09-17 08:46:18 -06004383 ASSERT_NO_FATAL_FAILURE(InitState());
4384 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06004385
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004386 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06004387 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004388 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004389
4390 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4391 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4392 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004393 ds_pool_ci.poolSizeCount = 1;
4394 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06004395
4396 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004397 err = vkCreateDescriptorPool(m_device->device(),
4398VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06004399 ASSERT_VK_SUCCESS(err);
4400
4401 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08004402 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06004403 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08004404 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004405 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4406 dsl_binding.pImmutableSamplers = NULL;
4407
4408 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004409 ds_layout_ci.sType =
4410VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06004411 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004412 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004413 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06004414
4415 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004416 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4417&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06004418 ASSERT_VK_SUCCESS(err);
4419
4420 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004421 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
4422VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06004423 ASSERT_VK_SUCCESS(err);
4424
4425 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004426 pipeline_layout_ci.sType =
4427VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06004428 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004429 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004430 pipeline_layout_ci.pSetLayouts = &ds_layout;
4431
4432 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004433 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4434&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06004435 ASSERT_VK_SUCCESS(err);
4436
4437 VkPipelineShaderStageCreateInfo shaderStages[3];
4438 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
4439
Karl Schultz6addd812016-02-02 17:17:23 -07004440 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
4441this);
Tobin Ehlis912df022015-09-17 08:46:18 -06004442 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07004443 VkShaderObj
4444tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
4445this);
4446 VkShaderObj
4447te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
4448this);
Tobin Ehlis912df022015-09-17 08:46:18 -06004449
Karl Schultz6addd812016-02-02 17:17:23 -07004450 shaderStages[0].sType =
4451VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004452 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004453 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07004454 shaderStages[1].sType =
4455VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004456 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004457 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07004458 shaderStages[2].sType =
4459VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004460 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004461 shaderStages[2].shader = te.handle();
4462
4463 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004464 iaCI.sType =
4465VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08004466 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06004467
4468 VkPipelineTessellationStateCreateInfo tsCI = {};
4469 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
4470 tsCI.patchControlPoints = 0; // This will cause an error
4471
4472 VkGraphicsPipelineCreateInfo gp_ci = {};
4473 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4474 gp_ci.pNext = NULL;
4475 gp_ci.stageCount = 3;
4476 gp_ci.pStages = shaderStages;
4477 gp_ci.pVertexInputState = NULL;
4478 gp_ci.pInputAssemblyState = &iaCI;
4479 gp_ci.pTessellationState = &tsCI;
4480 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004481 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06004482 gp_ci.pMultisampleState = NULL;
4483 gp_ci.pDepthStencilState = NULL;
4484 gp_ci.pColorBlendState = NULL;
4485 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4486 gp_ci.layout = pipeline_layout;
4487 gp_ci.renderPass = renderPass();
4488
4489 VkPipelineCacheCreateInfo pc_ci = {};
4490 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4491 pc_ci.pNext = NULL;
4492 pc_ci.initialSize = 0;
4493 pc_ci.initialData = 0;
4494 pc_ci.maxSize = 0;
4495
4496 VkPipeline pipeline;
4497 VkPipelineCache pipelineCache;
4498
Karl Schultz6addd812016-02-02 17:17:23 -07004499 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
4500&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06004501 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004502 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4503&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06004504
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004505 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004506
Chia-I Wuf7458c52015-10-26 21:10:41 +08004507 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4508 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4509 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4510 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06004511}
4512*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06004513// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07004514TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07004515 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004516
Karl Schultz6addd812016-02-02 17:17:23 -07004517 m_errorMonitor->SetDesiredFailureMsg(
4518 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004519 "Gfx Pipeline viewport count (1) must match scissor count (0).");
4520
Tobin Ehlise68360f2015-10-01 11:15:13 -06004521 ASSERT_NO_FATAL_FAILURE(InitState());
4522 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004523
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004524 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004525 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4526 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004527
4528 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004529 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4530 ds_pool_ci.maxSets = 1;
4531 ds_pool_ci.poolSizeCount = 1;
4532 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004533
4534 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004535 err =
4536 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004537 ASSERT_VK_SUCCESS(err);
4538
4539 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004540 dsl_binding.binding = 0;
4541 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4542 dsl_binding.descriptorCount = 1;
4543 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004544
4545 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004546 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4547 ds_layout_ci.bindingCount = 1;
4548 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004549
4550 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004551 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4552 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004553 ASSERT_VK_SUCCESS(err);
4554
4555 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004556 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004557 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004558 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004559 alloc_info.descriptorPool = ds_pool;
4560 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004561 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4562 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004563 ASSERT_VK_SUCCESS(err);
4564
4565 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004566 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4567 pipeline_layout_ci.setLayoutCount = 1;
4568 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004569
4570 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004571 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4572 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004573 ASSERT_VK_SUCCESS(err);
4574
4575 VkViewport vp = {}; // Just need dummy vp to point to
4576
4577 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004578 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4579 vp_state_ci.scissorCount = 0;
4580 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
4581 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004582
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004583 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4584 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4585 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4586 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4587 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4588 rs_state_ci.depthClampEnable = VK_FALSE;
4589 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4590 rs_state_ci.depthBiasEnable = VK_FALSE;
4591
Cody Northropeb3a6c12015-10-05 14:44:45 -06004592 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004593 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004594
Karl Schultz6addd812016-02-02 17:17:23 -07004595 VkShaderObj vs(m_device, bindStateVertShaderText,
4596 VK_SHADER_STAGE_VERTEX_BIT, this);
4597 VkShaderObj fs(m_device, bindStateFragShaderText,
4598 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004599 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004600 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004601 shaderStages[0] = vs.GetStageCreateInfo();
4602 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004603
4604 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004605 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4606 gp_ci.stageCount = 2;
4607 gp_ci.pStages = shaderStages;
4608 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004609 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004610 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4611 gp_ci.layout = pipeline_layout;
4612 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004613
4614 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004615 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004616
4617 VkPipeline pipeline;
4618 VkPipelineCache pipelineCache;
4619
Karl Schultz6addd812016-02-02 17:17:23 -07004620 err =
4621 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004622 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004623 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4624 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004625
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004626 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004627
Chia-I Wuf7458c52015-10-26 21:10:41 +08004628 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4629 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4630 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4631 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004632}
Karl Schultz6addd812016-02-02 17:17:23 -07004633// Don't set viewport state in PSO. This is an error b/c we always need this
4634// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06004635// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07004636TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06004637 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07004638 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004639
Karl Schultz6addd812016-02-02 17:17:23 -07004640 m_errorMonitor->SetDesiredFailureMsg(
4641 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004642 "Gfx Pipeline pViewportState is null. Even if ");
4643
Tobin Ehlise68360f2015-10-01 11:15:13 -06004644 ASSERT_NO_FATAL_FAILURE(InitState());
4645 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004646
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004647 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004648 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4649 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004650
4651 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004652 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4653 ds_pool_ci.maxSets = 1;
4654 ds_pool_ci.poolSizeCount = 1;
4655 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004656
4657 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004658 err =
4659 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004660 ASSERT_VK_SUCCESS(err);
4661
4662 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004663 dsl_binding.binding = 0;
4664 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4665 dsl_binding.descriptorCount = 1;
4666 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004667
4668 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004669 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4670 ds_layout_ci.bindingCount = 1;
4671 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004672
4673 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004674 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4675 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004676 ASSERT_VK_SUCCESS(err);
4677
4678 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004679 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004680 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004681 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004682 alloc_info.descriptorPool = ds_pool;
4683 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004684 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4685 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004686 ASSERT_VK_SUCCESS(err);
4687
4688 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004689 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4690 pipeline_layout_ci.setLayoutCount = 1;
4691 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004692
4693 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004694 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4695 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004696 ASSERT_VK_SUCCESS(err);
4697
4698 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4699 // Set scissor as dynamic to avoid second error
4700 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004701 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4702 dyn_state_ci.dynamicStateCount = 1;
4703 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004704
Cody Northropeb3a6c12015-10-05 14:44:45 -06004705 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004706 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004707
Karl Schultz6addd812016-02-02 17:17:23 -07004708 VkShaderObj vs(m_device, bindStateVertShaderText,
4709 VK_SHADER_STAGE_VERTEX_BIT, this);
4710 VkShaderObj fs(m_device, bindStateFragShaderText,
4711 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004712 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004713 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004714 shaderStages[0] = vs.GetStageCreateInfo();
4715 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004716
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004717
4718 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4719 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4720 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4721 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4722 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4723 rs_state_ci.depthClampEnable = VK_FALSE;
4724 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4725 rs_state_ci.depthBiasEnable = VK_FALSE;
4726
Tobin Ehlise68360f2015-10-01 11:15:13 -06004727 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004728 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4729 gp_ci.stageCount = 2;
4730 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004731 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004732 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
4733 // should cause validation error
4734 gp_ci.pDynamicState = &dyn_state_ci;
4735 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4736 gp_ci.layout = pipeline_layout;
4737 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004738
4739 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004740 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004741
4742 VkPipeline pipeline;
4743 VkPipelineCache pipelineCache;
4744
Karl Schultz6addd812016-02-02 17:17:23 -07004745 err =
4746 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004747 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004748 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4749 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004750
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004751 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004752
Chia-I Wuf7458c52015-10-26 21:10:41 +08004753 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4754 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4755 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4756 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004757}
4758// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07004759// Then run second test where dynamic scissor count doesn't match PSO scissor
4760// count
4761TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
4762 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004763
Karl Schultz6addd812016-02-02 17:17:23 -07004764 m_errorMonitor->SetDesiredFailureMsg(
4765 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004766 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
4767
Tobin Ehlise68360f2015-10-01 11:15:13 -06004768 ASSERT_NO_FATAL_FAILURE(InitState());
4769 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004770
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004771 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004772 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4773 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004774
4775 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004776 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4777 ds_pool_ci.maxSets = 1;
4778 ds_pool_ci.poolSizeCount = 1;
4779 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004780
4781 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004782 err =
4783 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004784 ASSERT_VK_SUCCESS(err);
4785
4786 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004787 dsl_binding.binding = 0;
4788 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4789 dsl_binding.descriptorCount = 1;
4790 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004791
4792 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004793 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4794 ds_layout_ci.bindingCount = 1;
4795 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004796
4797 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004798 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4799 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004800 ASSERT_VK_SUCCESS(err);
4801
4802 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004803 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004804 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004805 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004806 alloc_info.descriptorPool = ds_pool;
4807 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004808 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4809 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004810 ASSERT_VK_SUCCESS(err);
4811
4812 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004813 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4814 pipeline_layout_ci.setLayoutCount = 1;
4815 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004816
4817 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004818 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4819 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004820 ASSERT_VK_SUCCESS(err);
4821
4822 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004823 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4824 vp_state_ci.viewportCount = 1;
4825 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
4826 vp_state_ci.scissorCount = 1;
4827 vp_state_ci.pScissors =
4828 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06004829
4830 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4831 // Set scissor as dynamic to avoid that error
4832 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004833 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4834 dyn_state_ci.dynamicStateCount = 1;
4835 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004836
Cody Northropeb3a6c12015-10-05 14:44:45 -06004837 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004838 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004839
Karl Schultz6addd812016-02-02 17:17:23 -07004840 VkShaderObj vs(m_device, bindStateVertShaderText,
4841 VK_SHADER_STAGE_VERTEX_BIT, this);
4842 VkShaderObj fs(m_device, bindStateFragShaderText,
4843 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004844 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004845 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004846 shaderStages[0] = vs.GetStageCreateInfo();
4847 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004848
Cody Northropf6622dc2015-10-06 10:33:21 -06004849 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4850 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4851 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004852 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004853 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004854 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004855 vi_ci.pVertexAttributeDescriptions = nullptr;
4856
4857 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4858 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4859 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4860
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004861 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004862 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06004863 rs_ci.pNext = nullptr;
4864
Mark Youngc89c6312016-03-31 16:03:20 -06004865 VkPipelineColorBlendAttachmentState att = {};
4866 att.blendEnable = VK_FALSE;
4867 att.colorWriteMask = 0xf;
4868
Cody Northropf6622dc2015-10-06 10:33:21 -06004869 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4870 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4871 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004872 cb_ci.attachmentCount = 1;
4873 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06004874
Tobin Ehlise68360f2015-10-01 11:15:13 -06004875 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004876 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4877 gp_ci.stageCount = 2;
4878 gp_ci.pStages = shaderStages;
4879 gp_ci.pVertexInputState = &vi_ci;
4880 gp_ci.pInputAssemblyState = &ia_ci;
4881 gp_ci.pViewportState = &vp_state_ci;
4882 gp_ci.pRasterizationState = &rs_ci;
4883 gp_ci.pColorBlendState = &cb_ci;
4884 gp_ci.pDynamicState = &dyn_state_ci;
4885 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4886 gp_ci.layout = pipeline_layout;
4887 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004888
4889 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004890 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004891
4892 VkPipeline pipeline;
4893 VkPipelineCache pipelineCache;
4894
Karl Schultz6addd812016-02-02 17:17:23 -07004895 err =
4896 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004897 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004898 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4899 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004900
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004901 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004902
Tobin Ehlisd332f282015-10-02 11:00:56 -06004903 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07004904 // First need to successfully create the PSO from above by setting
4905 // pViewports
4906 m_errorMonitor->SetDesiredFailureMsg(
4907 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4908 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
4909 "scissorCount is 1. These counts must match.");
4910
4911 VkViewport vp = {}; // Just need dummy vp to point to
4912 vp_state_ci.pViewports = &vp;
4913 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4914 &gp_ci, NULL, &pipeline);
4915 ASSERT_VK_SUCCESS(err);
4916 BeginCommandBuffer();
4917 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4918 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4919 VkRect2D scissors[2] = {}; // don't care about data
4920 // Count of 2 doesn't match PSO count of 1
4921 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
4922 Draw(1, 0, 0, 0);
4923
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004924 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004925
4926 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4927 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4928 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4929 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4930}
4931// Create PSO w/o non-zero scissorCount but no scissor data
4932// Then run second test where dynamic viewportCount doesn't match PSO
4933// viewportCount
4934TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
4935 VkResult err;
4936
4937 m_errorMonitor->SetDesiredFailureMsg(
4938 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4939 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
4940
4941 ASSERT_NO_FATAL_FAILURE(InitState());
4942 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4943
4944 VkDescriptorPoolSize ds_type_count = {};
4945 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4946 ds_type_count.descriptorCount = 1;
4947
4948 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4949 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4950 ds_pool_ci.maxSets = 1;
4951 ds_pool_ci.poolSizeCount = 1;
4952 ds_pool_ci.pPoolSizes = &ds_type_count;
4953
4954 VkDescriptorPool ds_pool;
4955 err =
4956 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4957 ASSERT_VK_SUCCESS(err);
4958
4959 VkDescriptorSetLayoutBinding dsl_binding = {};
4960 dsl_binding.binding = 0;
4961 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4962 dsl_binding.descriptorCount = 1;
4963 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4964
4965 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4966 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4967 ds_layout_ci.bindingCount = 1;
4968 ds_layout_ci.pBindings = &dsl_binding;
4969
4970 VkDescriptorSetLayout ds_layout;
4971 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4972 &ds_layout);
4973 ASSERT_VK_SUCCESS(err);
4974
4975 VkDescriptorSet descriptorSet;
4976 VkDescriptorSetAllocateInfo alloc_info = {};
4977 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4978 alloc_info.descriptorSetCount = 1;
4979 alloc_info.descriptorPool = ds_pool;
4980 alloc_info.pSetLayouts = &ds_layout;
4981 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4982 &descriptorSet);
4983 ASSERT_VK_SUCCESS(err);
4984
4985 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4986 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4987 pipeline_layout_ci.setLayoutCount = 1;
4988 pipeline_layout_ci.pSetLayouts = &ds_layout;
4989
4990 VkPipelineLayout pipeline_layout;
4991 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4992 &pipeline_layout);
4993 ASSERT_VK_SUCCESS(err);
4994
4995 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4996 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4997 vp_state_ci.scissorCount = 1;
4998 vp_state_ci.pScissors =
4999 NULL; // Null scissor w/ count of 1 should cause error
5000 vp_state_ci.viewportCount = 1;
5001 vp_state_ci.pViewports =
5002 NULL; // vp is dynamic (below) so this won't cause error
5003
5004 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
5005 // Set scissor as dynamic to avoid that error
5006 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5007 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5008 dyn_state_ci.dynamicStateCount = 1;
5009 dyn_state_ci.pDynamicStates = &vp_state;
5010
5011 VkPipelineShaderStageCreateInfo shaderStages[2];
5012 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5013
5014 VkShaderObj vs(m_device, bindStateVertShaderText,
5015 VK_SHADER_STAGE_VERTEX_BIT, this);
5016 VkShaderObj fs(m_device, bindStateFragShaderText,
5017 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005018 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005019 // but add it to be able to run on more devices
5020 shaderStages[0] = vs.GetStageCreateInfo();
5021 shaderStages[1] = fs.GetStageCreateInfo();
5022
5023 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5024 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5025 vi_ci.pNext = nullptr;
5026 vi_ci.vertexBindingDescriptionCount = 0;
5027 vi_ci.pVertexBindingDescriptions = nullptr;
5028 vi_ci.vertexAttributeDescriptionCount = 0;
5029 vi_ci.pVertexAttributeDescriptions = nullptr;
5030
5031 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5032 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5033 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5034
5035 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5036 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5037 rs_ci.pNext = nullptr;
5038
Mark Youngc89c6312016-03-31 16:03:20 -06005039 VkPipelineColorBlendAttachmentState att = {};
5040 att.blendEnable = VK_FALSE;
5041 att.colorWriteMask = 0xf;
5042
Karl Schultz6addd812016-02-02 17:17:23 -07005043 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5044 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5045 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06005046 cb_ci.attachmentCount = 1;
5047 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07005048
5049 VkGraphicsPipelineCreateInfo gp_ci = {};
5050 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5051 gp_ci.stageCount = 2;
5052 gp_ci.pStages = shaderStages;
5053 gp_ci.pVertexInputState = &vi_ci;
5054 gp_ci.pInputAssemblyState = &ia_ci;
5055 gp_ci.pViewportState = &vp_state_ci;
5056 gp_ci.pRasterizationState = &rs_ci;
5057 gp_ci.pColorBlendState = &cb_ci;
5058 gp_ci.pDynamicState = &dyn_state_ci;
5059 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5060 gp_ci.layout = pipeline_layout;
5061 gp_ci.renderPass = renderPass();
5062
5063 VkPipelineCacheCreateInfo pc_ci = {};
5064 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5065
5066 VkPipeline pipeline;
5067 VkPipelineCache pipelineCache;
5068
5069 err =
5070 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5071 ASSERT_VK_SUCCESS(err);
5072 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5073 &gp_ci, NULL, &pipeline);
5074
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005075 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07005076
5077 // Now hit second fail case where we set scissor w/ different count than PSO
5078 // First need to successfully create the PSO from above by setting
5079 // pViewports
5080 m_errorMonitor->SetDesiredFailureMsg(
5081 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5082 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
5083 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005084
Tobin Ehlisd332f282015-10-02 11:00:56 -06005085 VkRect2D sc = {}; // Just need dummy vp to point to
5086 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07005087 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5088 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005089 ASSERT_VK_SUCCESS(err);
5090 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005091 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5092 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005093 VkViewport viewports[2] = {}; // don't care about data
5094 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07005095 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005096 Draw(1, 0, 0, 0);
5097
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005098 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005099
Chia-I Wuf7458c52015-10-26 21:10:41 +08005100 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5101 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5102 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5103 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005104}
5105
Mark Young7394fdd2016-03-31 14:56:43 -06005106TEST_F(VkLayerTest, PSOLineWidthInvalid) {
5107 VkResult err;
5108
5109 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06005110 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06005111
5112 ASSERT_NO_FATAL_FAILURE(InitState());
5113 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5114
5115 VkDescriptorPoolSize ds_type_count = {};
5116 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5117 ds_type_count.descriptorCount = 1;
5118
5119 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5120 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5121 ds_pool_ci.maxSets = 1;
5122 ds_pool_ci.poolSizeCount = 1;
5123 ds_pool_ci.pPoolSizes = &ds_type_count;
5124
5125 VkDescriptorPool ds_pool;
5126 err =
5127 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5128 ASSERT_VK_SUCCESS(err);
5129
5130 VkDescriptorSetLayoutBinding dsl_binding = {};
5131 dsl_binding.binding = 0;
5132 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5133 dsl_binding.descriptorCount = 1;
5134 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5135
5136 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5137 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5138 ds_layout_ci.bindingCount = 1;
5139 ds_layout_ci.pBindings = &dsl_binding;
5140
5141 VkDescriptorSetLayout ds_layout;
5142 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5143 &ds_layout);
5144 ASSERT_VK_SUCCESS(err);
5145
5146 VkDescriptorSet descriptorSet;
5147 VkDescriptorSetAllocateInfo alloc_info = {};
5148 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5149 alloc_info.descriptorSetCount = 1;
5150 alloc_info.descriptorPool = ds_pool;
5151 alloc_info.pSetLayouts = &ds_layout;
5152 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5153 &descriptorSet);
5154 ASSERT_VK_SUCCESS(err);
5155
5156 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5157 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5158 pipeline_layout_ci.setLayoutCount = 1;
5159 pipeline_layout_ci.pSetLayouts = &ds_layout;
5160
5161 VkPipelineLayout pipeline_layout;
5162 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5163 &pipeline_layout);
5164 ASSERT_VK_SUCCESS(err);
5165
5166 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5167 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5168 vp_state_ci.scissorCount = 1;
5169 vp_state_ci.pScissors = NULL;
5170 vp_state_ci.viewportCount = 1;
5171 vp_state_ci.pViewports = NULL;
5172
5173 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
5174 VK_DYNAMIC_STATE_SCISSOR,
5175 VK_DYNAMIC_STATE_LINE_WIDTH};
5176 // Set scissor as dynamic to avoid that error
5177 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5178 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5179 dyn_state_ci.dynamicStateCount = 2;
5180 dyn_state_ci.pDynamicStates = dynamic_states;
5181
5182 VkPipelineShaderStageCreateInfo shaderStages[2];
5183 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5184
5185 VkShaderObj vs(m_device, bindStateVertShaderText,
5186 VK_SHADER_STAGE_VERTEX_BIT, this);
5187 VkShaderObj fs(m_device, bindStateFragShaderText,
5188 VK_SHADER_STAGE_FRAGMENT_BIT,
5189 this); // TODO - We shouldn't need a fragment shader
5190 // but add it to be able to run on more devices
5191 shaderStages[0] = vs.GetStageCreateInfo();
5192 shaderStages[1] = fs.GetStageCreateInfo();
5193
5194 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5195 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5196 vi_ci.pNext = nullptr;
5197 vi_ci.vertexBindingDescriptionCount = 0;
5198 vi_ci.pVertexBindingDescriptions = nullptr;
5199 vi_ci.vertexAttributeDescriptionCount = 0;
5200 vi_ci.pVertexAttributeDescriptions = nullptr;
5201
5202 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5203 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5204 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5205
5206 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5207 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5208 rs_ci.pNext = nullptr;
5209
Mark Young47107952016-05-02 15:59:55 -06005210 // Check too low (line width of -1.0f).
5211 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06005212
5213 VkPipelineColorBlendAttachmentState att = {};
5214 att.blendEnable = VK_FALSE;
5215 att.colorWriteMask = 0xf;
5216
5217 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5218 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5219 cb_ci.pNext = nullptr;
5220 cb_ci.attachmentCount = 1;
5221 cb_ci.pAttachments = &att;
5222
5223 VkGraphicsPipelineCreateInfo gp_ci = {};
5224 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5225 gp_ci.stageCount = 2;
5226 gp_ci.pStages = shaderStages;
5227 gp_ci.pVertexInputState = &vi_ci;
5228 gp_ci.pInputAssemblyState = &ia_ci;
5229 gp_ci.pViewportState = &vp_state_ci;
5230 gp_ci.pRasterizationState = &rs_ci;
5231 gp_ci.pColorBlendState = &cb_ci;
5232 gp_ci.pDynamicState = &dyn_state_ci;
5233 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5234 gp_ci.layout = pipeline_layout;
5235 gp_ci.renderPass = renderPass();
5236
5237 VkPipelineCacheCreateInfo pc_ci = {};
5238 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5239
5240 VkPipeline pipeline;
5241 VkPipelineCache pipelineCache;
5242
5243 err =
5244 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5245 ASSERT_VK_SUCCESS(err);
5246 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5247 &gp_ci, NULL, &pipeline);
5248
5249 m_errorMonitor->VerifyFound();
5250
5251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5252 "Attempt to set lineWidth to 65536");
5253
5254 // Check too high (line width of 65536.0f).
5255 rs_ci.lineWidth = 65536.0f;
5256
5257 err =
5258 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5259 ASSERT_VK_SUCCESS(err);
5260 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5261 &gp_ci, NULL, &pipeline);
5262
5263 m_errorMonitor->VerifyFound();
5264
5265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06005266 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06005267
5268 dyn_state_ci.dynamicStateCount = 3;
5269
5270 rs_ci.lineWidth = 1.0f;
5271
5272 err =
5273 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5274 ASSERT_VK_SUCCESS(err);
5275 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5276 &gp_ci, NULL, &pipeline);
5277 BeginCommandBuffer();
5278 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5279 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5280
5281 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06005282 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06005283 m_errorMonitor->VerifyFound();
5284
5285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5286 "Attempt to set lineWidth to 65536");
5287
5288 // Check too high with dynamic setting.
5289 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
5290 m_errorMonitor->VerifyFound();
5291 EndCommandBuffer();
5292
5293 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5294 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5295 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5296 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5297}
5298
Karl Schultz6addd812016-02-02 17:17:23 -07005299TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005300 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005301 m_errorMonitor->SetDesiredFailureMsg(
5302 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005303 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005304
5305 ASSERT_NO_FATAL_FAILURE(InitState());
5306 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005307
Tony Barbourfe3351b2015-07-28 10:17:20 -06005308 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005309 // Don't care about RenderPass handle b/c error should be flagged before
5310 // that
5311 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
5312 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005313
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005314 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005315}
5316
Karl Schultz6addd812016-02-02 17:17:23 -07005317TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005318 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005319 m_errorMonitor->SetDesiredFailureMsg(
5320 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005321 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005322
5323 ASSERT_NO_FATAL_FAILURE(InitState());
5324 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005325
Tony Barbourfe3351b2015-07-28 10:17:20 -06005326 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005327 // Just create a dummy Renderpass that's non-NULL so we can get to the
5328 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06005329 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005330 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
5331 rp_begin.pNext = NULL;
5332 rp_begin.renderPass = renderPass();
5333 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005334
Karl Schultz6addd812016-02-02 17:17:23 -07005335 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
5336 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005337
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005338 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005339}
5340
Karl Schultz6addd812016-02-02 17:17:23 -07005341TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005342 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07005343 m_errorMonitor->SetDesiredFailureMsg(
5344 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005345 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005346
5347 ASSERT_NO_FATAL_FAILURE(InitState());
5348 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005349
5350 // Renderpass is started here
5351 BeginCommandBuffer();
5352
5353 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005354 vk_testing::Buffer dstBuffer;
5355 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005356
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005357 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005358
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005359 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005360}
5361
Karl Schultz6addd812016-02-02 17:17:23 -07005362TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005363 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07005364 m_errorMonitor->SetDesiredFailureMsg(
5365 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005366 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005367
5368 ASSERT_NO_FATAL_FAILURE(InitState());
5369 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005370
5371 // Renderpass is started here
5372 BeginCommandBuffer();
5373
5374 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005375 vk_testing::Buffer dstBuffer;
5376 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005377
Karl Schultz6addd812016-02-02 17:17:23 -07005378 VkDeviceSize dstOffset = 0;
5379 VkDeviceSize dataSize = 1024;
5380 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005381
Karl Schultz6addd812016-02-02 17:17:23 -07005382 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
5383 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005384
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005385 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005386}
5387
Karl Schultz6addd812016-02-02 17:17:23 -07005388TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005389 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005390 m_errorMonitor->SetDesiredFailureMsg(
5391 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005392 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005393
5394 ASSERT_NO_FATAL_FAILURE(InitState());
5395 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005396
5397 // Renderpass is started here
5398 BeginCommandBuffer();
5399
Michael Lentine0a369f62016-02-03 16:51:46 -06005400 VkClearColorValue clear_color;
5401 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07005402 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
5403 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5404 const int32_t tex_width = 32;
5405 const int32_t tex_height = 32;
5406 VkImageCreateInfo image_create_info = {};
5407 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5408 image_create_info.pNext = NULL;
5409 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5410 image_create_info.format = tex_format;
5411 image_create_info.extent.width = tex_width;
5412 image_create_info.extent.height = tex_height;
5413 image_create_info.extent.depth = 1;
5414 image_create_info.mipLevels = 1;
5415 image_create_info.arrayLayers = 1;
5416 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5417 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
5418 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005419
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005420 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005421 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5422 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005423
Karl Schultz6addd812016-02-02 17:17:23 -07005424 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5425 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005426
Karl Schultz6addd812016-02-02 17:17:23 -07005427 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5428 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005429
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005430 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005431}
5432
Karl Schultz6addd812016-02-02 17:17:23 -07005433TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005434 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005435 m_errorMonitor->SetDesiredFailureMsg(
5436 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005437 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005438
5439 ASSERT_NO_FATAL_FAILURE(InitState());
5440 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005441
5442 // Renderpass is started here
5443 BeginCommandBuffer();
5444
5445 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07005446 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005447 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
5448 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5449 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
5450 image_create_info.extent.width = 64;
5451 image_create_info.extent.height = 64;
5452 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5453 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005454
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005455 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005456 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5457 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005458
Karl Schultz6addd812016-02-02 17:17:23 -07005459 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5460 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005461
Karl Schultz6addd812016-02-02 17:17:23 -07005462 vkCmdClearDepthStencilImage(
5463 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5464 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
5465 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005466
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005467 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005468}
5469
Karl Schultz6addd812016-02-02 17:17:23 -07005470TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005471 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005472 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005473
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005475 "vkCmdClearAttachments: This call "
5476 "must be issued inside an active "
5477 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005478
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005479 ASSERT_NO_FATAL_FAILURE(InitState());
5480 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005481
5482 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005483 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005484 ASSERT_VK_SUCCESS(err);
5485
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005486 VkClearAttachment color_attachment;
5487 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5488 color_attachment.clearValue.color.float32[0] = 0;
5489 color_attachment.clearValue.color.float32[1] = 0;
5490 color_attachment.clearValue.color.float32[2] = 0;
5491 color_attachment.clearValue.color.float32[3] = 0;
5492 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005493 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
5494 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5495 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005496
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005497 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005498}
5499
Karl Schultz9e66a292016-04-21 15:57:51 -06005500TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
5501 // Try to add a buffer memory barrier with no buffer.
5502 m_errorMonitor->SetDesiredFailureMsg(
5503 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5504 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
5505
5506 ASSERT_NO_FATAL_FAILURE(InitState());
5507 BeginCommandBuffer();
5508
5509 VkBufferMemoryBarrier buf_barrier = {};
5510 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5511 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5512 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5513 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5514 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5515 buf_barrier.buffer = VK_NULL_HANDLE;
5516 buf_barrier.offset = 0;
5517 buf_barrier.size = VK_WHOLE_SIZE;
5518 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5519 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
5520 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
5521
5522 m_errorMonitor->VerifyFound();
5523}
5524
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06005525TEST_F(VkLayerTest, InvalidBarriers) {
5526 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
5527
5528 m_errorMonitor->SetDesiredFailureMsg(
5529 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
5530
5531 ASSERT_NO_FATAL_FAILURE(InitState());
5532 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5533
5534 VkMemoryBarrier mem_barrier = {};
5535 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
5536 mem_barrier.pNext = NULL;
5537 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5538 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5539 BeginCommandBuffer();
5540 // BeginCommandBuffer() starts a render pass
5541 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5542 VK_PIPELINE_STAGE_HOST_BIT,
5543 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
5544 &mem_barrier, 0, nullptr, 0, nullptr);
5545 m_errorMonitor->VerifyFound();
5546
5547 m_errorMonitor->SetDesiredFailureMsg(
5548 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5549 "Image Layout cannot be transitioned to UNDEFINED");
5550 VkImageObj image(m_device);
5551 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
5552 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5553 ASSERT_TRUE(image.initialized());
5554 VkImageMemoryBarrier img_barrier = {};
5555 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
5556 img_barrier.pNext = NULL;
5557 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5558 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5559 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5560 // New layout can't be UNDEFINED
5561 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5562 img_barrier.image = image.handle();
5563 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5564 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5565 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5566 img_barrier.subresourceRange.baseArrayLayer = 0;
5567 img_barrier.subresourceRange.baseMipLevel = 0;
5568 img_barrier.subresourceRange.layerCount = 1;
5569 img_barrier.subresourceRange.levelCount = 1;
5570 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5571 VK_PIPELINE_STAGE_HOST_BIT,
5572 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5573 nullptr, 1, &img_barrier);
5574 m_errorMonitor->VerifyFound();
5575 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5576
5577 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5578 "Subresource must have the sum of the "
5579 "baseArrayLayer");
5580 // baseArrayLayer + layerCount must be <= image's arrayLayers
5581 img_barrier.subresourceRange.baseArrayLayer = 1;
5582 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5583 VK_PIPELINE_STAGE_HOST_BIT,
5584 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5585 nullptr, 1, &img_barrier);
5586 m_errorMonitor->VerifyFound();
5587 img_barrier.subresourceRange.baseArrayLayer = 0;
5588
5589 m_errorMonitor->SetDesiredFailureMsg(
5590 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5591 "Subresource must have the sum of the baseMipLevel");
5592 // baseMipLevel + levelCount must be <= image's mipLevels
5593 img_barrier.subresourceRange.baseMipLevel = 1;
5594 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5595 VK_PIPELINE_STAGE_HOST_BIT,
5596 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5597 nullptr, 1, &img_barrier);
5598 m_errorMonitor->VerifyFound();
5599 img_barrier.subresourceRange.baseMipLevel = 0;
5600
5601 m_errorMonitor->SetDesiredFailureMsg(
5602 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5603 "Buffer Barriers cannot be used during a render pass");
5604 vk_testing::Buffer buffer;
5605 buffer.init(*m_device, 256);
5606 VkBufferMemoryBarrier buf_barrier = {};
5607 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5608 buf_barrier.pNext = NULL;
5609 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5610 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5611 buf_barrier.buffer = buffer.handle();
5612 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5613 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5614 buf_barrier.offset = 0;
5615 buf_barrier.size = VK_WHOLE_SIZE;
5616 // Can't send buffer barrier during a render pass
5617 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5618 VK_PIPELINE_STAGE_HOST_BIT,
5619 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5620 &buf_barrier, 0, nullptr);
5621 m_errorMonitor->VerifyFound();
5622 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
5623
5624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5625 "which is not less than total size");
5626 buf_barrier.offset = 257;
5627 // Offset greater than total size
5628 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5629 VK_PIPELINE_STAGE_HOST_BIT,
5630 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5631 &buf_barrier, 0, nullptr);
5632 m_errorMonitor->VerifyFound();
5633 buf_barrier.offset = 0;
5634
5635 m_errorMonitor->SetDesiredFailureMsg(
5636 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
5637 buf_barrier.size = 257;
5638 // Size greater than total size
5639 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5640 VK_PIPELINE_STAGE_HOST_BIT,
5641 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5642 &buf_barrier, 0, nullptr);
5643 m_errorMonitor->VerifyFound();
5644 buf_barrier.size = VK_WHOLE_SIZE;
5645
5646 m_errorMonitor->SetDesiredFailureMsg(
5647 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5648 "Image is a depth and stencil format and thus must "
5649 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
5650 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
5651 VkDepthStencilObj ds_image(m_device);
5652 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
5653 ASSERT_TRUE(ds_image.initialized());
5654 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5655 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
5656 img_barrier.image = ds_image.handle();
5657 // Leave aspectMask at COLOR on purpose
5658 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5659 VK_PIPELINE_STAGE_HOST_BIT,
5660 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5661 nullptr, 1, &img_barrier);
5662 m_errorMonitor->VerifyFound();
5663}
5664
Karl Schultz6addd812016-02-02 17:17:23 -07005665TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005666 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005667 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005668
Karl Schultz6addd812016-02-02 17:17:23 -07005669 m_errorMonitor->SetDesiredFailureMsg(
5670 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005671 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
5672
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005673 ASSERT_NO_FATAL_FAILURE(InitState());
5674 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005675 uint32_t qfi = 0;
5676 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005677 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5678 buffCI.size = 1024;
5679 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5680 buffCI.queueFamilyIndexCount = 1;
5681 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005682
5683 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005684 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005685 ASSERT_VK_SUCCESS(err);
5686
5687 BeginCommandBuffer();
5688 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005689 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5690 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005691 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07005692 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
5693 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005694
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005695 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005696
Chia-I Wuf7458c52015-10-26 21:10:41 +08005697 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005698}
5699
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005700TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
5701 // Create an out-of-range queueFamilyIndex
5702 m_errorMonitor->SetDesiredFailureMsg(
5703 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -06005704 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
5705 "of the indices specified when the device was created, via the "
5706 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005707
5708 ASSERT_NO_FATAL_FAILURE(InitState());
5709 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5710 VkBufferCreateInfo buffCI = {};
5711 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5712 buffCI.size = 1024;
5713 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5714 buffCI.queueFamilyIndexCount = 1;
5715 // Introduce failure by specifying invalid queue_family_index
5716 uint32_t qfi = 777;
5717 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06005718 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005719
5720 VkBuffer ib;
5721 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
5722
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005723 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005724}
5725
Karl Schultz6addd812016-02-02 17:17:23 -07005726TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
5727 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
5728 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005729
Karl Schultz6addd812016-02-02 17:17:23 -07005730 m_errorMonitor->SetDesiredFailureMsg(
5731 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005732 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005733
5734 ASSERT_NO_FATAL_FAILURE(InitState());
5735 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005736
5737 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005738 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005739 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
5740 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005741
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005742 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005743}
5744
Karl Schultz6addd812016-02-02 17:17:23 -07005745TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005746 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07005747 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005748
Karl Schultz6addd812016-02-02 17:17:23 -07005749 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005750 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5751 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
5752 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005753
Tobin Ehlis3b780662015-05-28 12:11:26 -06005754 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005755 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005756 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005757 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5758 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005759
5760 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005761 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5762 ds_pool_ci.pNext = NULL;
5763 ds_pool_ci.maxSets = 1;
5764 ds_pool_ci.poolSizeCount = 1;
5765 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005766
Tobin Ehlis3b780662015-05-28 12:11:26 -06005767 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005768 err =
5769 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005770 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005771 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005772 dsl_binding.binding = 0;
5773 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5774 dsl_binding.descriptorCount = 1;
5775 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5776 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005777
Tony Barboureb254902015-07-15 12:50:33 -06005778 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005779 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5780 ds_layout_ci.pNext = NULL;
5781 ds_layout_ci.bindingCount = 1;
5782 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005783
Tobin Ehlis3b780662015-05-28 12:11:26 -06005784 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005785 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5786 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005787 ASSERT_VK_SUCCESS(err);
5788
5789 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005790 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005791 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005792 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005793 alloc_info.descriptorPool = ds_pool;
5794 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005795 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5796 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005797 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005798
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005799 VkSamplerCreateInfo sampler_ci = {};
5800 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5801 sampler_ci.pNext = NULL;
5802 sampler_ci.magFilter = VK_FILTER_NEAREST;
5803 sampler_ci.minFilter = VK_FILTER_NEAREST;
5804 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5805 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5806 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5807 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5808 sampler_ci.mipLodBias = 1.0;
5809 sampler_ci.anisotropyEnable = VK_FALSE;
5810 sampler_ci.maxAnisotropy = 1;
5811 sampler_ci.compareEnable = VK_FALSE;
5812 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5813 sampler_ci.minLod = 1.0;
5814 sampler_ci.maxLod = 1.0;
5815 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5816 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5817 VkSampler sampler;
5818 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5819 ASSERT_VK_SUCCESS(err);
5820
5821 VkDescriptorImageInfo info = {};
5822 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005823
5824 VkWriteDescriptorSet descriptor_write;
5825 memset(&descriptor_write, 0, sizeof(descriptor_write));
5826 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005827 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005828 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005829 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005830 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005831 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005832
5833 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5834
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005835 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005836
Chia-I Wuf7458c52015-10-26 21:10:41 +08005837 vkDestroySampler(m_device->device(), sampler, NULL);
5838 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5839 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005840}
5841
Karl Schultz6addd812016-02-02 17:17:23 -07005842TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005843 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07005844 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005845
Karl Schultz6addd812016-02-02 17:17:23 -07005846 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005847 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5848 " binding #0 with 1 total descriptors but update of 1 descriptors "
5849 "starting at binding offset of 0 combined with update array element "
5850 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005851
Tobin Ehlis3b780662015-05-28 12:11:26 -06005852 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005853 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005854 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005855 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5856 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005857
5858 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005859 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5860 ds_pool_ci.pNext = NULL;
5861 ds_pool_ci.maxSets = 1;
5862 ds_pool_ci.poolSizeCount = 1;
5863 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005864
Tobin Ehlis3b780662015-05-28 12:11:26 -06005865 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005866 err =
5867 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005868 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005869
Tony Barboureb254902015-07-15 12:50:33 -06005870 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005871 dsl_binding.binding = 0;
5872 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5873 dsl_binding.descriptorCount = 1;
5874 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5875 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005876
5877 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005878 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5879 ds_layout_ci.pNext = NULL;
5880 ds_layout_ci.bindingCount = 1;
5881 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005882
Tobin Ehlis3b780662015-05-28 12:11:26 -06005883 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005884 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5885 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005886 ASSERT_VK_SUCCESS(err);
5887
5888 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005889 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005890 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005891 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005892 alloc_info.descriptorPool = ds_pool;
5893 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005894 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5895 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005896 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005897
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005898 // Correctly update descriptor to avoid "NOT_UPDATED" error
5899 VkDescriptorBufferInfo buff_info = {};
5900 buff_info.buffer =
5901 VkBuffer(0); // Don't care about buffer handle for this test
5902 buff_info.offset = 0;
5903 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005904
5905 VkWriteDescriptorSet descriptor_write;
5906 memset(&descriptor_write, 0, sizeof(descriptor_write));
5907 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005908 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005909 descriptor_write.dstArrayElement =
5910 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08005911 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005912 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5913 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005914
5915 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5916
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005917 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005918
Chia-I Wuf7458c52015-10-26 21:10:41 +08005919 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5920 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005921}
5922
Karl Schultz6addd812016-02-02 17:17:23 -07005923TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
5924 // Create layout w/ count of 1 and attempt update to that layout w/ binding
5925 // index 2
5926 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005927
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5929 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005930
Tobin Ehlis3b780662015-05-28 12:11:26 -06005931 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005932 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005933 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005934 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5935 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005936
5937 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005938 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5939 ds_pool_ci.pNext = NULL;
5940 ds_pool_ci.maxSets = 1;
5941 ds_pool_ci.poolSizeCount = 1;
5942 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005943
Tobin Ehlis3b780662015-05-28 12:11:26 -06005944 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005945 err =
5946 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005947 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005948
Tony Barboureb254902015-07-15 12:50:33 -06005949 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005950 dsl_binding.binding = 0;
5951 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5952 dsl_binding.descriptorCount = 1;
5953 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5954 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005955
5956 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005957 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5958 ds_layout_ci.pNext = NULL;
5959 ds_layout_ci.bindingCount = 1;
5960 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005961 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005962 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5963 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005964 ASSERT_VK_SUCCESS(err);
5965
5966 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005967 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005968 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005969 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005970 alloc_info.descriptorPool = ds_pool;
5971 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005972 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5973 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005974 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005975
Tony Barboureb254902015-07-15 12:50:33 -06005976 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005977 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5978 sampler_ci.pNext = NULL;
5979 sampler_ci.magFilter = VK_FILTER_NEAREST;
5980 sampler_ci.minFilter = VK_FILTER_NEAREST;
5981 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5982 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5983 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5984 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5985 sampler_ci.mipLodBias = 1.0;
5986 sampler_ci.anisotropyEnable = VK_FALSE;
5987 sampler_ci.maxAnisotropy = 1;
5988 sampler_ci.compareEnable = VK_FALSE;
5989 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5990 sampler_ci.minLod = 1.0;
5991 sampler_ci.maxLod = 1.0;
5992 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5993 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005994
Tobin Ehlis3b780662015-05-28 12:11:26 -06005995 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005996 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005997 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005998
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005999 VkDescriptorImageInfo info = {};
6000 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006001
6002 VkWriteDescriptorSet descriptor_write;
6003 memset(&descriptor_write, 0, sizeof(descriptor_write));
6004 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006005 descriptor_write.dstSet = descriptorSet;
6006 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006007 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006008 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006009 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006010 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006011
6012 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6013
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006014 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006015
Chia-I Wuf7458c52015-10-26 21:10:41 +08006016 vkDestroySampler(m_device->device(), sampler, NULL);
6017 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6018 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006019}
6020
Karl Schultz6addd812016-02-02 17:17:23 -07006021TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
6022 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
6023 // types
6024 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006025
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006027 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006028
Tobin Ehlis3b780662015-05-28 12:11:26 -06006029 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006030
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006031 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006032 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6033 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006034
6035 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006036 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6037 ds_pool_ci.pNext = NULL;
6038 ds_pool_ci.maxSets = 1;
6039 ds_pool_ci.poolSizeCount = 1;
6040 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006041
Tobin Ehlis3b780662015-05-28 12:11:26 -06006042 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006043 err =
6044 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006045 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06006046 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006047 dsl_binding.binding = 0;
6048 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6049 dsl_binding.descriptorCount = 1;
6050 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6051 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006052
Tony Barboureb254902015-07-15 12:50:33 -06006053 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006054 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6055 ds_layout_ci.pNext = NULL;
6056 ds_layout_ci.bindingCount = 1;
6057 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006058
Tobin Ehlis3b780662015-05-28 12:11:26 -06006059 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006060 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6061 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006062 ASSERT_VK_SUCCESS(err);
6063
6064 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006065 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006066 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006067 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006068 alloc_info.descriptorPool = ds_pool;
6069 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006070 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6071 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006072 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006073
Tony Barboureb254902015-07-15 12:50:33 -06006074 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006075 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6076 sampler_ci.pNext = NULL;
6077 sampler_ci.magFilter = VK_FILTER_NEAREST;
6078 sampler_ci.minFilter = VK_FILTER_NEAREST;
6079 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6080 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6081 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6082 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6083 sampler_ci.mipLodBias = 1.0;
6084 sampler_ci.anisotropyEnable = VK_FALSE;
6085 sampler_ci.maxAnisotropy = 1;
6086 sampler_ci.compareEnable = VK_FALSE;
6087 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6088 sampler_ci.minLod = 1.0;
6089 sampler_ci.maxLod = 1.0;
6090 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6091 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006092 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006093 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006094 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006095
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006096 VkDescriptorImageInfo info = {};
6097 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006098
6099 VkWriteDescriptorSet descriptor_write;
6100 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07006101 descriptor_write.sType =
6102 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006103 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006104 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006105 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006106 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006107 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006108
6109 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6110
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006111 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006112
Chia-I Wuf7458c52015-10-26 21:10:41 +08006113 vkDestroySampler(m_device->device(), sampler, NULL);
6114 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6115 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006116}
6117
Karl Schultz6addd812016-02-02 17:17:23 -07006118TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006119 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07006120 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006121
Karl Schultz6addd812016-02-02 17:17:23 -07006122 m_errorMonitor->SetDesiredFailureMsg(
6123 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006124 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006125
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006126 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006127 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
6128 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006129 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006130 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6131 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006132
6133 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006134 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6135 ds_pool_ci.pNext = NULL;
6136 ds_pool_ci.maxSets = 1;
6137 ds_pool_ci.poolSizeCount = 1;
6138 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006139
6140 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006141 err =
6142 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006143 ASSERT_VK_SUCCESS(err);
6144
6145 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006146 dsl_binding.binding = 0;
6147 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6148 dsl_binding.descriptorCount = 1;
6149 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6150 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006151
6152 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006153 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6154 ds_layout_ci.pNext = NULL;
6155 ds_layout_ci.bindingCount = 1;
6156 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006157 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006158 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6159 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006160 ASSERT_VK_SUCCESS(err);
6161
6162 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006163 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006164 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006165 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006166 alloc_info.descriptorPool = ds_pool;
6167 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006168 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6169 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006170 ASSERT_VK_SUCCESS(err);
6171
Karl Schultz6addd812016-02-02 17:17:23 -07006172 VkSampler sampler =
6173 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006174
6175 VkDescriptorImageInfo descriptor_info;
6176 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
6177 descriptor_info.sampler = sampler;
6178
6179 VkWriteDescriptorSet descriptor_write;
6180 memset(&descriptor_write, 0, sizeof(descriptor_write));
6181 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006182 descriptor_write.dstSet = descriptorSet;
6183 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006184 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006185 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6186 descriptor_write.pImageInfo = &descriptor_info;
6187
6188 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6189
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006190 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006191
Chia-I Wuf7458c52015-10-26 21:10:41 +08006192 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6193 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006194}
6195
Karl Schultz6addd812016-02-02 17:17:23 -07006196TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
6197 // Create a single combined Image/Sampler descriptor and send it an invalid
6198 // imageView
6199 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006200
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6202 "Attempted write update to combined "
6203 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -06006204 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006205
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006206 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006207 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006208 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6209 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006210
6211 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006212 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6213 ds_pool_ci.pNext = NULL;
6214 ds_pool_ci.maxSets = 1;
6215 ds_pool_ci.poolSizeCount = 1;
6216 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006217
6218 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006219 err =
6220 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006221 ASSERT_VK_SUCCESS(err);
6222
6223 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006224 dsl_binding.binding = 0;
6225 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6226 dsl_binding.descriptorCount = 1;
6227 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6228 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006229
6230 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006231 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6232 ds_layout_ci.pNext = NULL;
6233 ds_layout_ci.bindingCount = 1;
6234 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006235 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006236 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6237 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006238 ASSERT_VK_SUCCESS(err);
6239
6240 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006241 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006242 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006243 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006244 alloc_info.descriptorPool = ds_pool;
6245 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006246 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6247 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006248 ASSERT_VK_SUCCESS(err);
6249
6250 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006251 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6252 sampler_ci.pNext = NULL;
6253 sampler_ci.magFilter = VK_FILTER_NEAREST;
6254 sampler_ci.minFilter = VK_FILTER_NEAREST;
6255 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6256 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6257 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6258 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6259 sampler_ci.mipLodBias = 1.0;
6260 sampler_ci.anisotropyEnable = VK_FALSE;
6261 sampler_ci.maxAnisotropy = 1;
6262 sampler_ci.compareEnable = VK_FALSE;
6263 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6264 sampler_ci.minLod = 1.0;
6265 sampler_ci.maxLod = 1.0;
6266 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6267 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006268
6269 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006270 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006271 ASSERT_VK_SUCCESS(err);
6272
Karl Schultz6addd812016-02-02 17:17:23 -07006273 VkImageView view =
6274 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006275
6276 VkDescriptorImageInfo descriptor_info;
6277 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
6278 descriptor_info.sampler = sampler;
6279 descriptor_info.imageView = view;
6280
6281 VkWriteDescriptorSet descriptor_write;
6282 memset(&descriptor_write, 0, sizeof(descriptor_write));
6283 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006284 descriptor_write.dstSet = descriptorSet;
6285 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006286 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006287 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6288 descriptor_write.pImageInfo = &descriptor_info;
6289
6290 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6291
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006292 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006293
Chia-I Wuf7458c52015-10-26 21:10:41 +08006294 vkDestroySampler(m_device->device(), sampler, NULL);
6295 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6296 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006297}
6298
Karl Schultz6addd812016-02-02 17:17:23 -07006299TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
6300 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
6301 // into the other
6302 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006303
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6305 " binding #1 with type "
6306 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
6307 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006308
Tobin Ehlis04356f92015-10-27 16:35:27 -06006309 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006310 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006311 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006312 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6313 ds_type_count[0].descriptorCount = 1;
6314 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
6315 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006316
6317 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006318 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6319 ds_pool_ci.pNext = NULL;
6320 ds_pool_ci.maxSets = 1;
6321 ds_pool_ci.poolSizeCount = 2;
6322 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006323
6324 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006325 err =
6326 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006327 ASSERT_VK_SUCCESS(err);
6328 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006329 dsl_binding[0].binding = 0;
6330 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6331 dsl_binding[0].descriptorCount = 1;
6332 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6333 dsl_binding[0].pImmutableSamplers = NULL;
6334 dsl_binding[1].binding = 1;
6335 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6336 dsl_binding[1].descriptorCount = 1;
6337 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
6338 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006339
6340 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006341 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6342 ds_layout_ci.pNext = NULL;
6343 ds_layout_ci.bindingCount = 2;
6344 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006345
6346 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006347 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6348 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006349 ASSERT_VK_SUCCESS(err);
6350
6351 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006352 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006353 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006354 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006355 alloc_info.descriptorPool = ds_pool;
6356 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006357 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6358 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006359 ASSERT_VK_SUCCESS(err);
6360
6361 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006362 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6363 sampler_ci.pNext = NULL;
6364 sampler_ci.magFilter = VK_FILTER_NEAREST;
6365 sampler_ci.minFilter = VK_FILTER_NEAREST;
6366 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6367 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6368 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6369 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6370 sampler_ci.mipLodBias = 1.0;
6371 sampler_ci.anisotropyEnable = VK_FALSE;
6372 sampler_ci.maxAnisotropy = 1;
6373 sampler_ci.compareEnable = VK_FALSE;
6374 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6375 sampler_ci.minLod = 1.0;
6376 sampler_ci.maxLod = 1.0;
6377 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6378 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006379
6380 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006381 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006382 ASSERT_VK_SUCCESS(err);
6383
6384 VkDescriptorImageInfo info = {};
6385 info.sampler = sampler;
6386
6387 VkWriteDescriptorSet descriptor_write;
6388 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
6389 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006390 descriptor_write.dstSet = descriptorSet;
6391 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08006392 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006393 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6394 descriptor_write.pImageInfo = &info;
6395 // This write update should succeed
6396 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6397 // Now perform a copy update that fails due to type mismatch
6398 VkCopyDescriptorSet copy_ds_update;
6399 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6400 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6401 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06006402 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006403 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006404 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08006405 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006406 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6407
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006408 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006409 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006410 m_errorMonitor->SetDesiredFailureMsg(
6411 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006412 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -06006413 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6414 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6415 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006416 copy_ds_update.srcBinding =
6417 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006418 copy_ds_update.dstSet = descriptorSet;
6419 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06006420 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006421 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6422
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006423 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006424
Tobin Ehlis04356f92015-10-27 16:35:27 -06006425 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006426 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006427 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
6428 "update array offset of 0 and update of "
6429 "5 descriptors oversteps total number "
6430 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006431
Tobin Ehlis04356f92015-10-27 16:35:27 -06006432 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6433 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6434 copy_ds_update.srcSet = descriptorSet;
6435 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006436 copy_ds_update.dstSet = descriptorSet;
6437 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006438 copy_ds_update.descriptorCount =
6439 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06006440 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6441
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006442 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006443
Chia-I Wuf7458c52015-10-26 21:10:41 +08006444 vkDestroySampler(m_device->device(), sampler, NULL);
6445 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6446 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006447}
6448
Karl Schultz6addd812016-02-02 17:17:23 -07006449TEST_F(VkLayerTest, NumSamplesMismatch) {
6450 // Create CommandBuffer where MSAA samples doesn't match RenderPass
6451 // sampleCount
6452 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006453
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006455 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006456
Tobin Ehlis3b780662015-05-28 12:11:26 -06006457 ASSERT_NO_FATAL_FAILURE(InitState());
6458 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006459 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06006460 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006461 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006462
6463 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006464 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6465 ds_pool_ci.pNext = NULL;
6466 ds_pool_ci.maxSets = 1;
6467 ds_pool_ci.poolSizeCount = 1;
6468 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006469
Tobin Ehlis3b780662015-05-28 12:11:26 -06006470 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006471 err =
6472 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006473 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006474
Tony Barboureb254902015-07-15 12:50:33 -06006475 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08006476 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06006477 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08006478 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006479 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6480 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006481
Tony Barboureb254902015-07-15 12:50:33 -06006482 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6483 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6484 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006485 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006486 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006487
Tobin Ehlis3b780662015-05-28 12:11:26 -06006488 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006489 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6490 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006491 ASSERT_VK_SUCCESS(err);
6492
6493 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006494 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006495 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006496 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006497 alloc_info.descriptorPool = ds_pool;
6498 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006499 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6500 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006501 ASSERT_VK_SUCCESS(err);
6502
Tony Barboureb254902015-07-15 12:50:33 -06006503 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006504 pipe_ms_state_ci.sType =
6505 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6506 pipe_ms_state_ci.pNext = NULL;
6507 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6508 pipe_ms_state_ci.sampleShadingEnable = 0;
6509 pipe_ms_state_ci.minSampleShading = 1.0;
6510 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006511
Tony Barboureb254902015-07-15 12:50:33 -06006512 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006513 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6514 pipeline_layout_ci.pNext = NULL;
6515 pipeline_layout_ci.setLayoutCount = 1;
6516 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006517
6518 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006519 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6520 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006521 ASSERT_VK_SUCCESS(err);
6522
Karl Schultz6addd812016-02-02 17:17:23 -07006523 VkShaderObj vs(m_device, bindStateVertShaderText,
6524 VK_SHADER_STAGE_VERTEX_BIT, this);
6525 VkShaderObj fs(m_device, bindStateFragShaderText,
6526 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006527 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006528 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006529 VkPipelineObj pipe(m_device);
6530 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006531 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006532 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006533 pipe.SetMSAA(&pipe_ms_state_ci);
6534 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006535
Tony Barbourfe3351b2015-07-28 10:17:20 -06006536 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006537 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6538 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006539
Mark Young29927482016-05-04 14:38:51 -06006540 // Render triangle (the error should trigger on the attempt to draw).
6541 Draw(3, 1, 0, 0);
6542
6543 // Finalize recording of the command buffer
6544 EndCommandBuffer();
6545
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006546 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006547
Chia-I Wuf7458c52015-10-26 21:10:41 +08006548 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6549 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6550 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006551}
Mark Young29927482016-05-04 14:38:51 -06006552
Mark Youngc89c6312016-03-31 16:03:20 -06006553TEST_F(VkLayerTest, NumBlendAttachMismatch) {
6554 // Create Pipeline where the number of blend attachments doesn't match the
6555 // number of color attachments. In this case, we don't add any color
6556 // blend attachments even though we have a color attachment.
6557 VkResult err;
6558
6559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -06006560 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -06006561
6562 ASSERT_NO_FATAL_FAILURE(InitState());
6563 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6564 VkDescriptorPoolSize ds_type_count = {};
6565 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6566 ds_type_count.descriptorCount = 1;
6567
6568 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6569 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6570 ds_pool_ci.pNext = NULL;
6571 ds_pool_ci.maxSets = 1;
6572 ds_pool_ci.poolSizeCount = 1;
6573 ds_pool_ci.pPoolSizes = &ds_type_count;
6574
6575 VkDescriptorPool ds_pool;
6576 err =
6577 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6578 ASSERT_VK_SUCCESS(err);
6579
6580 VkDescriptorSetLayoutBinding dsl_binding = {};
6581 dsl_binding.binding = 0;
6582 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6583 dsl_binding.descriptorCount = 1;
6584 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6585 dsl_binding.pImmutableSamplers = NULL;
6586
6587 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6588 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6589 ds_layout_ci.pNext = NULL;
6590 ds_layout_ci.bindingCount = 1;
6591 ds_layout_ci.pBindings = &dsl_binding;
6592
6593 VkDescriptorSetLayout ds_layout;
6594 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6595 &ds_layout);
6596 ASSERT_VK_SUCCESS(err);
6597
6598 VkDescriptorSet descriptorSet;
6599 VkDescriptorSetAllocateInfo alloc_info = {};
6600 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6601 alloc_info.descriptorSetCount = 1;
6602 alloc_info.descriptorPool = ds_pool;
6603 alloc_info.pSetLayouts = &ds_layout;
6604 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6605 &descriptorSet);
6606 ASSERT_VK_SUCCESS(err);
6607
6608 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
6609 pipe_ms_state_ci.sType =
6610 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6611 pipe_ms_state_ci.pNext = NULL;
6612 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6613 pipe_ms_state_ci.sampleShadingEnable = 0;
6614 pipe_ms_state_ci.minSampleShading = 1.0;
6615 pipe_ms_state_ci.pSampleMask = NULL;
6616
6617 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6618 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6619 pipeline_layout_ci.pNext = NULL;
6620 pipeline_layout_ci.setLayoutCount = 1;
6621 pipeline_layout_ci.pSetLayouts = &ds_layout;
6622
6623 VkPipelineLayout pipeline_layout;
6624 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6625 &pipeline_layout);
6626 ASSERT_VK_SUCCESS(err);
6627
6628 VkShaderObj vs(m_device, bindStateVertShaderText,
6629 VK_SHADER_STAGE_VERTEX_BIT, this);
6630 VkShaderObj fs(m_device, bindStateFragShaderText,
6631 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006632 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06006633 // but add it to be able to run on more devices
6634 VkPipelineObj pipe(m_device);
6635 pipe.AddShader(&vs);
6636 pipe.AddShader(&fs);
6637 pipe.SetMSAA(&pipe_ms_state_ci);
6638 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6639
6640 BeginCommandBuffer();
6641 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6642 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6643
Mark Young29927482016-05-04 14:38:51 -06006644 // Render triangle (the error should trigger on the attempt to draw).
6645 Draw(3, 1, 0, 0);
6646
6647 // Finalize recording of the command buffer
6648 EndCommandBuffer();
6649
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006650 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06006651
6652 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6653 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6654 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6655}
Mark Young29927482016-05-04 14:38:51 -06006656
Karl Schultz6addd812016-02-02 17:17:23 -07006657TEST_F(VkLayerTest, ClearCmdNoDraw) {
6658 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
6659 // to issuing a Draw
6660 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006661
Karl Schultz6addd812016-02-02 17:17:23 -07006662 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07006663 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006664 "vkCmdClearAttachments() issued on CB object ");
6665
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006666 ASSERT_NO_FATAL_FAILURE(InitState());
6667 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006668
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006669 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006670 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6671 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006672
6673 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006674 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6675 ds_pool_ci.pNext = NULL;
6676 ds_pool_ci.maxSets = 1;
6677 ds_pool_ci.poolSizeCount = 1;
6678 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006679
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006680 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006681 err =
6682 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006683 ASSERT_VK_SUCCESS(err);
6684
Tony Barboureb254902015-07-15 12:50:33 -06006685 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006686 dsl_binding.binding = 0;
6687 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6688 dsl_binding.descriptorCount = 1;
6689 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6690 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006691
Tony Barboureb254902015-07-15 12:50:33 -06006692 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006693 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6694 ds_layout_ci.pNext = NULL;
6695 ds_layout_ci.bindingCount = 1;
6696 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006697
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006698 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006699 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6700 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006701 ASSERT_VK_SUCCESS(err);
6702
6703 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006704 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006705 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006706 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006707 alloc_info.descriptorPool = ds_pool;
6708 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006709 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6710 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006711 ASSERT_VK_SUCCESS(err);
6712
Tony Barboureb254902015-07-15 12:50:33 -06006713 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006714 pipe_ms_state_ci.sType =
6715 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6716 pipe_ms_state_ci.pNext = NULL;
6717 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6718 pipe_ms_state_ci.sampleShadingEnable = 0;
6719 pipe_ms_state_ci.minSampleShading = 1.0;
6720 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006721
Tony Barboureb254902015-07-15 12:50:33 -06006722 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006723 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6724 pipeline_layout_ci.pNext = NULL;
6725 pipeline_layout_ci.setLayoutCount = 1;
6726 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006727
6728 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006729 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6730 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006731 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006732
Karl Schultz6addd812016-02-02 17:17:23 -07006733 VkShaderObj vs(m_device, bindStateVertShaderText,
6734 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006735 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006736 // on more devices
6737 VkShaderObj fs(m_device, bindStateFragShaderText,
6738 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006739
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006740 VkPipelineObj pipe(m_device);
6741 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006742 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006743 pipe.SetMSAA(&pipe_ms_state_ci);
6744 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006745
6746 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006747
Karl Schultz6addd812016-02-02 17:17:23 -07006748 // Main thing we care about for this test is that the VkImage obj we're
6749 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006750 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006751 VkClearAttachment color_attachment;
6752 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6753 color_attachment.clearValue.color.float32[0] = 1.0;
6754 color_attachment.clearValue.color.float32[1] = 1.0;
6755 color_attachment.clearValue.color.float32[2] = 1.0;
6756 color_attachment.clearValue.color.float32[3] = 1.0;
6757 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006758 VkClearRect clear_rect = {
6759 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006760
Karl Schultz6addd812016-02-02 17:17:23 -07006761 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
6762 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -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 Ehlis53eddda2015-07-01 16:46:13 -06006769}
6770
Karl Schultz6addd812016-02-02 17:17:23 -07006771TEST_F(VkLayerTest, VtxBufferBadIndex) {
6772 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006773
Karl Schultz6addd812016-02-02 17:17:23 -07006774 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006775 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07006776 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006777
Tobin Ehlis502480b2015-06-24 15:53:07 -06006778 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06006779 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06006780 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006781
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006782 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006783 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6784 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006785
6786 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006787 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6788 ds_pool_ci.pNext = NULL;
6789 ds_pool_ci.maxSets = 1;
6790 ds_pool_ci.poolSizeCount = 1;
6791 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006792
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006793 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006794 err =
6795 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006796 ASSERT_VK_SUCCESS(err);
6797
Tony Barboureb254902015-07-15 12:50:33 -06006798 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006799 dsl_binding.binding = 0;
6800 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6801 dsl_binding.descriptorCount = 1;
6802 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6803 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006804
Tony Barboureb254902015-07-15 12:50:33 -06006805 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006806 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6807 ds_layout_ci.pNext = NULL;
6808 ds_layout_ci.bindingCount = 1;
6809 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006810
Tobin Ehlis502480b2015-06-24 15:53:07 -06006811 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006812 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6813 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006814 ASSERT_VK_SUCCESS(err);
6815
6816 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006817 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006818 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006819 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006820 alloc_info.descriptorPool = ds_pool;
6821 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006822 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6823 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006824 ASSERT_VK_SUCCESS(err);
6825
Tony Barboureb254902015-07-15 12:50:33 -06006826 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006827 pipe_ms_state_ci.sType =
6828 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6829 pipe_ms_state_ci.pNext = NULL;
6830 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6831 pipe_ms_state_ci.sampleShadingEnable = 0;
6832 pipe_ms_state_ci.minSampleShading = 1.0;
6833 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006834
Tony Barboureb254902015-07-15 12:50:33 -06006835 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006836 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6837 pipeline_layout_ci.pNext = NULL;
6838 pipeline_layout_ci.setLayoutCount = 1;
6839 pipeline_layout_ci.pSetLayouts = &ds_layout;
6840 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006841
Karl Schultz6addd812016-02-02 17:17:23 -07006842 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6843 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006844 ASSERT_VK_SUCCESS(err);
6845
Karl Schultz6addd812016-02-02 17:17:23 -07006846 VkShaderObj vs(m_device, bindStateVertShaderText,
6847 VK_SHADER_STAGE_VERTEX_BIT, this);
6848 VkShaderObj fs(m_device, bindStateFragShaderText,
6849 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006850 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006851 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006852 VkPipelineObj pipe(m_device);
6853 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006854 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006855 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006856 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006857 pipe.SetViewport(m_viewports);
6858 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006859 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006860
6861 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006862 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6863 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006864 // Don't care about actual data, just need to get to draw to flag error
6865 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07006866 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
6867 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006868 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06006869 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006870
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006871 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006872
Chia-I Wuf7458c52015-10-26 21:10:41 +08006873 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6874 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6875 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006876}
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06006877// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
6878TEST_F(VkLayerTest, InvalidImageLayout) {
6879 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
6880 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
6881 "images in the wrong layout when they're copied or transitioned.");
6882 // 3 in ValidateCmdBufImageLayouts
6883 // * -1 Attempt to submit cmd buf w/ deleted image
6884 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
6885 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
6886 m_errorMonitor->SetDesiredFailureMsg(
6887 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6888 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
6889
6890 ASSERT_NO_FATAL_FAILURE(InitState());
6891 // Create src & dst images to use for copy operations
6892 VkImage src_image;
6893 VkImage dst_image;
6894
6895 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6896 const int32_t tex_width = 32;
6897 const int32_t tex_height = 32;
6898
6899 VkImageCreateInfo image_create_info = {};
6900 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6901 image_create_info.pNext = NULL;
6902 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6903 image_create_info.format = tex_format;
6904 image_create_info.extent.width = tex_width;
6905 image_create_info.extent.height = tex_height;
6906 image_create_info.extent.depth = 1;
6907 image_create_info.mipLevels = 1;
6908 image_create_info.arrayLayers = 4;
6909 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6910 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6911 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6912 image_create_info.flags = 0;
6913
6914 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
6915 ASSERT_VK_SUCCESS(err);
6916 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
6917 ASSERT_VK_SUCCESS(err);
6918
6919 BeginCommandBuffer();
6920 VkImageCopy copyRegion;
6921 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6922 copyRegion.srcSubresource.mipLevel = 0;
6923 copyRegion.srcSubresource.baseArrayLayer = 0;
6924 copyRegion.srcSubresource.layerCount = 1;
6925 copyRegion.srcOffset.x = 0;
6926 copyRegion.srcOffset.y = 0;
6927 copyRegion.srcOffset.z = 0;
6928 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6929 copyRegion.dstSubresource.mipLevel = 0;
6930 copyRegion.dstSubresource.baseArrayLayer = 0;
6931 copyRegion.dstSubresource.layerCount = 1;
6932 copyRegion.dstOffset.x = 0;
6933 copyRegion.dstOffset.y = 0;
6934 copyRegion.dstOffset.z = 0;
6935 copyRegion.extent.width = 1;
6936 copyRegion.extent.height = 1;
6937 copyRegion.extent.depth = 1;
6938 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6939 m_errorMonitor->VerifyFound();
6940 // Now cause error due to src image layout changing
6941 m_errorMonitor->SetDesiredFailureMsg(
6942 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6943 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
6944 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6945 m_errorMonitor->VerifyFound();
6946 // Final src error is due to bad layout type
6947 m_errorMonitor->SetDesiredFailureMsg(
6948 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6949 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
6950 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6951 m_errorMonitor->VerifyFound();
6952 // Now verify same checks for dst
6953 m_errorMonitor->SetDesiredFailureMsg(
6954 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6955 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
6956 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6957 m_errorMonitor->VerifyFound();
6958 // Now cause error due to src image layout changing
6959 m_errorMonitor->SetDesiredFailureMsg(
6960 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6961 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
6962 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
6963 m_errorMonitor->VerifyFound();
6964 m_errorMonitor->SetDesiredFailureMsg(
6965 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6966 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
6967 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
6968 m_errorMonitor->VerifyFound();
6969 // Now cause error due to bad image layout transition in PipelineBarrier
6970 VkImageMemoryBarrier image_barrier[1] = {};
6971 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
6972 image_barrier[0].image = src_image;
6973 image_barrier[0].subresourceRange.layerCount = 2;
6974 image_barrier[0].subresourceRange.levelCount = 2;
6975 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6976 m_errorMonitor->SetDesiredFailureMsg(
6977 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6978 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
6979 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
6980 m_errorMonitor->VerifyFound();
6981
6982 // Finally some layout errors at RenderPass create time
6983 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
6984 VkAttachmentReference attach = {};
6985 // perf warning for GENERAL layout w/ non-DS input attachment
6986 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
6987 VkSubpassDescription subpass = {};
6988 subpass.inputAttachmentCount = 1;
6989 subpass.pInputAttachments = &attach;
6990 VkRenderPassCreateInfo rpci = {};
6991 rpci.subpassCount = 1;
6992 rpci.pSubpasses = &subpass;
6993 rpci.attachmentCount = 1;
6994 VkAttachmentDescription attach_desc = {};
6995 attach_desc.format = VK_FORMAT_UNDEFINED;
6996 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -06006997 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06006998 VkRenderPass rp;
6999 m_errorMonitor->SetDesiredFailureMsg(
7000 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7001 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
7002 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7003 m_errorMonitor->VerifyFound();
7004 // error w/ non-general layout
7005 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7006
7007 m_errorMonitor->SetDesiredFailureMsg(
7008 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7009 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
7010 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7011 m_errorMonitor->VerifyFound();
7012 subpass.inputAttachmentCount = 0;
7013 subpass.colorAttachmentCount = 1;
7014 subpass.pColorAttachments = &attach;
7015 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7016 // perf warning for GENERAL layout on color attachment
7017 m_errorMonitor->SetDesiredFailureMsg(
7018 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7019 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
7020 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7021 m_errorMonitor->VerifyFound();
7022 // error w/ non-color opt or GENERAL layout for color attachment
7023 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7024 m_errorMonitor->SetDesiredFailureMsg(
7025 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7026 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
7027 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7028 m_errorMonitor->VerifyFound();
7029 subpass.colorAttachmentCount = 0;
7030 subpass.pDepthStencilAttachment = &attach;
7031 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7032 // perf warning for GENERAL layout on DS attachment
7033 m_errorMonitor->SetDesiredFailureMsg(
7034 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7035 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
7036 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7037 m_errorMonitor->VerifyFound();
7038 // error w/ non-ds opt or GENERAL layout for color attachment
7039 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7040 m_errorMonitor->SetDesiredFailureMsg(
7041 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7042 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
7043 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7044 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -06007045 // For this error we need a valid renderpass so create default one
7046 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7047 attach.attachment = 0;
7048 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
7049 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
7050 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
7051 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
7052 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
7053 // Can't do a CLEAR load on READ_ONLY initialLayout
7054 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
7055 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7056 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
7057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7058 " with invalid first layout "
7059 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
7060 "ONLY_OPTIMAL");
7061 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7062 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06007063
7064 vkDestroyImage(m_device->device(), src_image, NULL);
7065 vkDestroyImage(m_device->device(), dst_image, NULL);
7066}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007067#endif // DRAW_STATE_TESTS
7068
Tobin Ehlis0788f522015-05-26 16:11:58 -06007069#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06007070#if GTEST_IS_THREADSAFE
7071struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007072 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007073 VkEvent event;
7074 bool bailout;
7075};
7076
Karl Schultz6addd812016-02-02 17:17:23 -07007077extern "C" void *AddToCommandBuffer(void *arg) {
7078 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007079
Karl Schultz6addd812016-02-02 17:17:23 -07007080 for (int i = 0; i < 10000; i++) {
7081 vkCmdSetEvent(data->commandBuffer, data->event,
7082 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007083 if (data->bailout) {
7084 break;
7085 }
7086 }
7087 return NULL;
7088}
7089
Karl Schultz6addd812016-02-02 17:17:23 -07007090TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007091 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007092
Karl Schultz6addd812016-02-02 17:17:23 -07007093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7094 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007095
Mike Stroyanaccf7692015-05-12 16:00:45 -06007096 ASSERT_NO_FATAL_FAILURE(InitState());
7097 ASSERT_NO_FATAL_FAILURE(InitViewport());
7098 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7099
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007100 // Calls AllocateCommandBuffers
7101 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06007102
7103 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007104 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007105
7106 VkEventCreateInfo event_info;
7107 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007108 VkResult err;
7109
7110 memset(&event_info, 0, sizeof(event_info));
7111 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
7112
Chia-I Wuf7458c52015-10-26 21:10:41 +08007113 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007114 ASSERT_VK_SUCCESS(err);
7115
Mike Stroyanaccf7692015-05-12 16:00:45 -06007116 err = vkResetEvent(device(), event);
7117 ASSERT_VK_SUCCESS(err);
7118
7119 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007120 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007121 data.event = event;
7122 data.bailout = false;
7123 m_errorMonitor->SetBailout(&data.bailout);
7124 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007125 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007126 // Add many entries to command buffer from this thread at the same time.
7127 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06007128
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007129 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007130 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007131
Mike Stroyan10b8cb72016-01-22 15:22:03 -07007132 m_errorMonitor->SetBailout(NULL);
7133
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007134 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007135
Chia-I Wuf7458c52015-10-26 21:10:41 +08007136 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007137}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007138#endif // GTEST_IS_THREADSAFE
7139#endif // THREADING_TESTS
7140
Chris Forbes9f7ff632015-05-25 11:13:08 +12007141#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007142TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007144 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007145
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007146 ASSERT_NO_FATAL_FAILURE(InitState());
7147 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7148
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007149 VkShaderModule module;
7150 VkShaderModuleCreateInfo moduleCreateInfo;
7151 struct icd_spv_header spv;
7152
7153 spv.magic = ICD_SPV_MAGIC;
7154 spv.version = ICD_SPV_VERSION;
7155 spv.gen_magic = 0;
7156
7157 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7158 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007159 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007160 moduleCreateInfo.codeSize = 4;
7161 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007162 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007163
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007164 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007165}
7166
Karl Schultz6addd812016-02-02 17:17:23 -07007167TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007169 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007170
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007171 ASSERT_NO_FATAL_FAILURE(InitState());
7172 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7173
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007174 VkShaderModule module;
7175 VkShaderModuleCreateInfo moduleCreateInfo;
7176 struct icd_spv_header spv;
7177
7178 spv.magic = ~ICD_SPV_MAGIC;
7179 spv.version = ICD_SPV_VERSION;
7180 spv.gen_magic = 0;
7181
7182 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7183 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007184 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007185 moduleCreateInfo.codeSize = sizeof(spv) + 10;
7186 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007187 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007188
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007189 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007190}
7191
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007192#if 0
7193// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07007194TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007195 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007196 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007197
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007198 ASSERT_NO_FATAL_FAILURE(InitState());
7199 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7200
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007201 VkShaderModule module;
7202 VkShaderModuleCreateInfo moduleCreateInfo;
7203 struct icd_spv_header spv;
7204
7205 spv.magic = ICD_SPV_MAGIC;
7206 spv.version = ~ICD_SPV_VERSION;
7207 spv.gen_magic = 0;
7208
7209 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7210 moduleCreateInfo.pNext = NULL;
7211
Karl Schultz6addd812016-02-02 17:17:23 -07007212 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007213 moduleCreateInfo.codeSize = sizeof(spv) + 10;
7214 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007215 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007216
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007217 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007218}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007219#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007220
Karl Schultz6addd812016-02-02 17:17:23 -07007221TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007223 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007224
Chris Forbes9f7ff632015-05-25 11:13:08 +12007225 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007226 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12007227
7228 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007229 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12007230 "\n"
7231 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007232 "out gl_PerVertex {\n"
7233 " vec4 gl_Position;\n"
7234 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12007235 "void main(){\n"
7236 " gl_Position = vec4(1);\n"
7237 " x = 0;\n"
7238 "}\n";
7239 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007240 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12007241 "\n"
7242 "layout(location=0) out vec4 color;\n"
7243 "void main(){\n"
7244 " color = vec4(1);\n"
7245 "}\n";
7246
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007247 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7248 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12007249
7250 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007251 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12007252 pipe.AddShader(&vs);
7253 pipe.AddShader(&fs);
7254
Chris Forbes9f7ff632015-05-25 11:13:08 +12007255 VkDescriptorSetObj descriptorSet(m_device);
7256 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007257 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12007258
Tony Barbour5781e8f2015-08-04 16:23:11 -06007259 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12007260
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007261 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12007262}
Chris Forbes9f7ff632015-05-25 11:13:08 +12007263
Karl Schultz6addd812016-02-02 17:17:23 -07007264TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007266 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007267
Chris Forbes59cb88d2015-05-25 11:13:13 +12007268 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007269 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12007270
7271 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007272 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12007273 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007274 "out gl_PerVertex {\n"
7275 " vec4 gl_Position;\n"
7276 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12007277 "void main(){\n"
7278 " gl_Position = vec4(1);\n"
7279 "}\n";
7280 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007281 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12007282 "\n"
7283 "layout(location=0) in float x;\n"
7284 "layout(location=0) out vec4 color;\n"
7285 "void main(){\n"
7286 " color = vec4(x);\n"
7287 "}\n";
7288
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007289 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7290 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12007291
7292 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007293 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12007294 pipe.AddShader(&vs);
7295 pipe.AddShader(&fs);
7296
Chris Forbes59cb88d2015-05-25 11:13:13 +12007297 VkDescriptorSetObj descriptorSet(m_device);
7298 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007299 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12007300
Tony Barbour5781e8f2015-08-04 16:23:11 -06007301 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12007302
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007303 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12007304}
7305
Karl Schultz6addd812016-02-02 17:17:23 -07007306TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13007307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007308 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13007309
7310 ASSERT_NO_FATAL_FAILURE(InitState());
7311 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7312
7313 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007314 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007315 "\n"
7316 "out gl_PerVertex {\n"
7317 " vec4 gl_Position;\n"
7318 "};\n"
7319 "void main(){\n"
7320 " gl_Position = vec4(1);\n"
7321 "}\n";
7322 char const *fsSource =
7323 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007324 "\n"
7325 "in block { layout(location=0) float x; } ins;\n"
7326 "layout(location=0) out vec4 color;\n"
7327 "void main(){\n"
7328 " color = vec4(ins.x);\n"
7329 "}\n";
7330
7331 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7332 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7333
7334 VkPipelineObj pipe(m_device);
7335 pipe.AddColorAttachment();
7336 pipe.AddShader(&vs);
7337 pipe.AddShader(&fs);
7338
7339 VkDescriptorSetObj descriptorSet(m_device);
7340 descriptorSet.AppendDummy();
7341 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7342
7343 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7344
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007345 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13007346}
7347
Karl Schultz6addd812016-02-02 17:17:23 -07007348TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13007349 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13007350 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07007351 "output arr[2] of float32' vs 'ptr to "
7352 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13007353
7354 ASSERT_NO_FATAL_FAILURE(InitState());
7355 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7356
7357 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007358 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13007359 "\n"
7360 "layout(location=0) out float x[2];\n"
7361 "out gl_PerVertex {\n"
7362 " vec4 gl_Position;\n"
7363 "};\n"
7364 "void main(){\n"
7365 " x[0] = 0; x[1] = 0;\n"
7366 " gl_Position = vec4(1);\n"
7367 "}\n";
7368 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007369 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13007370 "\n"
7371 "layout(location=0) in float x[3];\n"
7372 "layout(location=0) out vec4 color;\n"
7373 "void main(){\n"
7374 " color = vec4(x[0] + x[1] + x[2]);\n"
7375 "}\n";
7376
7377 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7378 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7379
7380 VkPipelineObj pipe(m_device);
7381 pipe.AddColorAttachment();
7382 pipe.AddShader(&vs);
7383 pipe.AddShader(&fs);
7384
7385 VkDescriptorSetObj descriptorSet(m_device);
7386 descriptorSet.AppendDummy();
7387 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7388
7389 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7390
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007391 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13007392}
7393
Karl Schultz6addd812016-02-02 17:17:23 -07007394TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007396 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007397
Chris Forbesb56af562015-05-25 11:13:17 +12007398 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007399 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12007400
7401 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007402 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007403 "\n"
7404 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007405 "out gl_PerVertex {\n"
7406 " vec4 gl_Position;\n"
7407 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007408 "void main(){\n"
7409 " x = 0;\n"
7410 " gl_Position = vec4(1);\n"
7411 "}\n";
7412 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007413 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007414 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007415 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12007416 "layout(location=0) out vec4 color;\n"
7417 "void main(){\n"
7418 " color = vec4(x);\n"
7419 "}\n";
7420
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007421 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7422 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12007423
7424 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007425 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12007426 pipe.AddShader(&vs);
7427 pipe.AddShader(&fs);
7428
Chris Forbesb56af562015-05-25 11:13:17 +12007429 VkDescriptorSetObj descriptorSet(m_device);
7430 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007431 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12007432
Tony Barbour5781e8f2015-08-04 16:23:11 -06007433 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12007434
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007435 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12007436}
7437
Karl Schultz6addd812016-02-02 17:17:23 -07007438TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13007439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007440 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13007441
7442 ASSERT_NO_FATAL_FAILURE(InitState());
7443 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7444
7445 char const *vsSource =
7446 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007447 "\n"
7448 "out block { layout(location=0) int x; } outs;\n"
7449 "out gl_PerVertex {\n"
7450 " vec4 gl_Position;\n"
7451 "};\n"
7452 "void main(){\n"
7453 " outs.x = 0;\n"
7454 " gl_Position = vec4(1);\n"
7455 "}\n";
7456 char const *fsSource =
7457 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007458 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007459 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13007460 "layout(location=0) out vec4 color;\n"
7461 "void main(){\n"
7462 " color = vec4(ins.x);\n"
7463 "}\n";
7464
7465 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7466 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7467
7468 VkPipelineObj pipe(m_device);
7469 pipe.AddColorAttachment();
7470 pipe.AddShader(&vs);
7471 pipe.AddShader(&fs);
7472
7473 VkDescriptorSetObj descriptorSet(m_device);
7474 descriptorSet.AppendDummy();
7475 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7476
7477 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7478
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007479 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13007480}
7481
7482TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
7483 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7484 "location 0.0 which is not written by vertex shader");
7485
7486 ASSERT_NO_FATAL_FAILURE(InitState());
7487 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7488
7489 char const *vsSource =
7490 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007491 "\n"
7492 "out block { layout(location=1) float x; } outs;\n"
7493 "out gl_PerVertex {\n"
7494 " vec4 gl_Position;\n"
7495 "};\n"
7496 "void main(){\n"
7497 " outs.x = 0;\n"
7498 " gl_Position = vec4(1);\n"
7499 "}\n";
7500 char const *fsSource =
7501 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007502 "\n"
7503 "in block { layout(location=0) float x; } ins;\n"
7504 "layout(location=0) out vec4 color;\n"
7505 "void main(){\n"
7506 " color = vec4(ins.x);\n"
7507 "}\n";
7508
7509 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7510 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7511
7512 VkPipelineObj pipe(m_device);
7513 pipe.AddColorAttachment();
7514 pipe.AddShader(&vs);
7515 pipe.AddShader(&fs);
7516
7517 VkDescriptorSetObj descriptorSet(m_device);
7518 descriptorSet.AppendDummy();
7519 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7520
7521 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7522
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007523 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13007524}
7525
7526TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
7527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7528 "location 0.1 which is not written by vertex shader");
7529
7530 ASSERT_NO_FATAL_FAILURE(InitState());
7531 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7532
7533 char const *vsSource =
7534 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007535 "\n"
7536 "out block { layout(location=0, component=0) float x; } outs;\n"
7537 "out gl_PerVertex {\n"
7538 " vec4 gl_Position;\n"
7539 "};\n"
7540 "void main(){\n"
7541 " outs.x = 0;\n"
7542 " gl_Position = vec4(1);\n"
7543 "}\n";
7544 char const *fsSource =
7545 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007546 "\n"
7547 "in block { layout(location=0, component=1) float x; } ins;\n"
7548 "layout(location=0) out vec4 color;\n"
7549 "void main(){\n"
7550 " color = vec4(ins.x);\n"
7551 "}\n";
7552
7553 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7554 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7555
7556 VkPipelineObj pipe(m_device);
7557 pipe.AddColorAttachment();
7558 pipe.AddShader(&vs);
7559 pipe.AddShader(&fs);
7560
7561 VkDescriptorSetObj descriptorSet(m_device);
7562 descriptorSet.AppendDummy();
7563 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7564
7565 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7566
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007567 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13007568}
7569
Karl Schultz6addd812016-02-02 17:17:23 -07007570TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007572 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007573
Chris Forbesde136e02015-05-25 11:13:28 +12007574 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007575 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12007576
7577 VkVertexInputBindingDescription input_binding;
7578 memset(&input_binding, 0, sizeof(input_binding));
7579
7580 VkVertexInputAttributeDescription input_attrib;
7581 memset(&input_attrib, 0, sizeof(input_attrib));
7582 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7583
7584 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007585 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007586 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007587 "out gl_PerVertex {\n"
7588 " vec4 gl_Position;\n"
7589 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007590 "void main(){\n"
7591 " gl_Position = vec4(1);\n"
7592 "}\n";
7593 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007594 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007595 "\n"
7596 "layout(location=0) out vec4 color;\n"
7597 "void main(){\n"
7598 " color = vec4(1);\n"
7599 "}\n";
7600
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007601 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7602 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12007603
7604 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007605 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12007606 pipe.AddShader(&vs);
7607 pipe.AddShader(&fs);
7608
7609 pipe.AddVertexInputBindings(&input_binding, 1);
7610 pipe.AddVertexInputAttribs(&input_attrib, 1);
7611
Chris Forbesde136e02015-05-25 11:13:28 +12007612 VkDescriptorSetObj descriptorSet(m_device);
7613 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007614 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12007615
Tony Barbour5781e8f2015-08-04 16:23:11 -06007616 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12007617
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007618 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12007619}
7620
Karl Schultz6addd812016-02-02 17:17:23 -07007621TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007622 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007623 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13007624
7625 ASSERT_NO_FATAL_FAILURE(InitState());
7626 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7627
7628 VkVertexInputBindingDescription input_binding;
7629 memset(&input_binding, 0, sizeof(input_binding));
7630
7631 VkVertexInputAttributeDescription input_attrib;
7632 memset(&input_attrib, 0, sizeof(input_attrib));
7633 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7634
7635 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007636 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007637 "\n"
7638 "layout(location=1) in float x;\n"
7639 "out gl_PerVertex {\n"
7640 " vec4 gl_Position;\n"
7641 "};\n"
7642 "void main(){\n"
7643 " gl_Position = vec4(x);\n"
7644 "}\n";
7645 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007646 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007647 "\n"
7648 "layout(location=0) out vec4 color;\n"
7649 "void main(){\n"
7650 " color = vec4(1);\n"
7651 "}\n";
7652
7653 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7654 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7655
7656 VkPipelineObj pipe(m_device);
7657 pipe.AddColorAttachment();
7658 pipe.AddShader(&vs);
7659 pipe.AddShader(&fs);
7660
7661 pipe.AddVertexInputBindings(&input_binding, 1);
7662 pipe.AddVertexInputAttribs(&input_attrib, 1);
7663
7664 VkDescriptorSetObj descriptorSet(m_device);
7665 descriptorSet.AppendDummy();
7666 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7667
7668 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7669
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007670 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13007671}
7672
Karl Schultz6addd812016-02-02 17:17:23 -07007673TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
7674 m_errorMonitor->SetDesiredFailureMsg(
7675 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007676 "VS consumes input at location 0 but not provided");
7677
Chris Forbes62e8e502015-05-25 11:13:29 +12007678 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007679 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12007680
7681 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007682 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007683 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007684 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07007685 "out gl_PerVertex {\n"
7686 " vec4 gl_Position;\n"
7687 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007688 "void main(){\n"
7689 " gl_Position = x;\n"
7690 "}\n";
7691 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007692 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007693 "\n"
7694 "layout(location=0) out vec4 color;\n"
7695 "void main(){\n"
7696 " color = vec4(1);\n"
7697 "}\n";
7698
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007699 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7700 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12007701
7702 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007703 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12007704 pipe.AddShader(&vs);
7705 pipe.AddShader(&fs);
7706
Chris Forbes62e8e502015-05-25 11:13:29 +12007707 VkDescriptorSetObj descriptorSet(m_device);
7708 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007709 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12007710
Tony Barbour5781e8f2015-08-04 16:23:11 -06007711 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12007712
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007713 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12007714}
7715
Karl Schultz6addd812016-02-02 17:17:23 -07007716TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
7717 m_errorMonitor->SetDesiredFailureMsg(
7718 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007719 "location 0 does not match VS input type");
7720
Chris Forbesc97d98e2015-05-25 11:13:31 +12007721 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007722 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12007723
7724 VkVertexInputBindingDescription input_binding;
7725 memset(&input_binding, 0, sizeof(input_binding));
7726
7727 VkVertexInputAttributeDescription input_attrib;
7728 memset(&input_attrib, 0, sizeof(input_attrib));
7729 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7730
7731 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007732 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007733 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007734 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007735 "out gl_PerVertex {\n"
7736 " vec4 gl_Position;\n"
7737 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007738 "void main(){\n"
7739 " gl_Position = vec4(x);\n"
7740 "}\n";
7741 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007742 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007743 "\n"
7744 "layout(location=0) out vec4 color;\n"
7745 "void main(){\n"
7746 " color = vec4(1);\n"
7747 "}\n";
7748
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007749 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7750 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12007751
7752 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007753 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12007754 pipe.AddShader(&vs);
7755 pipe.AddShader(&fs);
7756
7757 pipe.AddVertexInputBindings(&input_binding, 1);
7758 pipe.AddVertexInputAttribs(&input_attrib, 1);
7759
Chris Forbesc97d98e2015-05-25 11:13:31 +12007760 VkDescriptorSetObj descriptorSet(m_device);
7761 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007762 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12007763
Tony Barbour5781e8f2015-08-04 16:23:11 -06007764 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12007765
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007766 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12007767}
7768
Chris Forbesc68b43c2016-04-06 11:18:47 +12007769TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
7770 m_errorMonitor->SetDesiredFailureMsg(
7771 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7772 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
7773
7774 ASSERT_NO_FATAL_FAILURE(InitState());
7775 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7776
7777 char const *vsSource =
7778 "#version 450\n"
7779 "\n"
7780 "out gl_PerVertex {\n"
7781 " vec4 gl_Position;\n"
7782 "};\n"
7783 "void main(){\n"
7784 " gl_Position = vec4(1);\n"
7785 "}\n";
7786 char const *fsSource =
7787 "#version 450\n"
7788 "\n"
7789 "layout(location=0) out vec4 color;\n"
7790 "void main(){\n"
7791 " color = vec4(1);\n"
7792 "}\n";
7793
7794 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7795 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7796
7797 VkPipelineObj pipe(m_device);
7798 pipe.AddColorAttachment();
7799 pipe.AddShader(&vs);
7800 pipe.AddShader(&vs);
7801 pipe.AddShader(&fs);
7802
7803 VkDescriptorSetObj descriptorSet(m_device);
7804 descriptorSet.AppendDummy();
7805 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7806
7807 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7808
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007809 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12007810}
7811
Karl Schultz6addd812016-02-02 17:17:23 -07007812TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007813 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007814
7815 ASSERT_NO_FATAL_FAILURE(InitState());
7816 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7817
7818 VkVertexInputBindingDescription input_binding;
7819 memset(&input_binding, 0, sizeof(input_binding));
7820
7821 VkVertexInputAttributeDescription input_attribs[2];
7822 memset(input_attribs, 0, sizeof(input_attribs));
7823
7824 for (int i = 0; i < 2; i++) {
7825 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7826 input_attribs[i].location = i;
7827 }
7828
7829 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007830 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007831 "\n"
7832 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007833 "out gl_PerVertex {\n"
7834 " vec4 gl_Position;\n"
7835 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007836 "void main(){\n"
7837 " gl_Position = x[0] + x[1];\n"
7838 "}\n";
7839 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007840 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007841 "\n"
7842 "layout(location=0) out vec4 color;\n"
7843 "void main(){\n"
7844 " color = vec4(1);\n"
7845 "}\n";
7846
7847 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7848 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7849
7850 VkPipelineObj pipe(m_device);
7851 pipe.AddColorAttachment();
7852 pipe.AddShader(&vs);
7853 pipe.AddShader(&fs);
7854
7855 pipe.AddVertexInputBindings(&input_binding, 1);
7856 pipe.AddVertexInputAttribs(input_attribs, 2);
7857
7858 VkDescriptorSetObj descriptorSet(m_device);
7859 descriptorSet.AppendDummy();
7860 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7861
7862 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7863
7864 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007865 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007866}
7867
Chris Forbes2682b242015-11-24 11:13:14 +13007868TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
7869{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007870 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007871
7872 ASSERT_NO_FATAL_FAILURE(InitState());
7873 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7874
7875 VkVertexInputBindingDescription input_binding;
7876 memset(&input_binding, 0, sizeof(input_binding));
7877
7878 VkVertexInputAttributeDescription input_attribs[2];
7879 memset(input_attribs, 0, sizeof(input_attribs));
7880
7881 for (int i = 0; i < 2; i++) {
7882 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7883 input_attribs[i].location = i;
7884 }
7885
7886 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007887 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007888 "\n"
7889 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07007890 "out gl_PerVertex {\n"
7891 " vec4 gl_Position;\n"
7892 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007893 "void main(){\n"
7894 " gl_Position = x[0] + x[1];\n"
7895 "}\n";
7896 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007897 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007898 "\n"
7899 "layout(location=0) out vec4 color;\n"
7900 "void main(){\n"
7901 " color = vec4(1);\n"
7902 "}\n";
7903
7904 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7905 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7906
7907 VkPipelineObj pipe(m_device);
7908 pipe.AddColorAttachment();
7909 pipe.AddShader(&vs);
7910 pipe.AddShader(&fs);
7911
7912 pipe.AddVertexInputBindings(&input_binding, 1);
7913 pipe.AddVertexInputAttribs(input_attribs, 2);
7914
7915 VkDescriptorSetObj descriptorSet(m_device);
7916 descriptorSet.AppendDummy();
7917 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7918
7919 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7920
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007921 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007922}
Chris Forbes2682b242015-11-24 11:13:14 +13007923
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007924TEST_F(VkLayerTest, CreatePipelineSimplePositive)
7925{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007926 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007927
7928 ASSERT_NO_FATAL_FAILURE(InitState());
7929 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7930
7931 char const *vsSource =
7932 "#version 450\n"
7933 "out gl_PerVertex {\n"
7934 " vec4 gl_Position;\n"
7935 "};\n"
7936 "void main(){\n"
7937 " gl_Position = vec4(0);\n"
7938 "}\n";
7939 char const *fsSource =
7940 "#version 450\n"
7941 "\n"
7942 "layout(location=0) out vec4 color;\n"
7943 "void main(){\n"
7944 " color = vec4(1);\n"
7945 "}\n";
7946
7947 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7948 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7949
7950 VkPipelineObj pipe(m_device);
7951 pipe.AddColorAttachment();
7952 pipe.AddShader(&vs);
7953 pipe.AddShader(&fs);
7954
7955 VkDescriptorSetObj descriptorSet(m_device);
7956 descriptorSet.AppendDummy();
7957 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7958
7959 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7960
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007961 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007962}
7963
Chris Forbes912c9192016-04-05 17:50:35 +12007964TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
7965{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007966 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12007967
7968 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
7969
7970 ASSERT_NO_FATAL_FAILURE(InitState());
7971 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7972
7973 char const *vsSource =
7974 "#version 450\n"
7975 "out gl_PerVertex {\n"
7976 " vec4 gl_Position;\n"
7977 "};\n"
7978 "layout(location=0) out vec3 x;\n"
7979 "layout(location=1) out ivec3 y;\n"
7980 "layout(location=2) out vec3 z;\n"
7981 "void main(){\n"
7982 " gl_Position = vec4(0);\n"
7983 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
7984 "}\n";
7985 char const *fsSource =
7986 "#version 450\n"
7987 "\n"
7988 "layout(location=0) out vec4 color;\n"
7989 "layout(location=0) in float x;\n"
7990 "layout(location=1) flat in int y;\n"
7991 "layout(location=2) in vec2 z;\n"
7992 "void main(){\n"
7993 " color = vec4(1 + x + y + z.x);\n"
7994 "}\n";
7995
7996 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7997 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7998
7999 VkPipelineObj pipe(m_device);
8000 pipe.AddColorAttachment();
8001 pipe.AddShader(&vs);
8002 pipe.AddShader(&fs);
8003
8004 VkDescriptorSetObj descriptorSet(m_device);
8005 descriptorSet.AppendDummy();
8006 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8007
8008 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8009
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008010 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12008011}
8012
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008013TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
8014{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008015 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008016
8017 ASSERT_NO_FATAL_FAILURE(InitState());
8018 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8019
Chris Forbesc1e852d2016-04-04 19:26:42 +12008020 if (!m_device->phy().features().tessellationShader) {
8021 printf("Device does not support tessellation shaders; skipped.\n");
8022 return;
8023 }
8024
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008025 char const *vsSource =
8026 "#version 450\n"
8027 "void main(){}\n";
8028 char const *tcsSource =
8029 "#version 450\n"
8030 "layout(location=0) out int x[];\n"
8031 "layout(vertices=3) out;\n"
8032 "void main(){\n"
8033 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
8034 " gl_TessLevelInner[0] = 1;\n"
8035 " x[gl_InvocationID] = gl_InvocationID;\n"
8036 "}\n";
8037 char const *tesSource =
8038 "#version 450\n"
8039 "layout(triangles, equal_spacing, cw) in;\n"
8040 "layout(location=0) in int x[];\n"
8041 "out gl_PerVertex { vec4 gl_Position; };\n"
8042 "void main(){\n"
8043 " gl_Position.xyz = gl_TessCoord;\n"
8044 " gl_Position.w = x[0] + x[1] + x[2];\n"
8045 "}\n";
8046 char const *fsSource =
8047 "#version 450\n"
8048 "layout(location=0) out vec4 color;\n"
8049 "void main(){\n"
8050 " color = vec4(1);\n"
8051 "}\n";
8052
8053 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8054 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
8055 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
8056 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8057
8058 VkPipelineInputAssemblyStateCreateInfo iasci{
8059 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
8060 nullptr,
8061 0,
8062 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
8063 VK_FALSE};
8064
Chris Forbesb4cacb62016-04-04 19:15:00 +12008065 VkPipelineTessellationStateCreateInfo tsci{
8066 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
8067 nullptr,
8068 0,
8069 3};
8070
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008071 VkPipelineObj pipe(m_device);
8072 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12008073 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008074 pipe.AddColorAttachment();
8075 pipe.AddShader(&vs);
8076 pipe.AddShader(&tcs);
8077 pipe.AddShader(&tes);
8078 pipe.AddShader(&fs);
8079
8080 VkDescriptorSetObj descriptorSet(m_device);
8081 descriptorSet.AppendDummy();
8082 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8083
8084 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8085
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008086 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008087}
8088
Chris Forbesa0ab8152016-04-20 13:34:27 +12008089TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
8090{
8091 m_errorMonitor->ExpectSuccess();
8092
8093 ASSERT_NO_FATAL_FAILURE(InitState());
8094 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8095
8096 if (!m_device->phy().features().geometryShader) {
8097 printf("Device does not support geometry shaders; skipped.\n");
8098 return;
8099 }
8100
8101 char const *vsSource =
8102 "#version 450\n"
8103 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
8104 "void main(){\n"
8105 " vs_out.x = vec4(1);\n"
8106 "}\n";
8107 char const *gsSource =
8108 "#version 450\n"
8109 "layout(triangles) in;\n"
8110 "layout(triangle_strip, max_vertices=3) out;\n"
8111 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
8112 "out gl_PerVertex { vec4 gl_Position; };\n"
8113 "void main() {\n"
8114 " gl_Position = gs_in[0].x;\n"
8115 " EmitVertex();\n"
8116 "}\n";
8117 char const *fsSource =
8118 "#version 450\n"
8119 "layout(location=0) out vec4 color;\n"
8120 "void main(){\n"
8121 " color = vec4(1);\n"
8122 "}\n";
8123
8124 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8125 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
8126 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8127
8128 VkPipelineObj pipe(m_device);
8129 pipe.AddColorAttachment();
8130 pipe.AddShader(&vs);
8131 pipe.AddShader(&gs);
8132 pipe.AddShader(&fs);
8133
8134 VkDescriptorSetObj descriptorSet(m_device);
8135 descriptorSet.AppendDummy();
8136 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8137
8138 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8139
8140 m_errorMonitor->VerifyNotFound();
8141}
8142
Chris Forbesa0193bc2016-04-04 19:19:47 +12008143TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
8144{
8145 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8146 "is per-vertex in tessellation control shader stage "
8147 "but per-patch in tessellation evaluation shader stage");
8148
8149 ASSERT_NO_FATAL_FAILURE(InitState());
8150 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8151
Chris Forbesc1e852d2016-04-04 19:26:42 +12008152 if (!m_device->phy().features().tessellationShader) {
8153 printf("Device does not support tessellation shaders; skipped.\n");
8154 return;
8155 }
8156
Chris Forbesa0193bc2016-04-04 19:19:47 +12008157 char const *vsSource =
8158 "#version 450\n"
8159 "void main(){}\n";
8160 char const *tcsSource =
8161 "#version 450\n"
8162 "layout(location=0) out int x[];\n"
8163 "layout(vertices=3) out;\n"
8164 "void main(){\n"
8165 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
8166 " gl_TessLevelInner[0] = 1;\n"
8167 " x[gl_InvocationID] = gl_InvocationID;\n"
8168 "}\n";
8169 char const *tesSource =
8170 "#version 450\n"
8171 "layout(triangles, equal_spacing, cw) in;\n"
8172 "layout(location=0) patch in int x;\n"
8173 "out gl_PerVertex { vec4 gl_Position; };\n"
8174 "void main(){\n"
8175 " gl_Position.xyz = gl_TessCoord;\n"
8176 " gl_Position.w = x;\n"
8177 "}\n";
8178 char const *fsSource =
8179 "#version 450\n"
8180 "layout(location=0) out vec4 color;\n"
8181 "void main(){\n"
8182 " color = vec4(1);\n"
8183 "}\n";
8184
8185 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8186 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
8187 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
8188 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8189
8190 VkPipelineInputAssemblyStateCreateInfo iasci{
8191 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
8192 nullptr,
8193 0,
8194 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
8195 VK_FALSE};
8196
8197 VkPipelineTessellationStateCreateInfo tsci{
8198 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
8199 nullptr,
8200 0,
8201 3};
8202
8203 VkPipelineObj pipe(m_device);
8204 pipe.SetInputAssembly(&iasci);
8205 pipe.SetTessellation(&tsci);
8206 pipe.AddColorAttachment();
8207 pipe.AddShader(&vs);
8208 pipe.AddShader(&tcs);
8209 pipe.AddShader(&tes);
8210 pipe.AddShader(&fs);
8211
8212 VkDescriptorSetObj descriptorSet(m_device);
8213 descriptorSet.AppendDummy();
8214 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8215
8216 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8217
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008218 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12008219}
8220
Karl Schultz6addd812016-02-02 17:17:23 -07008221TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
8222 m_errorMonitor->SetDesiredFailureMsg(
8223 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008224 "Duplicate vertex input binding descriptions for binding 0");
8225
Chris Forbes280ba2c2015-06-12 11:16:41 +12008226 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008227 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12008228
8229 /* Two binding descriptions for binding 0 */
8230 VkVertexInputBindingDescription input_bindings[2];
8231 memset(input_bindings, 0, sizeof(input_bindings));
8232
8233 VkVertexInputAttributeDescription input_attrib;
8234 memset(&input_attrib, 0, sizeof(input_attrib));
8235 input_attrib.format = VK_FORMAT_R32_SFLOAT;
8236
8237 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008238 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12008239 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008240 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07008241 "out gl_PerVertex {\n"
8242 " vec4 gl_Position;\n"
8243 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12008244 "void main(){\n"
8245 " gl_Position = vec4(x);\n"
8246 "}\n";
8247 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008248 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12008249 "\n"
8250 "layout(location=0) out vec4 color;\n"
8251 "void main(){\n"
8252 " color = vec4(1);\n"
8253 "}\n";
8254
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008255 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8256 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12008257
8258 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008259 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12008260 pipe.AddShader(&vs);
8261 pipe.AddShader(&fs);
8262
8263 pipe.AddVertexInputBindings(input_bindings, 2);
8264 pipe.AddVertexInputAttribs(&input_attrib, 1);
8265
Chris Forbes280ba2c2015-06-12 11:16:41 +12008266 VkDescriptorSetObj descriptorSet(m_device);
8267 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008268 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12008269
Tony Barbour5781e8f2015-08-04 16:23:11 -06008270 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12008271
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008272 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12008273}
Chris Forbes8f68b562015-05-25 11:13:32 +12008274
Chris Forbes35efec72016-04-21 14:32:08 +12008275TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
8276 m_errorMonitor->ExpectSuccess();
8277
8278 ASSERT_NO_FATAL_FAILURE(InitState());
8279 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8280
8281 if (!m_device->phy().features().tessellationShader) {
8282 printf("Device does not support 64bit vertex attributes; skipped.\n");
8283 return;
8284 }
8285
8286 VkVertexInputBindingDescription input_bindings[1];
8287 memset(input_bindings, 0, sizeof(input_bindings));
8288
8289 VkVertexInputAttributeDescription input_attribs[4];
8290 memset(input_attribs, 0, sizeof(input_attribs));
8291 input_attribs[0].location = 0;
8292 input_attribs[0].offset = 0;
8293 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8294 input_attribs[1].location = 2;
8295 input_attribs[1].offset = 32;
8296 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8297 input_attribs[2].location = 4;
8298 input_attribs[2].offset = 64;
8299 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8300 input_attribs[3].location = 6;
8301 input_attribs[3].offset = 96;
8302 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8303
8304 char const *vsSource =
8305 "#version 450\n"
8306 "\n"
8307 "layout(location=0) in dmat4 x;\n"
8308 "out gl_PerVertex {\n"
8309 " vec4 gl_Position;\n"
8310 "};\n"
8311 "void main(){\n"
8312 " gl_Position = vec4(x[0][0]);\n"
8313 "}\n";
8314 char const *fsSource =
8315 "#version 450\n"
8316 "\n"
8317 "layout(location=0) out vec4 color;\n"
8318 "void main(){\n"
8319 " color = vec4(1);\n"
8320 "}\n";
8321
8322 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8323 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8324
8325 VkPipelineObj pipe(m_device);
8326 pipe.AddColorAttachment();
8327 pipe.AddShader(&vs);
8328 pipe.AddShader(&fs);
8329
8330 pipe.AddVertexInputBindings(input_bindings, 1);
8331 pipe.AddVertexInputAttribs(input_attribs, 4);
8332
8333 VkDescriptorSetObj descriptorSet(m_device);
8334 descriptorSet.AppendDummy();
8335 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8336
8337 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8338
8339 m_errorMonitor->VerifyNotFound();
8340}
8341
Karl Schultz6addd812016-02-02 17:17:23 -07008342TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008343 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008344 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008345
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008346 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008347
8348 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008349 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008350 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008351 "out gl_PerVertex {\n"
8352 " vec4 gl_Position;\n"
8353 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008354 "void main(){\n"
8355 " gl_Position = vec4(1);\n"
8356 "}\n";
8357 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008358 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008359 "\n"
8360 "void main(){\n"
8361 "}\n";
8362
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008363 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8364 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008365
8366 VkPipelineObj pipe(m_device);
8367 pipe.AddShader(&vs);
8368 pipe.AddShader(&fs);
8369
Chia-I Wu08accc62015-07-07 11:50:03 +08008370 /* set up CB 0, not written */
8371 pipe.AddColorAttachment();
8372 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008373
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008374 VkDescriptorSetObj descriptorSet(m_device);
8375 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008376 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008377
Tony Barbour5781e8f2015-08-04 16:23:11 -06008378 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008379
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008380 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008381}
8382
Karl Schultz6addd812016-02-02 17:17:23 -07008383TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07008384 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008385 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008386 "FS writes to output location 1 with no matching attachment");
8387
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008388 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008389
8390 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008391 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008392 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008393 "out gl_PerVertex {\n"
8394 " vec4 gl_Position;\n"
8395 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008396 "void main(){\n"
8397 " gl_Position = vec4(1);\n"
8398 "}\n";
8399 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008400 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008401 "\n"
8402 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008403 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008404 "void main(){\n"
8405 " x = vec4(1);\n"
8406 " y = vec4(1);\n"
8407 "}\n";
8408
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008409 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8410 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008411
8412 VkPipelineObj pipe(m_device);
8413 pipe.AddShader(&vs);
8414 pipe.AddShader(&fs);
8415
Chia-I Wu08accc62015-07-07 11:50:03 +08008416 /* set up CB 0, not written */
8417 pipe.AddColorAttachment();
8418 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008419 /* FS writes CB 1, but we don't configure it */
8420
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008421 VkDescriptorSetObj descriptorSet(m_device);
8422 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008423 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008424
Tony Barbour5781e8f2015-08-04 16:23:11 -06008425 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008426
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008427 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008428}
8429
Karl Schultz6addd812016-02-02 17:17:23 -07008430TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008431 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008432 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008433
Chris Forbesa36d69e2015-05-25 11:13:44 +12008434 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008435
8436 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008437 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008438 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008439 "out gl_PerVertex {\n"
8440 " vec4 gl_Position;\n"
8441 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008442 "void main(){\n"
8443 " gl_Position = vec4(1);\n"
8444 "}\n";
8445 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008446 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008447 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008448 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12008449 "void main(){\n"
8450 " x = ivec4(1);\n"
8451 "}\n";
8452
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008453 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8454 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12008455
8456 VkPipelineObj pipe(m_device);
8457 pipe.AddShader(&vs);
8458 pipe.AddShader(&fs);
8459
Chia-I Wu08accc62015-07-07 11:50:03 +08008460 /* set up CB 0; type is UNORM by default */
8461 pipe.AddColorAttachment();
8462 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008463
Chris Forbesa36d69e2015-05-25 11:13:44 +12008464 VkDescriptorSetObj descriptorSet(m_device);
8465 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008466 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12008467
Tony Barbour5781e8f2015-08-04 16:23:11 -06008468 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008469
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008470 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12008471}
Chris Forbes7b1b8932015-06-05 14:43:36 +12008472
Karl Schultz6addd812016-02-02 17:17:23 -07008473TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008475 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008476
Chris Forbes556c76c2015-08-14 12:04:59 +12008477 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12008478
8479 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008480 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008481 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008482 "out gl_PerVertex {\n"
8483 " vec4 gl_Position;\n"
8484 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008485 "void main(){\n"
8486 " gl_Position = vec4(1);\n"
8487 "}\n";
8488 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008489 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008490 "\n"
8491 "layout(location=0) out vec4 x;\n"
8492 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
8493 "void main(){\n"
8494 " x = vec4(bar.y);\n"
8495 "}\n";
8496
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008497 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8498 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12008499
Chris Forbes556c76c2015-08-14 12:04:59 +12008500 VkPipelineObj pipe(m_device);
8501 pipe.AddShader(&vs);
8502 pipe.AddShader(&fs);
8503
8504 /* set up CB 0; type is UNORM by default */
8505 pipe.AddColorAttachment();
8506 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8507
8508 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008509 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12008510
8511 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8512
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008513 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12008514}
8515
Chris Forbes5c59e902016-02-26 16:56:09 +13008516TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
8517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8518 "not declared in layout");
8519
8520 ASSERT_NO_FATAL_FAILURE(InitState());
8521
8522 char const *vsSource =
8523 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13008524 "\n"
8525 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
8526 "out gl_PerVertex {\n"
8527 " vec4 gl_Position;\n"
8528 "};\n"
8529 "void main(){\n"
8530 " gl_Position = vec4(consts.x);\n"
8531 "}\n";
8532 char const *fsSource =
8533 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13008534 "\n"
8535 "layout(location=0) out vec4 x;\n"
8536 "void main(){\n"
8537 " x = vec4(1);\n"
8538 "}\n";
8539
8540 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8541 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8542
8543 VkPipelineObj pipe(m_device);
8544 pipe.AddShader(&vs);
8545 pipe.AddShader(&fs);
8546
8547 /* set up CB 0; type is UNORM by default */
8548 pipe.AddColorAttachment();
8549 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8550
8551 VkDescriptorSetObj descriptorSet(m_device);
8552 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8553
8554 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8555
8556 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008557 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13008558}
8559
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008560#endif // SHADER_CHECKER_TESTS
8561
8562#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06008563TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07008564 m_errorMonitor->SetDesiredFailureMsg(
8565 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008566 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008567
8568 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008569
8570 // Create an image
8571 VkImage image;
8572
Karl Schultz6addd812016-02-02 17:17:23 -07008573 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8574 const int32_t tex_width = 32;
8575 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008576
8577 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008578 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8579 image_create_info.pNext = NULL;
8580 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8581 image_create_info.format = tex_format;
8582 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008583 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07008584 image_create_info.extent.depth = 1;
8585 image_create_info.mipLevels = 1;
8586 image_create_info.arrayLayers = 1;
8587 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8588 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8589 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8590 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008591
8592 // Introduce error by sending down a bogus width extent
8593 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008594 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008595
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008596 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008597}
8598
Mark Youngc48c4c12016-04-11 14:26:49 -06008599TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
8600 m_errorMonitor->SetDesiredFailureMsg(
8601 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8602 "CreateImage extents is 0 for at least one required dimension");
8603
8604 ASSERT_NO_FATAL_FAILURE(InitState());
8605
8606 // Create an image
8607 VkImage image;
8608
8609 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8610 const int32_t tex_width = 32;
8611 const int32_t tex_height = 32;
8612
8613 VkImageCreateInfo image_create_info = {};
8614 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8615 image_create_info.pNext = NULL;
8616 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8617 image_create_info.format = tex_format;
8618 image_create_info.extent.width = tex_width;
8619 image_create_info.extent.height = tex_height;
8620 image_create_info.extent.depth = 1;
8621 image_create_info.mipLevels = 1;
8622 image_create_info.arrayLayers = 1;
8623 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8624 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8625 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8626 image_create_info.flags = 0;
8627
8628 // Introduce error by sending down a bogus width extent
8629 image_create_info.extent.width = 0;
8630 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8631
8632 m_errorMonitor->VerifyFound();
8633}
8634
Karl Schultz6addd812016-02-02 17:17:23 -07008635TEST_F(VkLayerTest, UpdateBufferAlignment) {
8636 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -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 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008640
Mike Stroyana3082432015-09-25 13:39:21 -06008641 ASSERT_NO_FATAL_FAILURE(InitState());
8642
8643 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8644 vk_testing::Buffer buffer;
8645 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8646
8647 BeginCommandBuffer();
8648 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008649 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008650 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008651
Mike Stroyana3082432015-09-25 13:39:21 -06008652 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008654 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008655
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008656 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008657 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008658 EndCommandBuffer();
8659}
8660
Karl Schultz6addd812016-02-02 17:17:23 -07008661TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008663 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06008664
8665 ASSERT_NO_FATAL_FAILURE(InitState());
8666
8667 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8668 vk_testing::Buffer buffer;
8669 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8670
8671 BeginCommandBuffer();
8672 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008673 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008674 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008675
Mike Stroyana3082432015-09-25 13:39:21 -06008676 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008677 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008678 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008679
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008680 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008681
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008682 m_errorMonitor->VerifyFound();
8683
Mike Stroyana3082432015-09-25 13:39:21 -06008684 EndCommandBuffer();
8685}
8686
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008687#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12008688
Tobin Ehliscde08892015-09-22 10:11:37 -06008689#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07008690TEST_F(VkLayerTest, InvalidImageView) {
8691 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06008692
Karl Schultz6addd812016-02-02 17:17:23 -07008693 m_errorMonitor->SetDesiredFailureMsg(
8694 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008695 "vkCreateImageView called with baseMipLevel 10 ");
8696
Tobin Ehliscde08892015-09-22 10:11:37 -06008697 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06008698
Mike Stroyana3082432015-09-25 13:39:21 -06008699 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07008700 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06008701
Karl Schultz6addd812016-02-02 17:17:23 -07008702 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8703 const int32_t tex_width = 32;
8704 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06008705
8706 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008707 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8708 image_create_info.pNext = NULL;
8709 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8710 image_create_info.format = tex_format;
8711 image_create_info.extent.width = tex_width;
8712 image_create_info.extent.height = tex_height;
8713 image_create_info.extent.depth = 1;
8714 image_create_info.mipLevels = 1;
8715 image_create_info.arrayLayers = 1;
8716 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8717 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8718 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8719 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06008720
Chia-I Wuf7458c52015-10-26 21:10:41 +08008721 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06008722 ASSERT_VK_SUCCESS(err);
8723
8724 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008725 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8726 image_view_create_info.image = image;
8727 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8728 image_view_create_info.format = tex_format;
8729 image_view_create_info.subresourceRange.layerCount = 1;
8730 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
8731 image_view_create_info.subresourceRange.levelCount = 1;
8732 image_view_create_info.subresourceRange.aspectMask =
8733 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06008734
8735 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008736 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8737 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06008738
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008739 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06008740}
Mike Stroyana3082432015-09-25 13:39:21 -06008741
Karl Schultz6addd812016-02-02 17:17:23 -07008742TEST_F(VkLayerTest, InvalidImageViewAspect) {
8743 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008744
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008746 "vkCreateImageView: Color image "
8747 "formats must have ONLY the "
8748 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008749
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008750 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008751
8752 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07008753 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008754
Karl Schultz6addd812016-02-02 17:17:23 -07008755 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8756 const int32_t tex_width = 32;
8757 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008758
8759 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008760 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8761 image_create_info.pNext = NULL;
8762 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8763 image_create_info.format = tex_format;
8764 image_create_info.extent.width = tex_width;
8765 image_create_info.extent.height = tex_height;
8766 image_create_info.extent.depth = 1;
8767 image_create_info.mipLevels = 1;
8768 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8769 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8770 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8771 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008772
Chia-I Wuf7458c52015-10-26 21:10:41 +08008773 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008774 ASSERT_VK_SUCCESS(err);
8775
8776 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008777 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8778 image_view_create_info.image = image;
8779 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8780 image_view_create_info.format = tex_format;
8781 image_view_create_info.subresourceRange.baseMipLevel = 0;
8782 image_view_create_info.subresourceRange.levelCount = 1;
8783 // Cause an error by setting an invalid image aspect
8784 image_view_create_info.subresourceRange.aspectMask =
8785 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008786
8787 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008788 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8789 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008790
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008791 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008792}
8793
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008794TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008795 VkResult err;
8796 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008797
Karl Schultz6addd812016-02-02 17:17:23 -07008798 m_errorMonitor->SetDesiredFailureMsg(
8799 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008800 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008801
Mike Stroyana3082432015-09-25 13:39:21 -06008802 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008803
8804 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008805 VkImage srcImage;
8806 VkImage dstImage;
8807 VkDeviceMemory srcMem;
8808 VkDeviceMemory destMem;
8809 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008810
8811 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008812 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8813 image_create_info.pNext = NULL;
8814 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8815 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8816 image_create_info.extent.width = 32;
8817 image_create_info.extent.height = 32;
8818 image_create_info.extent.depth = 1;
8819 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008820 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07008821 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8822 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8823 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8824 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008825
Karl Schultz6addd812016-02-02 17:17:23 -07008826 err =
8827 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008828 ASSERT_VK_SUCCESS(err);
8829
Karl Schultz6addd812016-02-02 17:17:23 -07008830 err =
8831 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008832 ASSERT_VK_SUCCESS(err);
8833
8834 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008835 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008836 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8837 memAlloc.pNext = NULL;
8838 memAlloc.allocationSize = 0;
8839 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008840
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008841 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008842 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008843 pass =
8844 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008845 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008846 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008847 ASSERT_VK_SUCCESS(err);
8848
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008849 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008850 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008851 pass =
8852 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008853 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008854 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008855 ASSERT_VK_SUCCESS(err);
8856
8857 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8858 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008859 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008860 ASSERT_VK_SUCCESS(err);
8861
8862 BeginCommandBuffer();
8863 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008864 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008865 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008866 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008867 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06008868 copyRegion.srcOffset.x = 0;
8869 copyRegion.srcOffset.y = 0;
8870 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008871 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008872 copyRegion.dstSubresource.mipLevel = 0;
8873 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008874 // Introduce failure by forcing the dst layerCount to differ from src
8875 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008876 copyRegion.dstOffset.x = 0;
8877 copyRegion.dstOffset.y = 0;
8878 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008879 copyRegion.extent.width = 1;
8880 copyRegion.extent.height = 1;
8881 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008882 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8883 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008884 EndCommandBuffer();
8885
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008886 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008887
Chia-I Wuf7458c52015-10-26 21:10:41 +08008888 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008889 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008890 vkFreeMemory(m_device->device(), srcMem, NULL);
8891 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008892}
8893
Tony Barbourd6673642016-05-05 14:46:39 -06008894TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
8895
8896 TEST_DESCRIPTION("Creating images with unsuported formats ");
8897
8898 ASSERT_NO_FATAL_FAILURE(InitState());
8899 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8900 VkImageObj image(m_device);
8901 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
8902 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
8903 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
8904 VK_IMAGE_TILING_OPTIMAL, 0);
8905 ASSERT_TRUE(image.initialized());
8906
8907 VkFormat unsupported = VK_FORMAT_UNDEFINED;
8908 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
8909 VkFormat format = static_cast<VkFormat>(f);
8910 VkFormatProperties fProps = m_device->format_properties(format);
8911 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
8912 fProps.optimalTilingFeatures == 0) {
8913 unsupported = format;
8914 break;
8915 }
8916 }
8917 if (unsupported != VK_FORMAT_UNDEFINED) {
8918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8919 "vkCreateImage parameter, "
8920 "VkFormat pCreateInfo->format, "
8921 "contains unsupported format");
8922 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
8923 VkImageCreateInfo image_create_info;
8924 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8925 image_create_info.pNext = NULL;
8926 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8927 image_create_info.format = unsupported;
8928 image_create_info.extent.width = 32;
8929 image_create_info.extent.height = 32;
8930 image_create_info.extent.depth = 1;
8931 image_create_info.mipLevels = 1;
8932 image_create_info.arrayLayers = 1;
8933 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8934 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8935 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8936 image_create_info.flags = 0;
8937
8938 VkImage localImage;
8939 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
8940 m_errorMonitor->VerifyFound();
8941
8942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8943 "vkCreateRenderPass parameter, "
8944 "VkFormat in "
8945 "pCreateInfo->pAttachments");
8946 // Create renderpass with unsupported format - Expect FORMAT_UNSUPPORTED
8947 VkAttachmentDescription att;
8948 att.format = unsupported;
8949 att.samples = VK_SAMPLE_COUNT_1_BIT;
8950 att.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
8951 att.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
8952 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
8953 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
8954 att.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8955 att.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8956
8957 VkRenderPassCreateInfo rp_info = {};
8958 VkRenderPass rp;
8959 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8960 rp_info.attachmentCount = 1;
8961 rp_info.pAttachments = &att;
8962 rp_info.subpassCount = 0;
8963 rp_info.pSubpasses = NULL;
8964 vkCreateRenderPass(m_device->handle(), &rp_info, NULL, &rp);
8965 m_errorMonitor->VerifyFound();
8966 }
8967}
8968
8969TEST_F(VkLayerTest, ImageLayerViewTests) {
8970 VkResult ret;
8971 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
8972
8973 ASSERT_NO_FATAL_FAILURE(InitState());
8974
8975 VkImageObj image(m_device);
8976 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
8977 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
8978 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
8979 VK_IMAGE_TILING_OPTIMAL, 0);
8980 ASSERT_TRUE(image.initialized());
8981
8982 VkImageView imgView;
8983 VkImageViewCreateInfo imgViewInfo = {};
8984 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8985 imgViewInfo.image = image.handle();
8986 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
8987 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
8988 imgViewInfo.subresourceRange.layerCount = 1;
8989 imgViewInfo.subresourceRange.baseMipLevel = 0;
8990 imgViewInfo.subresourceRange.levelCount = 1;
8991 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8992
8993 m_errorMonitor->SetDesiredFailureMsg(
8994 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8995 "vkCreateImageView called with baseMipLevel");
8996 // View can't have baseMipLevel >= image's mipLevels - Expect
8997 // VIEW_CREATE_ERROR
8998 imgViewInfo.subresourceRange.baseMipLevel = 1;
8999 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9000 m_errorMonitor->VerifyFound();
9001 imgViewInfo.subresourceRange.baseMipLevel = 0;
9002
9003 m_errorMonitor->SetDesiredFailureMsg(
9004 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9005 "vkCreateImageView called with baseArrayLayer");
9006 // View can't have baseArrayLayer >= image's arraySize - Expect
9007 // VIEW_CREATE_ERROR
9008 imgViewInfo.subresourceRange.baseArrayLayer = 1;
9009 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9010 m_errorMonitor->VerifyFound();
9011 imgViewInfo.subresourceRange.baseArrayLayer = 0;
9012
9013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9014 "vkCreateImageView called with 0 in "
9015 "pCreateInfo->subresourceRange."
9016 "levelCount");
9017 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
9018 imgViewInfo.subresourceRange.levelCount = 0;
9019 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9020 m_errorMonitor->VerifyFound();
9021 imgViewInfo.subresourceRange.levelCount = 1;
9022
9023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9024 "vkCreateImageView called with 0 in "
9025 "pCreateInfo->subresourceRange."
9026 "layerCount");
9027 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
9028 imgViewInfo.subresourceRange.layerCount = 0;
9029 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9030 m_errorMonitor->VerifyFound();
9031 imgViewInfo.subresourceRange.layerCount = 1;
9032
9033 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9034 "but both must be color formats");
9035 // Can't use depth format for view into color image - Expect INVALID_FORMAT
9036 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
9037 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9038 m_errorMonitor->VerifyFound();
9039 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9040
9041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9042 "Formats MUST be IDENTICAL unless "
9043 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
9044 "was set on image creation.");
9045 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
9046 // VIEW_CREATE_ERROR
9047 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
9048 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9049 m_errorMonitor->VerifyFound();
9050 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9051
9052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9053 "can support ImageViews with "
9054 "differing formats but they must be "
9055 "in the same compatibility class.");
9056 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
9057 // VIEW_CREATE_ERROR
9058 VkImageCreateInfo mutImgInfo = image.create_info();
9059 VkImage mutImage;
9060 mutImgInfo.format = VK_FORMAT_R8_UINT;
9061 assert(
9062 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
9063 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
9064 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
9065 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9066 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
9067 ASSERT_VK_SUCCESS(ret);
9068 imgViewInfo.image = mutImage;
9069 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9070 m_errorMonitor->VerifyFound();
9071 imgViewInfo.image = image.handle();
9072 vkDestroyImage(m_device->handle(), mutImage, NULL);
9073}
9074
9075TEST_F(VkLayerTest, MiscImageLayerTests) {
9076
9077 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
9078
9079 ASSERT_NO_FATAL_FAILURE(InitState());
9080
9081 VkImageObj image(m_device);
9082 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9083 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
9084 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
9085 VK_IMAGE_TILING_OPTIMAL, 0);
9086 ASSERT_TRUE(image.initialized());
9087
9088 m_errorMonitor->SetDesiredFailureMsg(
9089 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9090 "number of layers in image subresource is zero");
9091 vk_testing::Buffer buffer;
9092 VkMemoryPropertyFlags reqs = 0;
9093 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
9094 VkBufferImageCopy region = {};
9095 region.bufferRowLength = 128;
9096 region.bufferImageHeight = 128;
9097 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9098 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
9099 region.imageSubresource.layerCount = 0;
9100 region.imageExtent.height = 4;
9101 region.imageExtent.width = 4;
9102 region.imageExtent.depth = 1;
9103 m_commandBuffer->BeginCommandBuffer();
9104 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
9105 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
9106 1, &region);
9107 m_errorMonitor->VerifyFound();
9108 region.imageSubresource.layerCount = 1;
9109
9110 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9111 "aspectMasks for each region must "
9112 "specify only COLOR or DEPTH or "
9113 "STENCIL");
9114 // Expect MISMATCHED_IMAGE_ASPECT
9115 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
9116 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
9117 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
9118 1, &region);
9119 m_errorMonitor->VerifyFound();
9120 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9121
9122 m_errorMonitor->SetDesiredFailureMsg(
9123 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9124 "If the format of srcImage is a depth, stencil, depth stencil or "
9125 "integer-based format then filter must be VK_FILTER_NEAREST");
9126 // Expect INVALID_FILTER
9127 VkImageObj intImage1(m_device);
9128 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
9129 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
9130 0);
9131 VkImageObj intImage2(m_device);
9132 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
9133 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
9134 0);
9135 VkImageBlit blitRegion = {};
9136 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9137 blitRegion.srcSubresource.baseArrayLayer = 0;
9138 blitRegion.srcSubresource.layerCount = 1;
9139 blitRegion.srcSubresource.mipLevel = 0;
9140 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9141 blitRegion.dstSubresource.baseArrayLayer = 0;
9142 blitRegion.dstSubresource.layerCount = 1;
9143 blitRegion.dstSubresource.mipLevel = 0;
9144
9145 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
9146 intImage1.layout(), intImage2.handle(), intImage2.layout(),
9147 16, &blitRegion, VK_FILTER_LINEAR);
9148 m_errorMonitor->VerifyFound();
9149
9150 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9151 "called with 0 in ppMemoryBarriers");
9152 VkImageMemoryBarrier img_barrier;
9153 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9154 img_barrier.pNext = NULL;
9155 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9156 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9157 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9158 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9159 img_barrier.image = image.handle();
9160 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9161 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9162 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9163 img_barrier.subresourceRange.baseArrayLayer = 0;
9164 img_barrier.subresourceRange.baseMipLevel = 0;
9165 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
9166 img_barrier.subresourceRange.layerCount = 0;
9167 img_barrier.subresourceRange.levelCount = 1;
9168 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9169 VK_PIPELINE_STAGE_HOST_BIT,
9170 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9171 nullptr, 1, &img_barrier);
9172 m_errorMonitor->VerifyFound();
9173 img_barrier.subresourceRange.layerCount = 1;
9174}
9175
9176TEST_F(VkLayerTest, ImageFormatLimits) {
9177
9178 TEST_DESCRIPTION("Exceed the limits of image format ");
9179
9180 m_errorMonitor->SetDesiredFailureMsg(
9181 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9182 "CreateImage extents exceed allowable limits for format");
9183 VkImageCreateInfo image_create_info = {};
9184 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9185 image_create_info.pNext = NULL;
9186 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9187 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9188 image_create_info.extent.width = 32;
9189 image_create_info.extent.height = 32;
9190 image_create_info.extent.depth = 1;
9191 image_create_info.mipLevels = 1;
9192 image_create_info.arrayLayers = 1;
9193 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9194 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9195 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9196 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9197 image_create_info.flags = 0;
9198
9199 VkImage nullImg;
9200 VkImageFormatProperties imgFmtProps;
9201 vkGetPhysicalDeviceImageFormatProperties(
9202 gpu(), image_create_info.format, image_create_info.imageType,
9203 image_create_info.tiling, image_create_info.usage,
9204 image_create_info.flags, &imgFmtProps);
9205 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
9206 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9207 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9208 m_errorMonitor->VerifyFound();
9209 image_create_info.extent.depth = 1;
9210
9211 m_errorMonitor->SetDesiredFailureMsg(
9212 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9213 "exceeds allowable maximum supported by format of");
9214 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
9215 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9216 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9217 m_errorMonitor->VerifyFound();
9218 image_create_info.mipLevels = 1;
9219
9220 m_errorMonitor->SetDesiredFailureMsg(
9221 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9222 "exceeds allowable maximum supported by format of");
9223 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
9224 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9225 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9226 m_errorMonitor->VerifyFound();
9227 image_create_info.arrayLayers = 1;
9228
9229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9230 "is not supported by format");
9231 int samples = imgFmtProps.sampleCounts >> 1;
9232 image_create_info.samples = (VkSampleCountFlagBits)samples;
9233 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9234 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9235 m_errorMonitor->VerifyFound();
9236 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9237
9238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9239 "pCreateInfo->initialLayout, must be "
9240 "VK_IMAGE_LAYOUT_UNDEFINED or "
9241 "VK_IMAGE_LAYOUT_PREINITIALIZED");
9242 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9243 // Expect INVALID_LAYOUT
9244 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9245 m_errorMonitor->VerifyFound();
9246 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9247}
9248
Karl Schultz6addd812016-02-02 17:17:23 -07009249TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06009250 VkResult err;
9251 bool pass;
9252
9253 // Create color images with different format sizes and try to copy between them
9254 m_errorMonitor->SetDesiredFailureMsg(
9255 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9256 "vkCmdCopyImage called with unmatched source and dest image format sizes");
9257
9258 ASSERT_NO_FATAL_FAILURE(InitState());
9259
9260 // Create two images of different types and try to copy between them
9261 VkImage srcImage;
9262 VkImage dstImage;
9263 VkDeviceMemory srcMem;
9264 VkDeviceMemory destMem;
9265 VkMemoryRequirements memReqs;
9266
9267 VkImageCreateInfo image_create_info = {};
9268 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9269 image_create_info.pNext = NULL;
9270 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9271 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9272 image_create_info.extent.width = 32;
9273 image_create_info.extent.height = 32;
9274 image_create_info.extent.depth = 1;
9275 image_create_info.mipLevels = 1;
9276 image_create_info.arrayLayers = 1;
9277 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9278 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9279 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9280 image_create_info.flags = 0;
9281
9282 err =
9283 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
9284 ASSERT_VK_SUCCESS(err);
9285
9286 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
9287 // Introduce failure by creating second image with a different-sized format.
9288 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
9289
9290 err =
9291 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
9292 ASSERT_VK_SUCCESS(err);
9293
9294 // Allocate memory
9295 VkMemoryAllocateInfo memAlloc = {};
9296 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9297 memAlloc.pNext = NULL;
9298 memAlloc.allocationSize = 0;
9299 memAlloc.memoryTypeIndex = 0;
9300
9301 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
9302 memAlloc.allocationSize = memReqs.size;
9303 pass =
9304 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
9305 ASSERT_TRUE(pass);
9306 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
9307 ASSERT_VK_SUCCESS(err);
9308
9309 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
9310 memAlloc.allocationSize = memReqs.size;
9311 pass =
9312 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
9313 ASSERT_TRUE(pass);
9314 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
9315 ASSERT_VK_SUCCESS(err);
9316
9317 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9318 ASSERT_VK_SUCCESS(err);
9319 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
9320 ASSERT_VK_SUCCESS(err);
9321
9322 BeginCommandBuffer();
9323 VkImageCopy copyRegion;
9324 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9325 copyRegion.srcSubresource.mipLevel = 0;
9326 copyRegion.srcSubresource.baseArrayLayer = 0;
9327 copyRegion.srcSubresource.layerCount = 0;
9328 copyRegion.srcOffset.x = 0;
9329 copyRegion.srcOffset.y = 0;
9330 copyRegion.srcOffset.z = 0;
9331 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9332 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;
9338 copyRegion.extent.width = 1;
9339 copyRegion.extent.height = 1;
9340 copyRegion.extent.depth = 1;
9341 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9342 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
9343 EndCommandBuffer();
9344
9345 m_errorMonitor->VerifyFound();
9346
9347 vkDestroyImage(m_device->device(), srcImage, NULL);
9348 vkDestroyImage(m_device->device(), dstImage, NULL);
9349 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, CopyImageDepthStencilFormatMismatch) {
9354 VkResult err;
9355 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009356
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009357 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009358 m_errorMonitor->SetDesiredFailureMsg(
9359 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009360 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009361
Mike Stroyana3082432015-09-25 13:39:21 -06009362 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009363
9364 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009365 VkImage srcImage;
9366 VkImage dstImage;
9367 VkDeviceMemory srcMem;
9368 VkDeviceMemory destMem;
9369 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009370
9371 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009372 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9373 image_create_info.pNext = NULL;
9374 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9375 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9376 image_create_info.extent.width = 32;
9377 image_create_info.extent.height = 32;
9378 image_create_info.extent.depth = 1;
9379 image_create_info.mipLevels = 1;
9380 image_create_info.arrayLayers = 1;
9381 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9382 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9383 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9384 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009385
Karl Schultz6addd812016-02-02 17:17:23 -07009386 err =
9387 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009388 ASSERT_VK_SUCCESS(err);
9389
Karl Schultzbdb75952016-04-19 11:36:49 -06009390 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
9391
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009392 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07009393 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009394 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
9395 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009396
Karl Schultz6addd812016-02-02 17:17:23 -07009397 err =
9398 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009399 ASSERT_VK_SUCCESS(err);
9400
9401 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009402 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009403 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9404 memAlloc.pNext = NULL;
9405 memAlloc.allocationSize = 0;
9406 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009407
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009408 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009409 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009410 pass =
9411 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009412 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009413 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009414 ASSERT_VK_SUCCESS(err);
9415
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009416 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009417 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009418 pass =
9419 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009420 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009421 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009422 ASSERT_VK_SUCCESS(err);
9423
9424 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9425 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009426 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009427 ASSERT_VK_SUCCESS(err);
9428
9429 BeginCommandBuffer();
9430 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009431 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009432 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009433 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009434 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009435 copyRegion.srcOffset.x = 0;
9436 copyRegion.srcOffset.y = 0;
9437 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009438 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009439 copyRegion.dstSubresource.mipLevel = 0;
9440 copyRegion.dstSubresource.baseArrayLayer = 0;
9441 copyRegion.dstSubresource.layerCount = 0;
9442 copyRegion.dstOffset.x = 0;
9443 copyRegion.dstOffset.y = 0;
9444 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009445 copyRegion.extent.width = 1;
9446 copyRegion.extent.height = 1;
9447 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009448 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9449 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009450 EndCommandBuffer();
9451
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009452 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009453
Chia-I Wuf7458c52015-10-26 21:10:41 +08009454 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009455 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009456 vkFreeMemory(m_device->device(), srcMem, NULL);
9457 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009458}
9459
Karl Schultz6addd812016-02-02 17:17:23 -07009460TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
9461 VkResult err;
9462 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009463
Karl Schultz6addd812016-02-02 17:17:23 -07009464 m_errorMonitor->SetDesiredFailureMsg(
9465 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009466 "vkCmdResolveImage called with source sample count less than 2.");
9467
Mike Stroyana3082432015-09-25 13:39:21 -06009468 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009469
9470 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07009471 VkImage srcImage;
9472 VkImage dstImage;
9473 VkDeviceMemory srcMem;
9474 VkDeviceMemory destMem;
9475 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009476
9477 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009478 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9479 image_create_info.pNext = NULL;
9480 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9481 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9482 image_create_info.extent.width = 32;
9483 image_create_info.extent.height = 1;
9484 image_create_info.extent.depth = 1;
9485 image_create_info.mipLevels = 1;
9486 image_create_info.arrayLayers = 1;
9487 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9488 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9489 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_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 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009497
Karl Schultz6addd812016-02-02 17:17:23 -07009498 err =
9499 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009500 ASSERT_VK_SUCCESS(err);
9501
9502 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009503 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009504 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9505 memAlloc.pNext = NULL;
9506 memAlloc.allocationSize = 0;
9507 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009508
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009509 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009510 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009511 pass =
9512 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009513 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009514 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009515 ASSERT_VK_SUCCESS(err);
9516
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009517 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009518 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009519 pass =
9520 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009521 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009522 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009523 ASSERT_VK_SUCCESS(err);
9524
9525 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9526 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009527 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009528 ASSERT_VK_SUCCESS(err);
9529
9530 BeginCommandBuffer();
9531 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009532 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9533 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009534 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009535 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009536 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009537 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009538 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009539 resolveRegion.srcOffset.x = 0;
9540 resolveRegion.srcOffset.y = 0;
9541 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009542 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009543 resolveRegion.dstSubresource.mipLevel = 0;
9544 resolveRegion.dstSubresource.baseArrayLayer = 0;
9545 resolveRegion.dstSubresource.layerCount = 0;
9546 resolveRegion.dstOffset.x = 0;
9547 resolveRegion.dstOffset.y = 0;
9548 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009549 resolveRegion.extent.width = 1;
9550 resolveRegion.extent.height = 1;
9551 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009552 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9553 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009554 EndCommandBuffer();
9555
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009556 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009557
Chia-I Wuf7458c52015-10-26 21:10:41 +08009558 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009559 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009560 vkFreeMemory(m_device->device(), srcMem, NULL);
9561 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009562}
9563
Karl Schultz6addd812016-02-02 17:17:23 -07009564TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
9565 VkResult err;
9566 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009567
Karl Schultz6addd812016-02-02 17:17:23 -07009568 m_errorMonitor->SetDesiredFailureMsg(
9569 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009570 "vkCmdResolveImage called with dest sample count greater than 1.");
9571
Mike Stroyana3082432015-09-25 13:39:21 -06009572 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009573
Chris Forbesa7530692016-05-08 12:35:39 +12009574 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07009575 VkImage srcImage;
9576 VkImage dstImage;
9577 VkDeviceMemory srcMem;
9578 VkDeviceMemory destMem;
9579 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009580
9581 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009582 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9583 image_create_info.pNext = NULL;
9584 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9585 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9586 image_create_info.extent.width = 32;
9587 image_create_info.extent.height = 1;
9588 image_create_info.extent.depth = 1;
9589 image_create_info.mipLevels = 1;
9590 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +12009591 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07009592 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9593 // Note: Some implementations expect color attachment usage for any
9594 // multisample surface
9595 image_create_info.usage =
9596 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9597 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009598
Karl Schultz6addd812016-02-02 17:17:23 -07009599 err =
9600 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009601 ASSERT_VK_SUCCESS(err);
9602
Karl Schultz6addd812016-02-02 17:17:23 -07009603 // Note: Some implementations expect color attachment usage for any
9604 // multisample surface
9605 image_create_info.usage =
9606 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009607
Karl Schultz6addd812016-02-02 17:17:23 -07009608 err =
9609 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009610 ASSERT_VK_SUCCESS(err);
9611
9612 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009613 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009614 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9615 memAlloc.pNext = NULL;
9616 memAlloc.allocationSize = 0;
9617 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009618
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009619 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009620 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009621 pass =
9622 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009623 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009624 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009625 ASSERT_VK_SUCCESS(err);
9626
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009627 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009628 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009629 pass =
9630 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009631 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009632 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009633 ASSERT_VK_SUCCESS(err);
9634
9635 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9636 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009637 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009638 ASSERT_VK_SUCCESS(err);
9639
9640 BeginCommandBuffer();
9641 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009642 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9643 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009644 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009645 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009646 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009647 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009648 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009649 resolveRegion.srcOffset.x = 0;
9650 resolveRegion.srcOffset.y = 0;
9651 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009652 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009653 resolveRegion.dstSubresource.mipLevel = 0;
9654 resolveRegion.dstSubresource.baseArrayLayer = 0;
9655 resolveRegion.dstSubresource.layerCount = 0;
9656 resolveRegion.dstOffset.x = 0;
9657 resolveRegion.dstOffset.y = 0;
9658 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009659 resolveRegion.extent.width = 1;
9660 resolveRegion.extent.height = 1;
9661 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009662 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9663 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009664 EndCommandBuffer();
9665
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009666 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009667
Chia-I Wuf7458c52015-10-26 21:10:41 +08009668 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009669 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009670 vkFreeMemory(m_device->device(), srcMem, NULL);
9671 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009672}
9673
Karl Schultz6addd812016-02-02 17:17:23 -07009674TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
9675 VkResult err;
9676 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009677
Karl Schultz6addd812016-02-02 17:17:23 -07009678 m_errorMonitor->SetDesiredFailureMsg(
9679 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009680 "vkCmdResolveImage called with unmatched source and dest formats.");
9681
Mike Stroyana3082432015-09-25 13:39:21 -06009682 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009683
9684 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009685 VkImage srcImage;
9686 VkImage dstImage;
9687 VkDeviceMemory srcMem;
9688 VkDeviceMemory destMem;
9689 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009690
9691 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009692 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9693 image_create_info.pNext = NULL;
9694 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9695 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9696 image_create_info.extent.width = 32;
9697 image_create_info.extent.height = 1;
9698 image_create_info.extent.depth = 1;
9699 image_create_info.mipLevels = 1;
9700 image_create_info.arrayLayers = 1;
9701 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
9702 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9703 // Note: Some implementations expect color attachment usage for any
9704 // multisample surface
9705 image_create_info.usage =
9706 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9707 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009708
Karl Schultz6addd812016-02-02 17:17:23 -07009709 err =
9710 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009711 ASSERT_VK_SUCCESS(err);
9712
Karl Schultz6addd812016-02-02 17:17:23 -07009713 // Set format to something other than source image
9714 image_create_info.format = VK_FORMAT_R32_SFLOAT;
9715 // Note: Some implementations expect color attachment usage for any
9716 // multisample surface
9717 image_create_info.usage =
9718 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9719 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009720
Karl Schultz6addd812016-02-02 17:17:23 -07009721 err =
9722 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009723 ASSERT_VK_SUCCESS(err);
9724
9725 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009726 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009727 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9728 memAlloc.pNext = NULL;
9729 memAlloc.allocationSize = 0;
9730 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009731
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009732 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009733 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009734 pass =
9735 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009736 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009737 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009738 ASSERT_VK_SUCCESS(err);
9739
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009740 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009741 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009742 pass =
9743 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009744 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009745 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009746 ASSERT_VK_SUCCESS(err);
9747
9748 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9749 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009750 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009751 ASSERT_VK_SUCCESS(err);
9752
9753 BeginCommandBuffer();
9754 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009755 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9756 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009757 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009758 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009759 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009760 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009761 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009762 resolveRegion.srcOffset.x = 0;
9763 resolveRegion.srcOffset.y = 0;
9764 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009765 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009766 resolveRegion.dstSubresource.mipLevel = 0;
9767 resolveRegion.dstSubresource.baseArrayLayer = 0;
9768 resolveRegion.dstSubresource.layerCount = 0;
9769 resolveRegion.dstOffset.x = 0;
9770 resolveRegion.dstOffset.y = 0;
9771 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009772 resolveRegion.extent.width = 1;
9773 resolveRegion.extent.height = 1;
9774 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009775 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9776 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009777 EndCommandBuffer();
9778
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009779 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009780
Chia-I Wuf7458c52015-10-26 21:10:41 +08009781 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009782 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009783 vkFreeMemory(m_device->device(), srcMem, NULL);
9784 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009785}
9786
Karl Schultz6addd812016-02-02 17:17:23 -07009787TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
9788 VkResult err;
9789 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009790
Karl Schultz6addd812016-02-02 17:17:23 -07009791 m_errorMonitor->SetDesiredFailureMsg(
9792 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009793 "vkCmdResolveImage called with unmatched source and dest image types.");
9794
Mike Stroyana3082432015-09-25 13:39:21 -06009795 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009796
9797 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009798 VkImage srcImage;
9799 VkImage dstImage;
9800 VkDeviceMemory srcMem;
9801 VkDeviceMemory destMem;
9802 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009803
9804 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009805 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9806 image_create_info.pNext = NULL;
9807 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9808 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9809 image_create_info.extent.width = 32;
9810 image_create_info.extent.height = 1;
9811 image_create_info.extent.depth = 1;
9812 image_create_info.mipLevels = 1;
9813 image_create_info.arrayLayers = 1;
9814 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
9815 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9816 // Note: Some implementations expect color attachment usage for any
9817 // multisample surface
9818 image_create_info.usage =
9819 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9820 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009821
Karl Schultz6addd812016-02-02 17:17:23 -07009822 err =
9823 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009824 ASSERT_VK_SUCCESS(err);
9825
Karl Schultz6addd812016-02-02 17:17:23 -07009826 image_create_info.imageType = VK_IMAGE_TYPE_1D;
9827 // Note: Some implementations expect color attachment usage for any
9828 // multisample surface
9829 image_create_info.usage =
9830 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9831 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009832
Karl Schultz6addd812016-02-02 17:17:23 -07009833 err =
9834 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009835 ASSERT_VK_SUCCESS(err);
9836
9837 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009838 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009839 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9840 memAlloc.pNext = NULL;
9841 memAlloc.allocationSize = 0;
9842 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009843
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009844 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009845 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009846 pass =
9847 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009848 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009849 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009850 ASSERT_VK_SUCCESS(err);
9851
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009852 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009853 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009854 pass =
9855 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009856 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009857 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009858 ASSERT_VK_SUCCESS(err);
9859
9860 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9861 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009862 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009863 ASSERT_VK_SUCCESS(err);
9864
9865 BeginCommandBuffer();
9866 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009867 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9868 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009869 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009870 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009871 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009872 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009873 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009874 resolveRegion.srcOffset.x = 0;
9875 resolveRegion.srcOffset.y = 0;
9876 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009877 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009878 resolveRegion.dstSubresource.mipLevel = 0;
9879 resolveRegion.dstSubresource.baseArrayLayer = 0;
9880 resolveRegion.dstSubresource.layerCount = 0;
9881 resolveRegion.dstOffset.x = 0;
9882 resolveRegion.dstOffset.y = 0;
9883 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009884 resolveRegion.extent.width = 1;
9885 resolveRegion.extent.height = 1;
9886 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009887 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9888 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009889 EndCommandBuffer();
9890
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009891 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009892
Chia-I Wuf7458c52015-10-26 21:10:41 +08009893 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009894 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009895 vkFreeMemory(m_device->device(), srcMem, NULL);
9896 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009897}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009898
Karl Schultz6addd812016-02-02 17:17:23 -07009899TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009900 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07009901 // to using a DS format, then cause it to hit error due to COLOR_BIT not
9902 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009903 // The image format check comes 2nd in validation so we trigger it first,
9904 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07009905 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009906
Karl Schultz6addd812016-02-02 17:17:23 -07009907 m_errorMonitor->SetDesiredFailureMsg(
9908 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009909 "Combination depth/stencil image formats can have only the ");
9910
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009911 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009912
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009913 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009914 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
9915 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009916
9917 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009918 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9919 ds_pool_ci.pNext = NULL;
9920 ds_pool_ci.maxSets = 1;
9921 ds_pool_ci.poolSizeCount = 1;
9922 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009923
9924 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009925 err =
9926 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009927 ASSERT_VK_SUCCESS(err);
9928
9929 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009930 dsl_binding.binding = 0;
9931 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
9932 dsl_binding.descriptorCount = 1;
9933 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9934 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009935
9936 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009937 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9938 ds_layout_ci.pNext = NULL;
9939 ds_layout_ci.bindingCount = 1;
9940 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009941 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009942 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9943 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009944 ASSERT_VK_SUCCESS(err);
9945
9946 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009947 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009948 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009949 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009950 alloc_info.descriptorPool = ds_pool;
9951 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009952 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9953 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009954 ASSERT_VK_SUCCESS(err);
9955
Karl Schultz6addd812016-02-02 17:17:23 -07009956 VkImage image_bad;
9957 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009958 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07009959 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009960 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07009961 const int32_t tex_width = 32;
9962 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009963
9964 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009965 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9966 image_create_info.pNext = NULL;
9967 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9968 image_create_info.format = tex_format_bad;
9969 image_create_info.extent.width = tex_width;
9970 image_create_info.extent.height = tex_height;
9971 image_create_info.extent.depth = 1;
9972 image_create_info.mipLevels = 1;
9973 image_create_info.arrayLayers = 1;
9974 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9975 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9976 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
9977 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
9978 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009979
Karl Schultz6addd812016-02-02 17:17:23 -07009980 err =
9981 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009982 ASSERT_VK_SUCCESS(err);
9983 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07009984 image_create_info.usage =
9985 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9986 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
9987 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009988 ASSERT_VK_SUCCESS(err);
9989
9990 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009991 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9992 image_view_create_info.image = image_bad;
9993 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
9994 image_view_create_info.format = tex_format_bad;
9995 image_view_create_info.subresourceRange.baseArrayLayer = 0;
9996 image_view_create_info.subresourceRange.baseMipLevel = 0;
9997 image_view_create_info.subresourceRange.layerCount = 1;
9998 image_view_create_info.subresourceRange.levelCount = 1;
9999 image_view_create_info.subresourceRange.aspectMask =
10000 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010001
10002 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070010003 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
10004 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010005
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010006 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010007
Chia-I Wuf7458c52015-10-26 21:10:41 +080010008 vkDestroyImage(m_device->device(), image_bad, NULL);
10009 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010010 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10011 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010012}
Tobin Ehliscde08892015-09-22 10:11:37 -060010013#endif // IMAGE_TESTS
10014
Tony Barbour300a6082015-04-07 13:44:53 -060010015int main(int argc, char **argv) {
10016 int result;
10017
Cody Northrop8e54a402016-03-08 22:25:52 -070010018#ifdef ANDROID
10019 int vulkanSupport = InitVulkan();
10020 if (vulkanSupport == 0)
10021 return 1;
10022#endif
10023
Tony Barbour300a6082015-04-07 13:44:53 -060010024 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060010025 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060010026
10027 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
10028
10029 result = RUN_ALL_TESTS();
10030
Tony Barbour6918cd52015-04-09 12:58:51 -060010031 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060010032 return result;
10033}