blob: 74d44b2b39f144062a44738315dd57ebd0f7290e [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
Cody Northrop3bb4d962016-05-09 16:15:57 -06005341TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
5342
5343 TEST_DESCRIPTION("End a command buffer with an active render pass");
5344
5345 m_errorMonitor->SetDesiredFailureMsg(
5346 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5347 "It is invalid to issue this call inside an active render pass");
5348
5349 ASSERT_NO_FATAL_FAILURE(InitState());
5350 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5351
5352 // The framework's BeginCommandBuffer calls CreateRenderPass
5353 BeginCommandBuffer();
5354
5355 // Call directly into vkEndCommandBuffer instead of the
5356 // the framework's EndCommandBuffer, which inserts a
5357 // vkEndRenderPass
5358 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
5359
5360 m_errorMonitor->VerifyFound();
5361
5362 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
5363 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
5364}
5365
Karl Schultz6addd812016-02-02 17:17:23 -07005366TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005367 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07005368 m_errorMonitor->SetDesiredFailureMsg(
5369 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005370 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005371
5372 ASSERT_NO_FATAL_FAILURE(InitState());
5373 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005374
5375 // Renderpass is started here
5376 BeginCommandBuffer();
5377
5378 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005379 vk_testing::Buffer dstBuffer;
5380 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005381
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005382 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005383
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005384 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005385}
5386
Karl Schultz6addd812016-02-02 17:17:23 -07005387TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005388 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07005389 m_errorMonitor->SetDesiredFailureMsg(
5390 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005391 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005392
5393 ASSERT_NO_FATAL_FAILURE(InitState());
5394 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005395
5396 // Renderpass is started here
5397 BeginCommandBuffer();
5398
5399 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005400 vk_testing::Buffer dstBuffer;
5401 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005402
Karl Schultz6addd812016-02-02 17:17:23 -07005403 VkDeviceSize dstOffset = 0;
5404 VkDeviceSize dataSize = 1024;
5405 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005406
Karl Schultz6addd812016-02-02 17:17:23 -07005407 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
5408 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005409
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005410 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005411}
5412
Karl Schultz6addd812016-02-02 17:17:23 -07005413TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005414 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005415 m_errorMonitor->SetDesiredFailureMsg(
5416 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005417 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005418
5419 ASSERT_NO_FATAL_FAILURE(InitState());
5420 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005421
5422 // Renderpass is started here
5423 BeginCommandBuffer();
5424
Michael Lentine0a369f62016-02-03 16:51:46 -06005425 VkClearColorValue clear_color;
5426 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07005427 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
5428 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5429 const int32_t tex_width = 32;
5430 const int32_t tex_height = 32;
5431 VkImageCreateInfo image_create_info = {};
5432 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5433 image_create_info.pNext = NULL;
5434 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5435 image_create_info.format = tex_format;
5436 image_create_info.extent.width = tex_width;
5437 image_create_info.extent.height = tex_height;
5438 image_create_info.extent.depth = 1;
5439 image_create_info.mipLevels = 1;
5440 image_create_info.arrayLayers = 1;
5441 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5442 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
5443 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005444
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005445 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005446 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5447 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005448
Karl Schultz6addd812016-02-02 17:17:23 -07005449 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5450 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005451
Karl Schultz6addd812016-02-02 17:17:23 -07005452 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5453 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005454
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005455 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005456}
5457
Karl Schultz6addd812016-02-02 17:17:23 -07005458TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005459 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005460 m_errorMonitor->SetDesiredFailureMsg(
5461 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005462 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005463
5464 ASSERT_NO_FATAL_FAILURE(InitState());
5465 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005466
5467 // Renderpass is started here
5468 BeginCommandBuffer();
5469
5470 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07005471 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005472 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
5473 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5474 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
5475 image_create_info.extent.width = 64;
5476 image_create_info.extent.height = 64;
5477 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5478 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005479
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005480 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005481 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5482 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005483
Karl Schultz6addd812016-02-02 17:17:23 -07005484 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5485 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005486
Karl Schultz6addd812016-02-02 17:17:23 -07005487 vkCmdClearDepthStencilImage(
5488 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5489 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
5490 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005491
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005492 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005493}
5494
Karl Schultz6addd812016-02-02 17:17:23 -07005495TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005496 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005497 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005498
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005500 "vkCmdClearAttachments: This call "
5501 "must be issued inside an active "
5502 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005503
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005504 ASSERT_NO_FATAL_FAILURE(InitState());
5505 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005506
5507 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005508 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005509 ASSERT_VK_SUCCESS(err);
5510
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005511 VkClearAttachment color_attachment;
5512 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5513 color_attachment.clearValue.color.float32[0] = 0;
5514 color_attachment.clearValue.color.float32[1] = 0;
5515 color_attachment.clearValue.color.float32[2] = 0;
5516 color_attachment.clearValue.color.float32[3] = 0;
5517 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005518 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
5519 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5520 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005521
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005522 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005523}
5524
Karl Schultz9e66a292016-04-21 15:57:51 -06005525TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
5526 // Try to add a buffer memory barrier with no buffer.
5527 m_errorMonitor->SetDesiredFailureMsg(
5528 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5529 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
5530
5531 ASSERT_NO_FATAL_FAILURE(InitState());
5532 BeginCommandBuffer();
5533
5534 VkBufferMemoryBarrier buf_barrier = {};
5535 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5536 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5537 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5538 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5539 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5540 buf_barrier.buffer = VK_NULL_HANDLE;
5541 buf_barrier.offset = 0;
5542 buf_barrier.size = VK_WHOLE_SIZE;
5543 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5544 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
5545 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
5546
5547 m_errorMonitor->VerifyFound();
5548}
5549
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06005550TEST_F(VkLayerTest, InvalidBarriers) {
5551 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
5552
5553 m_errorMonitor->SetDesiredFailureMsg(
5554 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
5555
5556 ASSERT_NO_FATAL_FAILURE(InitState());
5557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5558
5559 VkMemoryBarrier mem_barrier = {};
5560 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
5561 mem_barrier.pNext = NULL;
5562 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5563 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5564 BeginCommandBuffer();
5565 // BeginCommandBuffer() starts a render pass
5566 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5567 VK_PIPELINE_STAGE_HOST_BIT,
5568 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
5569 &mem_barrier, 0, nullptr, 0, nullptr);
5570 m_errorMonitor->VerifyFound();
5571
5572 m_errorMonitor->SetDesiredFailureMsg(
5573 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5574 "Image Layout cannot be transitioned to UNDEFINED");
5575 VkImageObj image(m_device);
5576 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
5577 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5578 ASSERT_TRUE(image.initialized());
5579 VkImageMemoryBarrier img_barrier = {};
5580 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
5581 img_barrier.pNext = NULL;
5582 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5583 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5584 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5585 // New layout can't be UNDEFINED
5586 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5587 img_barrier.image = image.handle();
5588 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5589 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5590 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5591 img_barrier.subresourceRange.baseArrayLayer = 0;
5592 img_barrier.subresourceRange.baseMipLevel = 0;
5593 img_barrier.subresourceRange.layerCount = 1;
5594 img_barrier.subresourceRange.levelCount = 1;
5595 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5596 VK_PIPELINE_STAGE_HOST_BIT,
5597 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5598 nullptr, 1, &img_barrier);
5599 m_errorMonitor->VerifyFound();
5600 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5601
5602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5603 "Subresource must have the sum of the "
5604 "baseArrayLayer");
5605 // baseArrayLayer + layerCount must be <= image's arrayLayers
5606 img_barrier.subresourceRange.baseArrayLayer = 1;
5607 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5608 VK_PIPELINE_STAGE_HOST_BIT,
5609 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5610 nullptr, 1, &img_barrier);
5611 m_errorMonitor->VerifyFound();
5612 img_barrier.subresourceRange.baseArrayLayer = 0;
5613
5614 m_errorMonitor->SetDesiredFailureMsg(
5615 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5616 "Subresource must have the sum of the baseMipLevel");
5617 // baseMipLevel + levelCount must be <= image's mipLevels
5618 img_barrier.subresourceRange.baseMipLevel = 1;
5619 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5620 VK_PIPELINE_STAGE_HOST_BIT,
5621 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5622 nullptr, 1, &img_barrier);
5623 m_errorMonitor->VerifyFound();
5624 img_barrier.subresourceRange.baseMipLevel = 0;
5625
5626 m_errorMonitor->SetDesiredFailureMsg(
5627 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5628 "Buffer Barriers cannot be used during a render pass");
5629 vk_testing::Buffer buffer;
5630 buffer.init(*m_device, 256);
5631 VkBufferMemoryBarrier buf_barrier = {};
5632 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5633 buf_barrier.pNext = NULL;
5634 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5635 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5636 buf_barrier.buffer = buffer.handle();
5637 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5638 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5639 buf_barrier.offset = 0;
5640 buf_barrier.size = VK_WHOLE_SIZE;
5641 // Can't send buffer barrier during a render pass
5642 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5643 VK_PIPELINE_STAGE_HOST_BIT,
5644 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5645 &buf_barrier, 0, nullptr);
5646 m_errorMonitor->VerifyFound();
5647 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
5648
5649 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5650 "which is not less than total size");
5651 buf_barrier.offset = 257;
5652 // Offset greater than total size
5653 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5654 VK_PIPELINE_STAGE_HOST_BIT,
5655 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5656 &buf_barrier, 0, nullptr);
5657 m_errorMonitor->VerifyFound();
5658 buf_barrier.offset = 0;
5659
5660 m_errorMonitor->SetDesiredFailureMsg(
5661 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
5662 buf_barrier.size = 257;
5663 // Size greater than total size
5664 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5665 VK_PIPELINE_STAGE_HOST_BIT,
5666 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5667 &buf_barrier, 0, nullptr);
5668 m_errorMonitor->VerifyFound();
5669 buf_barrier.size = VK_WHOLE_SIZE;
5670
5671 m_errorMonitor->SetDesiredFailureMsg(
5672 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5673 "Image is a depth and stencil format and thus must "
5674 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
5675 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
5676 VkDepthStencilObj ds_image(m_device);
5677 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
5678 ASSERT_TRUE(ds_image.initialized());
5679 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5680 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
5681 img_barrier.image = ds_image.handle();
5682 // Leave aspectMask at COLOR on purpose
5683 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5684 VK_PIPELINE_STAGE_HOST_BIT,
5685 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5686 nullptr, 1, &img_barrier);
5687 m_errorMonitor->VerifyFound();
5688}
5689
Karl Schultz6addd812016-02-02 17:17:23 -07005690TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005691 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005692 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005693
Karl Schultz6addd812016-02-02 17:17:23 -07005694 m_errorMonitor->SetDesiredFailureMsg(
5695 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005696 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
5697
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005698 ASSERT_NO_FATAL_FAILURE(InitState());
5699 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005700 uint32_t qfi = 0;
5701 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005702 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5703 buffCI.size = 1024;
5704 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5705 buffCI.queueFamilyIndexCount = 1;
5706 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005707
5708 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005709 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005710 ASSERT_VK_SUCCESS(err);
5711
5712 BeginCommandBuffer();
5713 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005714 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5715 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005716 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07005717 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
5718 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005719
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005720 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005721
Chia-I Wuf7458c52015-10-26 21:10:41 +08005722 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005723}
5724
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005725TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
5726 // Create an out-of-range queueFamilyIndex
5727 m_errorMonitor->SetDesiredFailureMsg(
5728 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -06005729 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
5730 "of the indices specified when the device was created, via the "
5731 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005732
5733 ASSERT_NO_FATAL_FAILURE(InitState());
5734 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5735 VkBufferCreateInfo buffCI = {};
5736 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5737 buffCI.size = 1024;
5738 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5739 buffCI.queueFamilyIndexCount = 1;
5740 // Introduce failure by specifying invalid queue_family_index
5741 uint32_t qfi = 777;
5742 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06005743 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005744
5745 VkBuffer ib;
5746 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
5747
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005748 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005749}
5750
Karl Schultz6addd812016-02-02 17:17:23 -07005751TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
5752 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
5753 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005754
Karl Schultz6addd812016-02-02 17:17:23 -07005755 m_errorMonitor->SetDesiredFailureMsg(
5756 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005757 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005758
5759 ASSERT_NO_FATAL_FAILURE(InitState());
5760 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005761
5762 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005763 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005764 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
5765 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005766
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005767 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005768}
5769
Karl Schultz6addd812016-02-02 17:17:23 -07005770TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005771 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07005772 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005773
Karl Schultz6addd812016-02-02 17:17:23 -07005774 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005775 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5776 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
5777 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005778
Tobin Ehlis3b780662015-05-28 12:11:26 -06005779 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005780 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005781 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005782 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5783 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005784
5785 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005786 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5787 ds_pool_ci.pNext = NULL;
5788 ds_pool_ci.maxSets = 1;
5789 ds_pool_ci.poolSizeCount = 1;
5790 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005791
Tobin Ehlis3b780662015-05-28 12:11:26 -06005792 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005793 err =
5794 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005795 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005796 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005797 dsl_binding.binding = 0;
5798 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5799 dsl_binding.descriptorCount = 1;
5800 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5801 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005802
Tony Barboureb254902015-07-15 12:50:33 -06005803 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005804 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5805 ds_layout_ci.pNext = NULL;
5806 ds_layout_ci.bindingCount = 1;
5807 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005808
Tobin Ehlis3b780662015-05-28 12:11:26 -06005809 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005810 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5811 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005812 ASSERT_VK_SUCCESS(err);
5813
5814 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005815 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005816 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005817 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005818 alloc_info.descriptorPool = ds_pool;
5819 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005820 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5821 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005822 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005823
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005824 VkSamplerCreateInfo sampler_ci = {};
5825 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5826 sampler_ci.pNext = NULL;
5827 sampler_ci.magFilter = VK_FILTER_NEAREST;
5828 sampler_ci.minFilter = VK_FILTER_NEAREST;
5829 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5830 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5831 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5832 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5833 sampler_ci.mipLodBias = 1.0;
5834 sampler_ci.anisotropyEnable = VK_FALSE;
5835 sampler_ci.maxAnisotropy = 1;
5836 sampler_ci.compareEnable = VK_FALSE;
5837 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5838 sampler_ci.minLod = 1.0;
5839 sampler_ci.maxLod = 1.0;
5840 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5841 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5842 VkSampler sampler;
5843 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5844 ASSERT_VK_SUCCESS(err);
5845
5846 VkDescriptorImageInfo info = {};
5847 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005848
5849 VkWriteDescriptorSet descriptor_write;
5850 memset(&descriptor_write, 0, sizeof(descriptor_write));
5851 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005852 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005853 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005854 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005855 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005856 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005857
5858 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5859
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005860 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005861
Chia-I Wuf7458c52015-10-26 21:10:41 +08005862 vkDestroySampler(m_device->device(), sampler, NULL);
5863 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5864 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005865}
5866
Karl Schultz6addd812016-02-02 17:17:23 -07005867TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005868 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07005869 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005870
Karl Schultz6addd812016-02-02 17:17:23 -07005871 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005872 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5873 " binding #0 with 1 total descriptors but update of 1 descriptors "
5874 "starting at binding offset of 0 combined with update array element "
5875 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005876
Tobin Ehlis3b780662015-05-28 12:11:26 -06005877 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005878 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005879 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005880 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5881 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005882
5883 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005884 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5885 ds_pool_ci.pNext = NULL;
5886 ds_pool_ci.maxSets = 1;
5887 ds_pool_ci.poolSizeCount = 1;
5888 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005889
Tobin Ehlis3b780662015-05-28 12:11:26 -06005890 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005891 err =
5892 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005893 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005894
Tony Barboureb254902015-07-15 12:50:33 -06005895 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005896 dsl_binding.binding = 0;
5897 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5898 dsl_binding.descriptorCount = 1;
5899 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5900 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005901
5902 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005903 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5904 ds_layout_ci.pNext = NULL;
5905 ds_layout_ci.bindingCount = 1;
5906 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005907
Tobin Ehlis3b780662015-05-28 12:11:26 -06005908 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005909 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5910 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005911 ASSERT_VK_SUCCESS(err);
5912
5913 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005914 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005915 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005916 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005917 alloc_info.descriptorPool = ds_pool;
5918 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005919 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5920 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005921 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005922
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005923 // Correctly update descriptor to avoid "NOT_UPDATED" error
5924 VkDescriptorBufferInfo buff_info = {};
5925 buff_info.buffer =
5926 VkBuffer(0); // Don't care about buffer handle for this test
5927 buff_info.offset = 0;
5928 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005929
5930 VkWriteDescriptorSet descriptor_write;
5931 memset(&descriptor_write, 0, sizeof(descriptor_write));
5932 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005933 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005934 descriptor_write.dstArrayElement =
5935 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08005936 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005937 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5938 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005939
5940 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5941
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005942 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005943
Chia-I Wuf7458c52015-10-26 21:10:41 +08005944 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5945 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005946}
5947
Karl Schultz6addd812016-02-02 17:17:23 -07005948TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
5949 // Create layout w/ count of 1 and attempt update to that layout w/ binding
5950 // index 2
5951 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005952
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005953 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5954 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005955
Tobin Ehlis3b780662015-05-28 12:11:26 -06005956 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005957 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005958 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005959 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5960 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005961
5962 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005963 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5964 ds_pool_ci.pNext = NULL;
5965 ds_pool_ci.maxSets = 1;
5966 ds_pool_ci.poolSizeCount = 1;
5967 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005968
Tobin Ehlis3b780662015-05-28 12:11:26 -06005969 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005970 err =
5971 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005972 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005973
Tony Barboureb254902015-07-15 12:50:33 -06005974 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005975 dsl_binding.binding = 0;
5976 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5977 dsl_binding.descriptorCount = 1;
5978 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5979 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005980
5981 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005982 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5983 ds_layout_ci.pNext = NULL;
5984 ds_layout_ci.bindingCount = 1;
5985 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005986 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005987 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5988 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005989 ASSERT_VK_SUCCESS(err);
5990
5991 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005992 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005993 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005994 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005995 alloc_info.descriptorPool = ds_pool;
5996 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005997 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5998 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005999 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006000
Tony Barboureb254902015-07-15 12:50:33 -06006001 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006002 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6003 sampler_ci.pNext = NULL;
6004 sampler_ci.magFilter = VK_FILTER_NEAREST;
6005 sampler_ci.minFilter = VK_FILTER_NEAREST;
6006 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6007 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6008 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6009 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6010 sampler_ci.mipLodBias = 1.0;
6011 sampler_ci.anisotropyEnable = VK_FALSE;
6012 sampler_ci.maxAnisotropy = 1;
6013 sampler_ci.compareEnable = VK_FALSE;
6014 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6015 sampler_ci.minLod = 1.0;
6016 sampler_ci.maxLod = 1.0;
6017 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6018 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06006019
Tobin Ehlis3b780662015-05-28 12:11:26 -06006020 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006021 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006022 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006023
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006024 VkDescriptorImageInfo info = {};
6025 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006026
6027 VkWriteDescriptorSet descriptor_write;
6028 memset(&descriptor_write, 0, sizeof(descriptor_write));
6029 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006030 descriptor_write.dstSet = descriptorSet;
6031 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006032 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006033 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006034 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006035 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006036
6037 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6038
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006039 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006040
Chia-I Wuf7458c52015-10-26 21:10:41 +08006041 vkDestroySampler(m_device->device(), sampler, NULL);
6042 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6043 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006044}
6045
Karl Schultz6addd812016-02-02 17:17:23 -07006046TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
6047 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
6048 // types
6049 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006050
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006051 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006052 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006053
Tobin Ehlis3b780662015-05-28 12:11:26 -06006054 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006055
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006056 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006057 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6058 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006059
6060 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006061 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6062 ds_pool_ci.pNext = NULL;
6063 ds_pool_ci.maxSets = 1;
6064 ds_pool_ci.poolSizeCount = 1;
6065 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006066
Tobin Ehlis3b780662015-05-28 12:11:26 -06006067 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006068 err =
6069 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006070 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06006071 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006072 dsl_binding.binding = 0;
6073 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6074 dsl_binding.descriptorCount = 1;
6075 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6076 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006077
Tony Barboureb254902015-07-15 12:50:33 -06006078 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006079 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6080 ds_layout_ci.pNext = NULL;
6081 ds_layout_ci.bindingCount = 1;
6082 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006083
Tobin Ehlis3b780662015-05-28 12:11:26 -06006084 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006085 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6086 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006087 ASSERT_VK_SUCCESS(err);
6088
6089 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006090 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006091 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006092 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006093 alloc_info.descriptorPool = ds_pool;
6094 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006095 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6096 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006097 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006098
Tony Barboureb254902015-07-15 12:50:33 -06006099 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006100 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6101 sampler_ci.pNext = NULL;
6102 sampler_ci.magFilter = VK_FILTER_NEAREST;
6103 sampler_ci.minFilter = VK_FILTER_NEAREST;
6104 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6105 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6106 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6107 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6108 sampler_ci.mipLodBias = 1.0;
6109 sampler_ci.anisotropyEnable = VK_FALSE;
6110 sampler_ci.maxAnisotropy = 1;
6111 sampler_ci.compareEnable = VK_FALSE;
6112 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6113 sampler_ci.minLod = 1.0;
6114 sampler_ci.maxLod = 1.0;
6115 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6116 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006117 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006118 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006119 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006120
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006121 VkDescriptorImageInfo info = {};
6122 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006123
6124 VkWriteDescriptorSet descriptor_write;
6125 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07006126 descriptor_write.sType =
6127 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006128 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006129 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006130 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006131 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006132 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006133
6134 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6135
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006136 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006137
Chia-I Wuf7458c52015-10-26 21:10:41 +08006138 vkDestroySampler(m_device->device(), sampler, NULL);
6139 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6140 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006141}
6142
Karl Schultz6addd812016-02-02 17:17:23 -07006143TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006144 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07006145 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006146
Karl Schultz6addd812016-02-02 17:17:23 -07006147 m_errorMonitor->SetDesiredFailureMsg(
6148 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006149 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006150
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006151 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006152 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
6153 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006154 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006155 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6156 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006157
6158 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006159 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6160 ds_pool_ci.pNext = NULL;
6161 ds_pool_ci.maxSets = 1;
6162 ds_pool_ci.poolSizeCount = 1;
6163 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006164
6165 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006166 err =
6167 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006168 ASSERT_VK_SUCCESS(err);
6169
6170 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006171 dsl_binding.binding = 0;
6172 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6173 dsl_binding.descriptorCount = 1;
6174 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6175 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006176
6177 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006178 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6179 ds_layout_ci.pNext = NULL;
6180 ds_layout_ci.bindingCount = 1;
6181 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006182 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006183 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6184 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006185 ASSERT_VK_SUCCESS(err);
6186
6187 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006188 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006189 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006190 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006191 alloc_info.descriptorPool = ds_pool;
6192 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006193 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6194 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006195 ASSERT_VK_SUCCESS(err);
6196
Karl Schultz6addd812016-02-02 17:17:23 -07006197 VkSampler sampler =
6198 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006199
6200 VkDescriptorImageInfo descriptor_info;
6201 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
6202 descriptor_info.sampler = sampler;
6203
6204 VkWriteDescriptorSet descriptor_write;
6205 memset(&descriptor_write, 0, sizeof(descriptor_write));
6206 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006207 descriptor_write.dstSet = descriptorSet;
6208 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006209 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006210 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6211 descriptor_write.pImageInfo = &descriptor_info;
6212
6213 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6214
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006215 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006216
Chia-I Wuf7458c52015-10-26 21:10:41 +08006217 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6218 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006219}
6220
Karl Schultz6addd812016-02-02 17:17:23 -07006221TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
6222 // Create a single combined Image/Sampler descriptor and send it an invalid
6223 // imageView
6224 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006225
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6227 "Attempted write update to combined "
6228 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -06006229 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006230
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006231 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006232 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006233 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6234 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006235
6236 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006237 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6238 ds_pool_ci.pNext = NULL;
6239 ds_pool_ci.maxSets = 1;
6240 ds_pool_ci.poolSizeCount = 1;
6241 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006242
6243 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006244 err =
6245 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006246 ASSERT_VK_SUCCESS(err);
6247
6248 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006249 dsl_binding.binding = 0;
6250 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6251 dsl_binding.descriptorCount = 1;
6252 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6253 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006254
6255 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006256 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6257 ds_layout_ci.pNext = NULL;
6258 ds_layout_ci.bindingCount = 1;
6259 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006260 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006261 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6262 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006263 ASSERT_VK_SUCCESS(err);
6264
6265 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006266 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006267 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006268 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006269 alloc_info.descriptorPool = ds_pool;
6270 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006271 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6272 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006273 ASSERT_VK_SUCCESS(err);
6274
6275 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006276 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6277 sampler_ci.pNext = NULL;
6278 sampler_ci.magFilter = VK_FILTER_NEAREST;
6279 sampler_ci.minFilter = VK_FILTER_NEAREST;
6280 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6281 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6282 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6283 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6284 sampler_ci.mipLodBias = 1.0;
6285 sampler_ci.anisotropyEnable = VK_FALSE;
6286 sampler_ci.maxAnisotropy = 1;
6287 sampler_ci.compareEnable = VK_FALSE;
6288 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6289 sampler_ci.minLod = 1.0;
6290 sampler_ci.maxLod = 1.0;
6291 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6292 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006293
6294 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006295 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006296 ASSERT_VK_SUCCESS(err);
6297
Karl Schultz6addd812016-02-02 17:17:23 -07006298 VkImageView view =
6299 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006300
6301 VkDescriptorImageInfo descriptor_info;
6302 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
6303 descriptor_info.sampler = sampler;
6304 descriptor_info.imageView = view;
6305
6306 VkWriteDescriptorSet descriptor_write;
6307 memset(&descriptor_write, 0, sizeof(descriptor_write));
6308 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006309 descriptor_write.dstSet = descriptorSet;
6310 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006311 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006312 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6313 descriptor_write.pImageInfo = &descriptor_info;
6314
6315 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6316
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006317 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006318
Chia-I Wuf7458c52015-10-26 21:10:41 +08006319 vkDestroySampler(m_device->device(), sampler, NULL);
6320 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6321 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006322}
6323
Karl Schultz6addd812016-02-02 17:17:23 -07006324TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
6325 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
6326 // into the other
6327 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006328
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6330 " binding #1 with type "
6331 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
6332 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006333
Tobin Ehlis04356f92015-10-27 16:35:27 -06006334 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006335 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006336 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006337 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6338 ds_type_count[0].descriptorCount = 1;
6339 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
6340 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006341
6342 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006343 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6344 ds_pool_ci.pNext = NULL;
6345 ds_pool_ci.maxSets = 1;
6346 ds_pool_ci.poolSizeCount = 2;
6347 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006348
6349 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006350 err =
6351 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006352 ASSERT_VK_SUCCESS(err);
6353 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006354 dsl_binding[0].binding = 0;
6355 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6356 dsl_binding[0].descriptorCount = 1;
6357 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6358 dsl_binding[0].pImmutableSamplers = NULL;
6359 dsl_binding[1].binding = 1;
6360 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6361 dsl_binding[1].descriptorCount = 1;
6362 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
6363 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006364
6365 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006366 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6367 ds_layout_ci.pNext = NULL;
6368 ds_layout_ci.bindingCount = 2;
6369 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006370
6371 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006372 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6373 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006374 ASSERT_VK_SUCCESS(err);
6375
6376 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006377 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006378 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006379 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006380 alloc_info.descriptorPool = ds_pool;
6381 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006382 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6383 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006384 ASSERT_VK_SUCCESS(err);
6385
6386 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006387 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6388 sampler_ci.pNext = NULL;
6389 sampler_ci.magFilter = VK_FILTER_NEAREST;
6390 sampler_ci.minFilter = VK_FILTER_NEAREST;
6391 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6392 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6393 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6394 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6395 sampler_ci.mipLodBias = 1.0;
6396 sampler_ci.anisotropyEnable = VK_FALSE;
6397 sampler_ci.maxAnisotropy = 1;
6398 sampler_ci.compareEnable = VK_FALSE;
6399 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6400 sampler_ci.minLod = 1.0;
6401 sampler_ci.maxLod = 1.0;
6402 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6403 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006404
6405 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006406 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006407 ASSERT_VK_SUCCESS(err);
6408
6409 VkDescriptorImageInfo info = {};
6410 info.sampler = sampler;
6411
6412 VkWriteDescriptorSet descriptor_write;
6413 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
6414 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006415 descriptor_write.dstSet = descriptorSet;
6416 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08006417 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006418 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6419 descriptor_write.pImageInfo = &info;
6420 // This write update should succeed
6421 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6422 // Now perform a copy update that fails due to type mismatch
6423 VkCopyDescriptorSet copy_ds_update;
6424 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6425 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6426 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06006427 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006428 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006429 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08006430 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006431 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6432
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006433 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006434 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006435 m_errorMonitor->SetDesiredFailureMsg(
6436 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006437 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -06006438 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6439 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6440 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006441 copy_ds_update.srcBinding =
6442 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006443 copy_ds_update.dstSet = descriptorSet;
6444 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06006445 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006446 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6447
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006448 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006449
Tobin Ehlis04356f92015-10-27 16:35:27 -06006450 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006451 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006452 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
6453 "update array offset of 0 and update of "
6454 "5 descriptors oversteps total number "
6455 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006456
Tobin Ehlis04356f92015-10-27 16:35:27 -06006457 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6458 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6459 copy_ds_update.srcSet = descriptorSet;
6460 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006461 copy_ds_update.dstSet = descriptorSet;
6462 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006463 copy_ds_update.descriptorCount =
6464 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06006465 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6466
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006467 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006468
Chia-I Wuf7458c52015-10-26 21:10:41 +08006469 vkDestroySampler(m_device->device(), sampler, NULL);
6470 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6471 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006472}
6473
Karl Schultz6addd812016-02-02 17:17:23 -07006474TEST_F(VkLayerTest, NumSamplesMismatch) {
6475 // Create CommandBuffer where MSAA samples doesn't match RenderPass
6476 // sampleCount
6477 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006478
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006480 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006481
Tobin Ehlis3b780662015-05-28 12:11:26 -06006482 ASSERT_NO_FATAL_FAILURE(InitState());
6483 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006484 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06006485 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006486 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006487
6488 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006489 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6490 ds_pool_ci.pNext = NULL;
6491 ds_pool_ci.maxSets = 1;
6492 ds_pool_ci.poolSizeCount = 1;
6493 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006494
Tobin Ehlis3b780662015-05-28 12:11:26 -06006495 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006496 err =
6497 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006498 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006499
Tony Barboureb254902015-07-15 12:50:33 -06006500 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08006501 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06006502 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08006503 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006504 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6505 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006506
Tony Barboureb254902015-07-15 12:50:33 -06006507 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6508 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6509 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006510 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006511 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006512
Tobin Ehlis3b780662015-05-28 12:11:26 -06006513 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006514 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6515 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006516 ASSERT_VK_SUCCESS(err);
6517
6518 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006519 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006520 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006521 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006522 alloc_info.descriptorPool = ds_pool;
6523 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006524 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6525 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006526 ASSERT_VK_SUCCESS(err);
6527
Tony Barboureb254902015-07-15 12:50:33 -06006528 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006529 pipe_ms_state_ci.sType =
6530 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6531 pipe_ms_state_ci.pNext = NULL;
6532 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6533 pipe_ms_state_ci.sampleShadingEnable = 0;
6534 pipe_ms_state_ci.minSampleShading = 1.0;
6535 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006536
Tony Barboureb254902015-07-15 12:50:33 -06006537 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006538 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6539 pipeline_layout_ci.pNext = NULL;
6540 pipeline_layout_ci.setLayoutCount = 1;
6541 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006542
6543 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006544 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6545 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006546 ASSERT_VK_SUCCESS(err);
6547
Karl Schultz6addd812016-02-02 17:17:23 -07006548 VkShaderObj vs(m_device, bindStateVertShaderText,
6549 VK_SHADER_STAGE_VERTEX_BIT, this);
6550 VkShaderObj fs(m_device, bindStateFragShaderText,
6551 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006552 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006553 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006554 VkPipelineObj pipe(m_device);
6555 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006556 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006557 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006558 pipe.SetMSAA(&pipe_ms_state_ci);
6559 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006560
Tony Barbourfe3351b2015-07-28 10:17:20 -06006561 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006562 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6563 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006564
Mark Young29927482016-05-04 14:38:51 -06006565 // Render triangle (the error should trigger on the attempt to draw).
6566 Draw(3, 1, 0, 0);
6567
6568 // Finalize recording of the command buffer
6569 EndCommandBuffer();
6570
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006571 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006572
Chia-I Wuf7458c52015-10-26 21:10:41 +08006573 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6574 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6575 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006576}
Mark Young29927482016-05-04 14:38:51 -06006577
Mark Youngc89c6312016-03-31 16:03:20 -06006578TEST_F(VkLayerTest, NumBlendAttachMismatch) {
6579 // Create Pipeline where the number of blend attachments doesn't match the
6580 // number of color attachments. In this case, we don't add any color
6581 // blend attachments even though we have a color attachment.
6582 VkResult err;
6583
6584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -06006585 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -06006586
6587 ASSERT_NO_FATAL_FAILURE(InitState());
6588 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6589 VkDescriptorPoolSize ds_type_count = {};
6590 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6591 ds_type_count.descriptorCount = 1;
6592
6593 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6594 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6595 ds_pool_ci.pNext = NULL;
6596 ds_pool_ci.maxSets = 1;
6597 ds_pool_ci.poolSizeCount = 1;
6598 ds_pool_ci.pPoolSizes = &ds_type_count;
6599
6600 VkDescriptorPool ds_pool;
6601 err =
6602 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6603 ASSERT_VK_SUCCESS(err);
6604
6605 VkDescriptorSetLayoutBinding dsl_binding = {};
6606 dsl_binding.binding = 0;
6607 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6608 dsl_binding.descriptorCount = 1;
6609 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6610 dsl_binding.pImmutableSamplers = NULL;
6611
6612 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6613 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6614 ds_layout_ci.pNext = NULL;
6615 ds_layout_ci.bindingCount = 1;
6616 ds_layout_ci.pBindings = &dsl_binding;
6617
6618 VkDescriptorSetLayout ds_layout;
6619 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6620 &ds_layout);
6621 ASSERT_VK_SUCCESS(err);
6622
6623 VkDescriptorSet descriptorSet;
6624 VkDescriptorSetAllocateInfo alloc_info = {};
6625 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6626 alloc_info.descriptorSetCount = 1;
6627 alloc_info.descriptorPool = ds_pool;
6628 alloc_info.pSetLayouts = &ds_layout;
6629 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6630 &descriptorSet);
6631 ASSERT_VK_SUCCESS(err);
6632
6633 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
6634 pipe_ms_state_ci.sType =
6635 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6636 pipe_ms_state_ci.pNext = NULL;
6637 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6638 pipe_ms_state_ci.sampleShadingEnable = 0;
6639 pipe_ms_state_ci.minSampleShading = 1.0;
6640 pipe_ms_state_ci.pSampleMask = NULL;
6641
6642 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6643 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6644 pipeline_layout_ci.pNext = NULL;
6645 pipeline_layout_ci.setLayoutCount = 1;
6646 pipeline_layout_ci.pSetLayouts = &ds_layout;
6647
6648 VkPipelineLayout pipeline_layout;
6649 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6650 &pipeline_layout);
6651 ASSERT_VK_SUCCESS(err);
6652
6653 VkShaderObj vs(m_device, bindStateVertShaderText,
6654 VK_SHADER_STAGE_VERTEX_BIT, this);
6655 VkShaderObj fs(m_device, bindStateFragShaderText,
6656 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006657 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06006658 // but add it to be able to run on more devices
6659 VkPipelineObj pipe(m_device);
6660 pipe.AddShader(&vs);
6661 pipe.AddShader(&fs);
6662 pipe.SetMSAA(&pipe_ms_state_ci);
6663 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6664
6665 BeginCommandBuffer();
6666 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6667 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6668
Mark Young29927482016-05-04 14:38:51 -06006669 // Render triangle (the error should trigger on the attempt to draw).
6670 Draw(3, 1, 0, 0);
6671
6672 // Finalize recording of the command buffer
6673 EndCommandBuffer();
6674
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006675 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06006676
6677 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6678 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6679 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6680}
Mark Young29927482016-05-04 14:38:51 -06006681
Karl Schultz6addd812016-02-02 17:17:23 -07006682TEST_F(VkLayerTest, ClearCmdNoDraw) {
6683 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
6684 // to issuing a Draw
6685 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006686
Karl Schultz6addd812016-02-02 17:17:23 -07006687 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07006688 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006689 "vkCmdClearAttachments() issued on CB object ");
6690
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006691 ASSERT_NO_FATAL_FAILURE(InitState());
6692 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006693
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006694 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006695 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6696 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006697
6698 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006699 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6700 ds_pool_ci.pNext = NULL;
6701 ds_pool_ci.maxSets = 1;
6702 ds_pool_ci.poolSizeCount = 1;
6703 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006704
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006705 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006706 err =
6707 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006708 ASSERT_VK_SUCCESS(err);
6709
Tony Barboureb254902015-07-15 12:50:33 -06006710 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006711 dsl_binding.binding = 0;
6712 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6713 dsl_binding.descriptorCount = 1;
6714 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6715 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006716
Tony Barboureb254902015-07-15 12:50:33 -06006717 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006718 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6719 ds_layout_ci.pNext = NULL;
6720 ds_layout_ci.bindingCount = 1;
6721 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006722
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006723 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006724 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6725 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006726 ASSERT_VK_SUCCESS(err);
6727
6728 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006729 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006730 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006731 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006732 alloc_info.descriptorPool = ds_pool;
6733 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006734 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6735 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006736 ASSERT_VK_SUCCESS(err);
6737
Tony Barboureb254902015-07-15 12:50:33 -06006738 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006739 pipe_ms_state_ci.sType =
6740 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6741 pipe_ms_state_ci.pNext = NULL;
6742 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6743 pipe_ms_state_ci.sampleShadingEnable = 0;
6744 pipe_ms_state_ci.minSampleShading = 1.0;
6745 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006746
Tony Barboureb254902015-07-15 12:50:33 -06006747 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006748 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6749 pipeline_layout_ci.pNext = NULL;
6750 pipeline_layout_ci.setLayoutCount = 1;
6751 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006752
6753 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006754 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6755 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006756 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006757
Karl Schultz6addd812016-02-02 17:17:23 -07006758 VkShaderObj vs(m_device, bindStateVertShaderText,
6759 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006760 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006761 // on more devices
6762 VkShaderObj fs(m_device, bindStateFragShaderText,
6763 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006764
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006765 VkPipelineObj pipe(m_device);
6766 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006767 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006768 pipe.SetMSAA(&pipe_ms_state_ci);
6769 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006770
6771 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006772
Karl Schultz6addd812016-02-02 17:17:23 -07006773 // Main thing we care about for this test is that the VkImage obj we're
6774 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006775 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006776 VkClearAttachment color_attachment;
6777 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6778 color_attachment.clearValue.color.float32[0] = 1.0;
6779 color_attachment.clearValue.color.float32[1] = 1.0;
6780 color_attachment.clearValue.color.float32[2] = 1.0;
6781 color_attachment.clearValue.color.float32[3] = 1.0;
6782 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006783 VkClearRect clear_rect = {
6784 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006785
Karl Schultz6addd812016-02-02 17:17:23 -07006786 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
6787 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006788
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006789 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006790
Chia-I Wuf7458c52015-10-26 21:10:41 +08006791 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6792 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6793 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006794}
6795
Karl Schultz6addd812016-02-02 17:17:23 -07006796TEST_F(VkLayerTest, VtxBufferBadIndex) {
6797 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006798
Karl Schultz6addd812016-02-02 17:17:23 -07006799 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006800 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07006801 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006802
Tobin Ehlis502480b2015-06-24 15:53:07 -06006803 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06006804 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06006805 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006806
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006807 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006808 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6809 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006810
6811 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006812 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6813 ds_pool_ci.pNext = NULL;
6814 ds_pool_ci.maxSets = 1;
6815 ds_pool_ci.poolSizeCount = 1;
6816 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006817
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006818 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006819 err =
6820 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006821 ASSERT_VK_SUCCESS(err);
6822
Tony Barboureb254902015-07-15 12:50:33 -06006823 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006824 dsl_binding.binding = 0;
6825 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6826 dsl_binding.descriptorCount = 1;
6827 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6828 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006829
Tony Barboureb254902015-07-15 12:50:33 -06006830 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006831 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6832 ds_layout_ci.pNext = NULL;
6833 ds_layout_ci.bindingCount = 1;
6834 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006835
Tobin Ehlis502480b2015-06-24 15:53:07 -06006836 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006837 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6838 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006839 ASSERT_VK_SUCCESS(err);
6840
6841 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006842 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006843 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006844 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006845 alloc_info.descriptorPool = ds_pool;
6846 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006847 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6848 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006849 ASSERT_VK_SUCCESS(err);
6850
Tony Barboureb254902015-07-15 12:50:33 -06006851 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006852 pipe_ms_state_ci.sType =
6853 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6854 pipe_ms_state_ci.pNext = NULL;
6855 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6856 pipe_ms_state_ci.sampleShadingEnable = 0;
6857 pipe_ms_state_ci.minSampleShading = 1.0;
6858 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006859
Tony Barboureb254902015-07-15 12:50:33 -06006860 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006861 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6862 pipeline_layout_ci.pNext = NULL;
6863 pipeline_layout_ci.setLayoutCount = 1;
6864 pipeline_layout_ci.pSetLayouts = &ds_layout;
6865 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006866
Karl Schultz6addd812016-02-02 17:17:23 -07006867 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6868 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006869 ASSERT_VK_SUCCESS(err);
6870
Karl Schultz6addd812016-02-02 17:17:23 -07006871 VkShaderObj vs(m_device, bindStateVertShaderText,
6872 VK_SHADER_STAGE_VERTEX_BIT, this);
6873 VkShaderObj fs(m_device, bindStateFragShaderText,
6874 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006875 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006876 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006877 VkPipelineObj pipe(m_device);
6878 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006879 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006880 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006881 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006882 pipe.SetViewport(m_viewports);
6883 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006884 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006885
6886 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006887 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6888 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006889 // Don't care about actual data, just need to get to draw to flag error
6890 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07006891 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
6892 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006893 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06006894 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006895
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006896 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006897
Chia-I Wuf7458c52015-10-26 21:10:41 +08006898 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6899 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6900 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006901}
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06006902// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
6903TEST_F(VkLayerTest, InvalidImageLayout) {
6904 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
6905 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
6906 "images in the wrong layout when they're copied or transitioned.");
6907 // 3 in ValidateCmdBufImageLayouts
6908 // * -1 Attempt to submit cmd buf w/ deleted image
6909 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
6910 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
6911 m_errorMonitor->SetDesiredFailureMsg(
6912 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6913 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
6914
6915 ASSERT_NO_FATAL_FAILURE(InitState());
6916 // Create src & dst images to use for copy operations
6917 VkImage src_image;
6918 VkImage dst_image;
6919
6920 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6921 const int32_t tex_width = 32;
6922 const int32_t tex_height = 32;
6923
6924 VkImageCreateInfo image_create_info = {};
6925 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6926 image_create_info.pNext = NULL;
6927 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6928 image_create_info.format = tex_format;
6929 image_create_info.extent.width = tex_width;
6930 image_create_info.extent.height = tex_height;
6931 image_create_info.extent.depth = 1;
6932 image_create_info.mipLevels = 1;
6933 image_create_info.arrayLayers = 4;
6934 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6935 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6936 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6937 image_create_info.flags = 0;
6938
6939 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
6940 ASSERT_VK_SUCCESS(err);
6941 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
6942 ASSERT_VK_SUCCESS(err);
6943
6944 BeginCommandBuffer();
6945 VkImageCopy copyRegion;
6946 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6947 copyRegion.srcSubresource.mipLevel = 0;
6948 copyRegion.srcSubresource.baseArrayLayer = 0;
6949 copyRegion.srcSubresource.layerCount = 1;
6950 copyRegion.srcOffset.x = 0;
6951 copyRegion.srcOffset.y = 0;
6952 copyRegion.srcOffset.z = 0;
6953 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6954 copyRegion.dstSubresource.mipLevel = 0;
6955 copyRegion.dstSubresource.baseArrayLayer = 0;
6956 copyRegion.dstSubresource.layerCount = 1;
6957 copyRegion.dstOffset.x = 0;
6958 copyRegion.dstOffset.y = 0;
6959 copyRegion.dstOffset.z = 0;
6960 copyRegion.extent.width = 1;
6961 copyRegion.extent.height = 1;
6962 copyRegion.extent.depth = 1;
6963 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6964 m_errorMonitor->VerifyFound();
6965 // Now cause error due to src image layout changing
6966 m_errorMonitor->SetDesiredFailureMsg(
6967 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6968 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
6969 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6970 m_errorMonitor->VerifyFound();
6971 // Final src error is due to bad layout type
6972 m_errorMonitor->SetDesiredFailureMsg(
6973 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6974 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
6975 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6976 m_errorMonitor->VerifyFound();
6977 // Now verify same checks for dst
6978 m_errorMonitor->SetDesiredFailureMsg(
6979 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6980 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
6981 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6982 m_errorMonitor->VerifyFound();
6983 // Now cause error due to src image layout changing
6984 m_errorMonitor->SetDesiredFailureMsg(
6985 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6986 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
6987 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
6988 m_errorMonitor->VerifyFound();
6989 m_errorMonitor->SetDesiredFailureMsg(
6990 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6991 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
6992 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
6993 m_errorMonitor->VerifyFound();
6994 // Now cause error due to bad image layout transition in PipelineBarrier
6995 VkImageMemoryBarrier image_barrier[1] = {};
6996 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
6997 image_barrier[0].image = src_image;
6998 image_barrier[0].subresourceRange.layerCount = 2;
6999 image_barrier[0].subresourceRange.levelCount = 2;
7000 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7001 m_errorMonitor->SetDesiredFailureMsg(
7002 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7003 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
7004 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
7005 m_errorMonitor->VerifyFound();
7006
7007 // Finally some layout errors at RenderPass create time
7008 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
7009 VkAttachmentReference attach = {};
7010 // perf warning for GENERAL layout w/ non-DS input attachment
7011 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7012 VkSubpassDescription subpass = {};
7013 subpass.inputAttachmentCount = 1;
7014 subpass.pInputAttachments = &attach;
7015 VkRenderPassCreateInfo rpci = {};
7016 rpci.subpassCount = 1;
7017 rpci.pSubpasses = &subpass;
7018 rpci.attachmentCount = 1;
7019 VkAttachmentDescription attach_desc = {};
7020 attach_desc.format = VK_FORMAT_UNDEFINED;
7021 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -06007022 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06007023 VkRenderPass rp;
7024 m_errorMonitor->SetDesiredFailureMsg(
7025 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7026 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
7027 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7028 m_errorMonitor->VerifyFound();
7029 // error w/ non-general layout
7030 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7031
7032 m_errorMonitor->SetDesiredFailureMsg(
7033 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7034 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
7035 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7036 m_errorMonitor->VerifyFound();
7037 subpass.inputAttachmentCount = 0;
7038 subpass.colorAttachmentCount = 1;
7039 subpass.pColorAttachments = &attach;
7040 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7041 // perf warning for GENERAL layout on color attachment
7042 m_errorMonitor->SetDesiredFailureMsg(
7043 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7044 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
7045 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7046 m_errorMonitor->VerifyFound();
7047 // error w/ non-color opt or GENERAL layout for color attachment
7048 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7049 m_errorMonitor->SetDesiredFailureMsg(
7050 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7051 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
7052 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7053 m_errorMonitor->VerifyFound();
7054 subpass.colorAttachmentCount = 0;
7055 subpass.pDepthStencilAttachment = &attach;
7056 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7057 // perf warning for GENERAL layout on DS attachment
7058 m_errorMonitor->SetDesiredFailureMsg(
7059 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7060 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
7061 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7062 m_errorMonitor->VerifyFound();
7063 // error w/ non-ds opt or GENERAL layout for color attachment
7064 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7065 m_errorMonitor->SetDesiredFailureMsg(
7066 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7067 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
7068 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7069 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -06007070 // For this error we need a valid renderpass so create default one
7071 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7072 attach.attachment = 0;
7073 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
7074 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
7075 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
7076 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
7077 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
7078 // Can't do a CLEAR load on READ_ONLY initialLayout
7079 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
7080 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7081 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
7082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7083 " with invalid first layout "
7084 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
7085 "ONLY_OPTIMAL");
7086 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7087 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06007088
7089 vkDestroyImage(m_device->device(), src_image, NULL);
7090 vkDestroyImage(m_device->device(), dst_image, NULL);
7091}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007092#endif // DRAW_STATE_TESTS
7093
Tobin Ehlis0788f522015-05-26 16:11:58 -06007094#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06007095#if GTEST_IS_THREADSAFE
7096struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007097 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007098 VkEvent event;
7099 bool bailout;
7100};
7101
Karl Schultz6addd812016-02-02 17:17:23 -07007102extern "C" void *AddToCommandBuffer(void *arg) {
7103 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007104
Karl Schultz6addd812016-02-02 17:17:23 -07007105 for (int i = 0; i < 10000; i++) {
7106 vkCmdSetEvent(data->commandBuffer, data->event,
7107 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007108 if (data->bailout) {
7109 break;
7110 }
7111 }
7112 return NULL;
7113}
7114
Karl Schultz6addd812016-02-02 17:17:23 -07007115TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007116 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007117
Karl Schultz6addd812016-02-02 17:17:23 -07007118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7119 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007120
Mike Stroyanaccf7692015-05-12 16:00:45 -06007121 ASSERT_NO_FATAL_FAILURE(InitState());
7122 ASSERT_NO_FATAL_FAILURE(InitViewport());
7123 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7124
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007125 // Calls AllocateCommandBuffers
7126 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06007127
7128 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007129 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007130
7131 VkEventCreateInfo event_info;
7132 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007133 VkResult err;
7134
7135 memset(&event_info, 0, sizeof(event_info));
7136 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
7137
Chia-I Wuf7458c52015-10-26 21:10:41 +08007138 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007139 ASSERT_VK_SUCCESS(err);
7140
Mike Stroyanaccf7692015-05-12 16:00:45 -06007141 err = vkResetEvent(device(), event);
7142 ASSERT_VK_SUCCESS(err);
7143
7144 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007145 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007146 data.event = event;
7147 data.bailout = false;
7148 m_errorMonitor->SetBailout(&data.bailout);
7149 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007150 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007151 // Add many entries to command buffer from this thread at the same time.
7152 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06007153
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007154 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007155 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007156
Mike Stroyan10b8cb72016-01-22 15:22:03 -07007157 m_errorMonitor->SetBailout(NULL);
7158
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007159 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007160
Chia-I Wuf7458c52015-10-26 21:10:41 +08007161 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007162}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007163#endif // GTEST_IS_THREADSAFE
7164#endif // THREADING_TESTS
7165
Chris Forbes9f7ff632015-05-25 11:13:08 +12007166#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007167TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
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 header");
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 = 4;
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
Karl Schultz6addd812016-02-02 17:17:23 -07007192TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007194 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007195
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007196 ASSERT_NO_FATAL_FAILURE(InitState());
7197 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7198
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007199 VkShaderModule module;
7200 VkShaderModuleCreateInfo moduleCreateInfo;
7201 struct icd_spv_header spv;
7202
7203 spv.magic = ~ICD_SPV_MAGIC;
7204 spv.version = ICD_SPV_VERSION;
7205 spv.gen_magic = 0;
7206
7207 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7208 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007209 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007210 moduleCreateInfo.codeSize = sizeof(spv) + 10;
7211 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007212 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007213
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007214 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007215}
7216
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007217#if 0
7218// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07007219TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007221 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007222
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007223 ASSERT_NO_FATAL_FAILURE(InitState());
7224 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7225
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007226 VkShaderModule module;
7227 VkShaderModuleCreateInfo moduleCreateInfo;
7228 struct icd_spv_header spv;
7229
7230 spv.magic = ICD_SPV_MAGIC;
7231 spv.version = ~ICD_SPV_VERSION;
7232 spv.gen_magic = 0;
7233
7234 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7235 moduleCreateInfo.pNext = NULL;
7236
Karl Schultz6addd812016-02-02 17:17:23 -07007237 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007238 moduleCreateInfo.codeSize = sizeof(spv) + 10;
7239 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007240 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007241
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007242 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007243}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007244#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007245
Karl Schultz6addd812016-02-02 17:17:23 -07007246TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007248 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007249
Chris Forbes9f7ff632015-05-25 11:13:08 +12007250 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007251 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12007252
7253 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007254 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12007255 "\n"
7256 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007257 "out gl_PerVertex {\n"
7258 " vec4 gl_Position;\n"
7259 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12007260 "void main(){\n"
7261 " gl_Position = vec4(1);\n"
7262 " x = 0;\n"
7263 "}\n";
7264 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007265 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12007266 "\n"
7267 "layout(location=0) out vec4 color;\n"
7268 "void main(){\n"
7269 " color = vec4(1);\n"
7270 "}\n";
7271
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007272 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7273 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12007274
7275 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007276 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12007277 pipe.AddShader(&vs);
7278 pipe.AddShader(&fs);
7279
Chris Forbes9f7ff632015-05-25 11:13:08 +12007280 VkDescriptorSetObj descriptorSet(m_device);
7281 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007282 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12007283
Tony Barbour5781e8f2015-08-04 16:23:11 -06007284 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12007285
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007286 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12007287}
Chris Forbes9f7ff632015-05-25 11:13:08 +12007288
Karl Schultz6addd812016-02-02 17:17:23 -07007289TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007290 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007291 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007292
Chris Forbes59cb88d2015-05-25 11:13:13 +12007293 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007294 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12007295
7296 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007297 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12007298 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007299 "out gl_PerVertex {\n"
7300 " vec4 gl_Position;\n"
7301 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12007302 "void main(){\n"
7303 " gl_Position = vec4(1);\n"
7304 "}\n";
7305 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007306 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12007307 "\n"
7308 "layout(location=0) in float x;\n"
7309 "layout(location=0) out vec4 color;\n"
7310 "void main(){\n"
7311 " color = vec4(x);\n"
7312 "}\n";
7313
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007314 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7315 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12007316
7317 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007318 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12007319 pipe.AddShader(&vs);
7320 pipe.AddShader(&fs);
7321
Chris Forbes59cb88d2015-05-25 11:13:13 +12007322 VkDescriptorSetObj descriptorSet(m_device);
7323 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007324 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12007325
Tony Barbour5781e8f2015-08-04 16:23:11 -06007326 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12007327
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007328 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12007329}
7330
Karl Schultz6addd812016-02-02 17:17:23 -07007331TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13007332 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007333 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13007334
7335 ASSERT_NO_FATAL_FAILURE(InitState());
7336 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7337
7338 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007339 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007340 "\n"
7341 "out gl_PerVertex {\n"
7342 " vec4 gl_Position;\n"
7343 "};\n"
7344 "void main(){\n"
7345 " gl_Position = vec4(1);\n"
7346 "}\n";
7347 char const *fsSource =
7348 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007349 "\n"
7350 "in block { layout(location=0) float x; } ins;\n"
7351 "layout(location=0) out vec4 color;\n"
7352 "void main(){\n"
7353 " color = vec4(ins.x);\n"
7354 "}\n";
7355
7356 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7357 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7358
7359 VkPipelineObj pipe(m_device);
7360 pipe.AddColorAttachment();
7361 pipe.AddShader(&vs);
7362 pipe.AddShader(&fs);
7363
7364 VkDescriptorSetObj descriptorSet(m_device);
7365 descriptorSet.AppendDummy();
7366 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7367
7368 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7369
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007370 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13007371}
7372
Karl Schultz6addd812016-02-02 17:17:23 -07007373TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13007374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13007375 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07007376 "output arr[2] of float32' vs 'ptr to "
7377 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13007378
7379 ASSERT_NO_FATAL_FAILURE(InitState());
7380 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7381
7382 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007383 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13007384 "\n"
7385 "layout(location=0) out float x[2];\n"
7386 "out gl_PerVertex {\n"
7387 " vec4 gl_Position;\n"
7388 "};\n"
7389 "void main(){\n"
7390 " x[0] = 0; x[1] = 0;\n"
7391 " gl_Position = vec4(1);\n"
7392 "}\n";
7393 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007394 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13007395 "\n"
7396 "layout(location=0) in float x[3];\n"
7397 "layout(location=0) out vec4 color;\n"
7398 "void main(){\n"
7399 " color = vec4(x[0] + x[1] + x[2]);\n"
7400 "}\n";
7401
7402 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7403 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7404
7405 VkPipelineObj pipe(m_device);
7406 pipe.AddColorAttachment();
7407 pipe.AddShader(&vs);
7408 pipe.AddShader(&fs);
7409
7410 VkDescriptorSetObj descriptorSet(m_device);
7411 descriptorSet.AppendDummy();
7412 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7413
7414 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7415
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007416 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13007417}
7418
Karl Schultz6addd812016-02-02 17:17:23 -07007419TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007421 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007422
Chris Forbesb56af562015-05-25 11:13:17 +12007423 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007424 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12007425
7426 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007427 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007428 "\n"
7429 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007430 "out gl_PerVertex {\n"
7431 " vec4 gl_Position;\n"
7432 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007433 "void main(){\n"
7434 " x = 0;\n"
7435 " gl_Position = vec4(1);\n"
7436 "}\n";
7437 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007438 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007439 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007440 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12007441 "layout(location=0) out vec4 color;\n"
7442 "void main(){\n"
7443 " color = vec4(x);\n"
7444 "}\n";
7445
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007446 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7447 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12007448
7449 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007450 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12007451 pipe.AddShader(&vs);
7452 pipe.AddShader(&fs);
7453
Chris Forbesb56af562015-05-25 11:13:17 +12007454 VkDescriptorSetObj descriptorSet(m_device);
7455 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007456 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12007457
Tony Barbour5781e8f2015-08-04 16:23:11 -06007458 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12007459
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007460 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12007461}
7462
Karl Schultz6addd812016-02-02 17:17:23 -07007463TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13007464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007465 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13007466
7467 ASSERT_NO_FATAL_FAILURE(InitState());
7468 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7469
7470 char const *vsSource =
7471 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007472 "\n"
7473 "out block { layout(location=0) int x; } outs;\n"
7474 "out gl_PerVertex {\n"
7475 " vec4 gl_Position;\n"
7476 "};\n"
7477 "void main(){\n"
7478 " outs.x = 0;\n"
7479 " gl_Position = vec4(1);\n"
7480 "}\n";
7481 char const *fsSource =
7482 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007483 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007484 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13007485 "layout(location=0) out vec4 color;\n"
7486 "void main(){\n"
7487 " color = vec4(ins.x);\n"
7488 "}\n";
7489
7490 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7491 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7492
7493 VkPipelineObj pipe(m_device);
7494 pipe.AddColorAttachment();
7495 pipe.AddShader(&vs);
7496 pipe.AddShader(&fs);
7497
7498 VkDescriptorSetObj descriptorSet(m_device);
7499 descriptorSet.AppendDummy();
7500 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7501
7502 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7503
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007504 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13007505}
7506
7507TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
7508 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7509 "location 0.0 which is not written by vertex shader");
7510
7511 ASSERT_NO_FATAL_FAILURE(InitState());
7512 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7513
7514 char const *vsSource =
7515 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007516 "\n"
7517 "out block { layout(location=1) float x; } outs;\n"
7518 "out gl_PerVertex {\n"
7519 " vec4 gl_Position;\n"
7520 "};\n"
7521 "void main(){\n"
7522 " outs.x = 0;\n"
7523 " gl_Position = vec4(1);\n"
7524 "}\n";
7525 char const *fsSource =
7526 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007527 "\n"
7528 "in block { layout(location=0) float x; } ins;\n"
7529 "layout(location=0) out vec4 color;\n"
7530 "void main(){\n"
7531 " color = vec4(ins.x);\n"
7532 "}\n";
7533
7534 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7535 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7536
7537 VkPipelineObj pipe(m_device);
7538 pipe.AddColorAttachment();
7539 pipe.AddShader(&vs);
7540 pipe.AddShader(&fs);
7541
7542 VkDescriptorSetObj descriptorSet(m_device);
7543 descriptorSet.AppendDummy();
7544 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7545
7546 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7547
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007548 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13007549}
7550
7551TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
7552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7553 "location 0.1 which is not written by vertex shader");
7554
7555 ASSERT_NO_FATAL_FAILURE(InitState());
7556 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7557
7558 char const *vsSource =
7559 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007560 "\n"
7561 "out block { layout(location=0, component=0) float x; } outs;\n"
7562 "out gl_PerVertex {\n"
7563 " vec4 gl_Position;\n"
7564 "};\n"
7565 "void main(){\n"
7566 " outs.x = 0;\n"
7567 " gl_Position = vec4(1);\n"
7568 "}\n";
7569 char const *fsSource =
7570 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007571 "\n"
7572 "in block { layout(location=0, component=1) float x; } ins;\n"
7573 "layout(location=0) out vec4 color;\n"
7574 "void main(){\n"
7575 " color = vec4(ins.x);\n"
7576 "}\n";
7577
7578 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7579 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7580
7581 VkPipelineObj pipe(m_device);
7582 pipe.AddColorAttachment();
7583 pipe.AddShader(&vs);
7584 pipe.AddShader(&fs);
7585
7586 VkDescriptorSetObj descriptorSet(m_device);
7587 descriptorSet.AppendDummy();
7588 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7589
7590 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7591
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007592 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13007593}
7594
Karl Schultz6addd812016-02-02 17:17:23 -07007595TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007597 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007598
Chris Forbesde136e02015-05-25 11:13:28 +12007599 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007600 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12007601
7602 VkVertexInputBindingDescription input_binding;
7603 memset(&input_binding, 0, sizeof(input_binding));
7604
7605 VkVertexInputAttributeDescription input_attrib;
7606 memset(&input_attrib, 0, sizeof(input_attrib));
7607 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7608
7609 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007610 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007611 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007612 "out gl_PerVertex {\n"
7613 " vec4 gl_Position;\n"
7614 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007615 "void main(){\n"
7616 " gl_Position = vec4(1);\n"
7617 "}\n";
7618 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007619 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007620 "\n"
7621 "layout(location=0) out vec4 color;\n"
7622 "void main(){\n"
7623 " color = vec4(1);\n"
7624 "}\n";
7625
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007626 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7627 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12007628
7629 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007630 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12007631 pipe.AddShader(&vs);
7632 pipe.AddShader(&fs);
7633
7634 pipe.AddVertexInputBindings(&input_binding, 1);
7635 pipe.AddVertexInputAttribs(&input_attrib, 1);
7636
Chris Forbesde136e02015-05-25 11:13:28 +12007637 VkDescriptorSetObj descriptorSet(m_device);
7638 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007639 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12007640
Tony Barbour5781e8f2015-08-04 16:23:11 -06007641 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12007642
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007643 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12007644}
7645
Karl Schultz6addd812016-02-02 17:17:23 -07007646TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007648 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13007649
7650 ASSERT_NO_FATAL_FAILURE(InitState());
7651 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7652
7653 VkVertexInputBindingDescription input_binding;
7654 memset(&input_binding, 0, sizeof(input_binding));
7655
7656 VkVertexInputAttributeDescription input_attrib;
7657 memset(&input_attrib, 0, sizeof(input_attrib));
7658 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7659
7660 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007661 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007662 "\n"
7663 "layout(location=1) in float x;\n"
7664 "out gl_PerVertex {\n"
7665 " vec4 gl_Position;\n"
7666 "};\n"
7667 "void main(){\n"
7668 " gl_Position = vec4(x);\n"
7669 "}\n";
7670 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007671 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007672 "\n"
7673 "layout(location=0) out vec4 color;\n"
7674 "void main(){\n"
7675 " color = vec4(1);\n"
7676 "}\n";
7677
7678 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7679 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7680
7681 VkPipelineObj pipe(m_device);
7682 pipe.AddColorAttachment();
7683 pipe.AddShader(&vs);
7684 pipe.AddShader(&fs);
7685
7686 pipe.AddVertexInputBindings(&input_binding, 1);
7687 pipe.AddVertexInputAttribs(&input_attrib, 1);
7688
7689 VkDescriptorSetObj descriptorSet(m_device);
7690 descriptorSet.AppendDummy();
7691 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7692
7693 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7694
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007695 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13007696}
7697
Karl Schultz6addd812016-02-02 17:17:23 -07007698TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
7699 m_errorMonitor->SetDesiredFailureMsg(
7700 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007701 "VS consumes input at location 0 but not provided");
7702
Chris Forbes62e8e502015-05-25 11:13:29 +12007703 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007704 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12007705
7706 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007707 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007708 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007709 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07007710 "out gl_PerVertex {\n"
7711 " vec4 gl_Position;\n"
7712 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007713 "void main(){\n"
7714 " gl_Position = x;\n"
7715 "}\n";
7716 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007717 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007718 "\n"
7719 "layout(location=0) out vec4 color;\n"
7720 "void main(){\n"
7721 " color = vec4(1);\n"
7722 "}\n";
7723
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007724 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7725 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12007726
7727 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007728 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12007729 pipe.AddShader(&vs);
7730 pipe.AddShader(&fs);
7731
Chris Forbes62e8e502015-05-25 11:13:29 +12007732 VkDescriptorSetObj descriptorSet(m_device);
7733 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007734 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12007735
Tony Barbour5781e8f2015-08-04 16:23:11 -06007736 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12007737
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007738 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12007739}
7740
Karl Schultz6addd812016-02-02 17:17:23 -07007741TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
7742 m_errorMonitor->SetDesiredFailureMsg(
7743 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007744 "location 0 does not match VS input type");
7745
Chris Forbesc97d98e2015-05-25 11:13:31 +12007746 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007747 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12007748
7749 VkVertexInputBindingDescription input_binding;
7750 memset(&input_binding, 0, sizeof(input_binding));
7751
7752 VkVertexInputAttributeDescription input_attrib;
7753 memset(&input_attrib, 0, sizeof(input_attrib));
7754 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7755
7756 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007757 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007758 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007759 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007760 "out gl_PerVertex {\n"
7761 " vec4 gl_Position;\n"
7762 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007763 "void main(){\n"
7764 " gl_Position = vec4(x);\n"
7765 "}\n";
7766 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007767 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007768 "\n"
7769 "layout(location=0) out vec4 color;\n"
7770 "void main(){\n"
7771 " color = vec4(1);\n"
7772 "}\n";
7773
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007774 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7775 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12007776
7777 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007778 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12007779 pipe.AddShader(&vs);
7780 pipe.AddShader(&fs);
7781
7782 pipe.AddVertexInputBindings(&input_binding, 1);
7783 pipe.AddVertexInputAttribs(&input_attrib, 1);
7784
Chris Forbesc97d98e2015-05-25 11:13:31 +12007785 VkDescriptorSetObj descriptorSet(m_device);
7786 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007787 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12007788
Tony Barbour5781e8f2015-08-04 16:23:11 -06007789 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12007790
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007791 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12007792}
7793
Chris Forbesc68b43c2016-04-06 11:18:47 +12007794TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
7795 m_errorMonitor->SetDesiredFailureMsg(
7796 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7797 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
7798
7799 ASSERT_NO_FATAL_FAILURE(InitState());
7800 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7801
7802 char const *vsSource =
7803 "#version 450\n"
7804 "\n"
7805 "out gl_PerVertex {\n"
7806 " vec4 gl_Position;\n"
7807 "};\n"
7808 "void main(){\n"
7809 " gl_Position = vec4(1);\n"
7810 "}\n";
7811 char const *fsSource =
7812 "#version 450\n"
7813 "\n"
7814 "layout(location=0) out vec4 color;\n"
7815 "void main(){\n"
7816 " color = vec4(1);\n"
7817 "}\n";
7818
7819 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7820 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7821
7822 VkPipelineObj pipe(m_device);
7823 pipe.AddColorAttachment();
7824 pipe.AddShader(&vs);
7825 pipe.AddShader(&vs);
7826 pipe.AddShader(&fs);
7827
7828 VkDescriptorSetObj descriptorSet(m_device);
7829 descriptorSet.AppendDummy();
7830 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7831
7832 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7833
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007834 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12007835}
7836
Karl Schultz6addd812016-02-02 17:17:23 -07007837TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007838 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007839
7840 ASSERT_NO_FATAL_FAILURE(InitState());
7841 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7842
7843 VkVertexInputBindingDescription input_binding;
7844 memset(&input_binding, 0, sizeof(input_binding));
7845
7846 VkVertexInputAttributeDescription input_attribs[2];
7847 memset(input_attribs, 0, sizeof(input_attribs));
7848
7849 for (int i = 0; i < 2; i++) {
7850 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7851 input_attribs[i].location = i;
7852 }
7853
7854 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007855 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007856 "\n"
7857 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007858 "out gl_PerVertex {\n"
7859 " vec4 gl_Position;\n"
7860 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007861 "void main(){\n"
7862 " gl_Position = x[0] + x[1];\n"
7863 "}\n";
7864 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007865 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007866 "\n"
7867 "layout(location=0) out vec4 color;\n"
7868 "void main(){\n"
7869 " color = vec4(1);\n"
7870 "}\n";
7871
7872 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7873 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7874
7875 VkPipelineObj pipe(m_device);
7876 pipe.AddColorAttachment();
7877 pipe.AddShader(&vs);
7878 pipe.AddShader(&fs);
7879
7880 pipe.AddVertexInputBindings(&input_binding, 1);
7881 pipe.AddVertexInputAttribs(input_attribs, 2);
7882
7883 VkDescriptorSetObj descriptorSet(m_device);
7884 descriptorSet.AppendDummy();
7885 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7886
7887 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7888
7889 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007890 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007891}
7892
Chris Forbes2682b242015-11-24 11:13:14 +13007893TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
7894{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007895 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007896
7897 ASSERT_NO_FATAL_FAILURE(InitState());
7898 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7899
7900 VkVertexInputBindingDescription input_binding;
7901 memset(&input_binding, 0, sizeof(input_binding));
7902
7903 VkVertexInputAttributeDescription input_attribs[2];
7904 memset(input_attribs, 0, sizeof(input_attribs));
7905
7906 for (int i = 0; i < 2; i++) {
7907 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7908 input_attribs[i].location = i;
7909 }
7910
7911 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007912 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007913 "\n"
7914 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07007915 "out gl_PerVertex {\n"
7916 " vec4 gl_Position;\n"
7917 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007918 "void main(){\n"
7919 " gl_Position = x[0] + x[1];\n"
7920 "}\n";
7921 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007922 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007923 "\n"
7924 "layout(location=0) out vec4 color;\n"
7925 "void main(){\n"
7926 " color = vec4(1);\n"
7927 "}\n";
7928
7929 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7930 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7931
7932 VkPipelineObj pipe(m_device);
7933 pipe.AddColorAttachment();
7934 pipe.AddShader(&vs);
7935 pipe.AddShader(&fs);
7936
7937 pipe.AddVertexInputBindings(&input_binding, 1);
7938 pipe.AddVertexInputAttribs(input_attribs, 2);
7939
7940 VkDescriptorSetObj descriptorSet(m_device);
7941 descriptorSet.AppendDummy();
7942 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7943
7944 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7945
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007946 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007947}
Chris Forbes2682b242015-11-24 11:13:14 +13007948
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007949TEST_F(VkLayerTest, CreatePipelineSimplePositive)
7950{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007951 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007952
7953 ASSERT_NO_FATAL_FAILURE(InitState());
7954 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7955
7956 char const *vsSource =
7957 "#version 450\n"
7958 "out gl_PerVertex {\n"
7959 " vec4 gl_Position;\n"
7960 "};\n"
7961 "void main(){\n"
7962 " gl_Position = vec4(0);\n"
7963 "}\n";
7964 char const *fsSource =
7965 "#version 450\n"
7966 "\n"
7967 "layout(location=0) out vec4 color;\n"
7968 "void main(){\n"
7969 " color = vec4(1);\n"
7970 "}\n";
7971
7972 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7973 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7974
7975 VkPipelineObj pipe(m_device);
7976 pipe.AddColorAttachment();
7977 pipe.AddShader(&vs);
7978 pipe.AddShader(&fs);
7979
7980 VkDescriptorSetObj descriptorSet(m_device);
7981 descriptorSet.AppendDummy();
7982 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7983
7984 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7985
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007986 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007987}
7988
Chris Forbes912c9192016-04-05 17:50:35 +12007989TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
7990{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007991 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12007992
7993 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
7994
7995 ASSERT_NO_FATAL_FAILURE(InitState());
7996 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7997
7998 char const *vsSource =
7999 "#version 450\n"
8000 "out gl_PerVertex {\n"
8001 " vec4 gl_Position;\n"
8002 "};\n"
8003 "layout(location=0) out vec3 x;\n"
8004 "layout(location=1) out ivec3 y;\n"
8005 "layout(location=2) out vec3 z;\n"
8006 "void main(){\n"
8007 " gl_Position = vec4(0);\n"
8008 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
8009 "}\n";
8010 char const *fsSource =
8011 "#version 450\n"
8012 "\n"
8013 "layout(location=0) out vec4 color;\n"
8014 "layout(location=0) in float x;\n"
8015 "layout(location=1) flat in int y;\n"
8016 "layout(location=2) in vec2 z;\n"
8017 "void main(){\n"
8018 " color = vec4(1 + x + y + z.x);\n"
8019 "}\n";
8020
8021 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8022 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8023
8024 VkPipelineObj pipe(m_device);
8025 pipe.AddColorAttachment();
8026 pipe.AddShader(&vs);
8027 pipe.AddShader(&fs);
8028
8029 VkDescriptorSetObj descriptorSet(m_device);
8030 descriptorSet.AppendDummy();
8031 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8032
8033 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8034
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008035 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12008036}
8037
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008038TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
8039{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008040 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008041
8042 ASSERT_NO_FATAL_FAILURE(InitState());
8043 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8044
Chris Forbesc1e852d2016-04-04 19:26:42 +12008045 if (!m_device->phy().features().tessellationShader) {
8046 printf("Device does not support tessellation shaders; skipped.\n");
8047 return;
8048 }
8049
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008050 char const *vsSource =
8051 "#version 450\n"
8052 "void main(){}\n";
8053 char const *tcsSource =
8054 "#version 450\n"
8055 "layout(location=0) out int x[];\n"
8056 "layout(vertices=3) out;\n"
8057 "void main(){\n"
8058 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
8059 " gl_TessLevelInner[0] = 1;\n"
8060 " x[gl_InvocationID] = gl_InvocationID;\n"
8061 "}\n";
8062 char const *tesSource =
8063 "#version 450\n"
8064 "layout(triangles, equal_spacing, cw) in;\n"
8065 "layout(location=0) in int x[];\n"
8066 "out gl_PerVertex { vec4 gl_Position; };\n"
8067 "void main(){\n"
8068 " gl_Position.xyz = gl_TessCoord;\n"
8069 " gl_Position.w = x[0] + x[1] + x[2];\n"
8070 "}\n";
8071 char const *fsSource =
8072 "#version 450\n"
8073 "layout(location=0) out vec4 color;\n"
8074 "void main(){\n"
8075 " color = vec4(1);\n"
8076 "}\n";
8077
8078 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8079 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
8080 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
8081 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8082
8083 VkPipelineInputAssemblyStateCreateInfo iasci{
8084 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
8085 nullptr,
8086 0,
8087 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
8088 VK_FALSE};
8089
Chris Forbesb4cacb62016-04-04 19:15:00 +12008090 VkPipelineTessellationStateCreateInfo tsci{
8091 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
8092 nullptr,
8093 0,
8094 3};
8095
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008096 VkPipelineObj pipe(m_device);
8097 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12008098 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008099 pipe.AddColorAttachment();
8100 pipe.AddShader(&vs);
8101 pipe.AddShader(&tcs);
8102 pipe.AddShader(&tes);
8103 pipe.AddShader(&fs);
8104
8105 VkDescriptorSetObj descriptorSet(m_device);
8106 descriptorSet.AppendDummy();
8107 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8108
8109 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8110
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008111 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008112}
8113
Chris Forbesa0ab8152016-04-20 13:34:27 +12008114TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
8115{
8116 m_errorMonitor->ExpectSuccess();
8117
8118 ASSERT_NO_FATAL_FAILURE(InitState());
8119 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8120
8121 if (!m_device->phy().features().geometryShader) {
8122 printf("Device does not support geometry shaders; skipped.\n");
8123 return;
8124 }
8125
8126 char const *vsSource =
8127 "#version 450\n"
8128 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
8129 "void main(){\n"
8130 " vs_out.x = vec4(1);\n"
8131 "}\n";
8132 char const *gsSource =
8133 "#version 450\n"
8134 "layout(triangles) in;\n"
8135 "layout(triangle_strip, max_vertices=3) out;\n"
8136 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
8137 "out gl_PerVertex { vec4 gl_Position; };\n"
8138 "void main() {\n"
8139 " gl_Position = gs_in[0].x;\n"
8140 " EmitVertex();\n"
8141 "}\n";
8142 char const *fsSource =
8143 "#version 450\n"
8144 "layout(location=0) out vec4 color;\n"
8145 "void main(){\n"
8146 " color = vec4(1);\n"
8147 "}\n";
8148
8149 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8150 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
8151 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8152
8153 VkPipelineObj pipe(m_device);
8154 pipe.AddColorAttachment();
8155 pipe.AddShader(&vs);
8156 pipe.AddShader(&gs);
8157 pipe.AddShader(&fs);
8158
8159 VkDescriptorSetObj descriptorSet(m_device);
8160 descriptorSet.AppendDummy();
8161 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8162
8163 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8164
8165 m_errorMonitor->VerifyNotFound();
8166}
8167
Chris Forbesa0193bc2016-04-04 19:19:47 +12008168TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
8169{
8170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8171 "is per-vertex in tessellation control shader stage "
8172 "but per-patch in tessellation evaluation shader stage");
8173
8174 ASSERT_NO_FATAL_FAILURE(InitState());
8175 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8176
Chris Forbesc1e852d2016-04-04 19:26:42 +12008177 if (!m_device->phy().features().tessellationShader) {
8178 printf("Device does not support tessellation shaders; skipped.\n");
8179 return;
8180 }
8181
Chris Forbesa0193bc2016-04-04 19:19:47 +12008182 char const *vsSource =
8183 "#version 450\n"
8184 "void main(){}\n";
8185 char const *tcsSource =
8186 "#version 450\n"
8187 "layout(location=0) out int x[];\n"
8188 "layout(vertices=3) out;\n"
8189 "void main(){\n"
8190 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
8191 " gl_TessLevelInner[0] = 1;\n"
8192 " x[gl_InvocationID] = gl_InvocationID;\n"
8193 "}\n";
8194 char const *tesSource =
8195 "#version 450\n"
8196 "layout(triangles, equal_spacing, cw) in;\n"
8197 "layout(location=0) patch in int x;\n"
8198 "out gl_PerVertex { vec4 gl_Position; };\n"
8199 "void main(){\n"
8200 " gl_Position.xyz = gl_TessCoord;\n"
8201 " gl_Position.w = x;\n"
8202 "}\n";
8203 char const *fsSource =
8204 "#version 450\n"
8205 "layout(location=0) out vec4 color;\n"
8206 "void main(){\n"
8207 " color = vec4(1);\n"
8208 "}\n";
8209
8210 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8211 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
8212 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
8213 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8214
8215 VkPipelineInputAssemblyStateCreateInfo iasci{
8216 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
8217 nullptr,
8218 0,
8219 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
8220 VK_FALSE};
8221
8222 VkPipelineTessellationStateCreateInfo tsci{
8223 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
8224 nullptr,
8225 0,
8226 3};
8227
8228 VkPipelineObj pipe(m_device);
8229 pipe.SetInputAssembly(&iasci);
8230 pipe.SetTessellation(&tsci);
8231 pipe.AddColorAttachment();
8232 pipe.AddShader(&vs);
8233 pipe.AddShader(&tcs);
8234 pipe.AddShader(&tes);
8235 pipe.AddShader(&fs);
8236
8237 VkDescriptorSetObj descriptorSet(m_device);
8238 descriptorSet.AppendDummy();
8239 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8240
8241 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8242
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008243 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12008244}
8245
Karl Schultz6addd812016-02-02 17:17:23 -07008246TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
8247 m_errorMonitor->SetDesiredFailureMsg(
8248 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008249 "Duplicate vertex input binding descriptions for binding 0");
8250
Chris Forbes280ba2c2015-06-12 11:16:41 +12008251 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008252 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12008253
8254 /* Two binding descriptions for binding 0 */
8255 VkVertexInputBindingDescription input_bindings[2];
8256 memset(input_bindings, 0, sizeof(input_bindings));
8257
8258 VkVertexInputAttributeDescription input_attrib;
8259 memset(&input_attrib, 0, sizeof(input_attrib));
8260 input_attrib.format = VK_FORMAT_R32_SFLOAT;
8261
8262 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008263 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12008264 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008265 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07008266 "out gl_PerVertex {\n"
8267 " vec4 gl_Position;\n"
8268 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12008269 "void main(){\n"
8270 " gl_Position = vec4(x);\n"
8271 "}\n";
8272 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008273 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12008274 "\n"
8275 "layout(location=0) out vec4 color;\n"
8276 "void main(){\n"
8277 " color = vec4(1);\n"
8278 "}\n";
8279
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008280 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8281 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12008282
8283 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008284 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12008285 pipe.AddShader(&vs);
8286 pipe.AddShader(&fs);
8287
8288 pipe.AddVertexInputBindings(input_bindings, 2);
8289 pipe.AddVertexInputAttribs(&input_attrib, 1);
8290
Chris Forbes280ba2c2015-06-12 11:16:41 +12008291 VkDescriptorSetObj descriptorSet(m_device);
8292 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008293 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12008294
Tony Barbour5781e8f2015-08-04 16:23:11 -06008295 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12008296
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008297 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12008298}
Chris Forbes8f68b562015-05-25 11:13:32 +12008299
Chris Forbes35efec72016-04-21 14:32:08 +12008300TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
8301 m_errorMonitor->ExpectSuccess();
8302
8303 ASSERT_NO_FATAL_FAILURE(InitState());
8304 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8305
8306 if (!m_device->phy().features().tessellationShader) {
8307 printf("Device does not support 64bit vertex attributes; skipped.\n");
8308 return;
8309 }
8310
8311 VkVertexInputBindingDescription input_bindings[1];
8312 memset(input_bindings, 0, sizeof(input_bindings));
8313
8314 VkVertexInputAttributeDescription input_attribs[4];
8315 memset(input_attribs, 0, sizeof(input_attribs));
8316 input_attribs[0].location = 0;
8317 input_attribs[0].offset = 0;
8318 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8319 input_attribs[1].location = 2;
8320 input_attribs[1].offset = 32;
8321 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8322 input_attribs[2].location = 4;
8323 input_attribs[2].offset = 64;
8324 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8325 input_attribs[3].location = 6;
8326 input_attribs[3].offset = 96;
8327 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8328
8329 char const *vsSource =
8330 "#version 450\n"
8331 "\n"
8332 "layout(location=0) in dmat4 x;\n"
8333 "out gl_PerVertex {\n"
8334 " vec4 gl_Position;\n"
8335 "};\n"
8336 "void main(){\n"
8337 " gl_Position = vec4(x[0][0]);\n"
8338 "}\n";
8339 char const *fsSource =
8340 "#version 450\n"
8341 "\n"
8342 "layout(location=0) out vec4 color;\n"
8343 "void main(){\n"
8344 " color = vec4(1);\n"
8345 "}\n";
8346
8347 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8348 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8349
8350 VkPipelineObj pipe(m_device);
8351 pipe.AddColorAttachment();
8352 pipe.AddShader(&vs);
8353 pipe.AddShader(&fs);
8354
8355 pipe.AddVertexInputBindings(input_bindings, 1);
8356 pipe.AddVertexInputAttribs(input_attribs, 4);
8357
8358 VkDescriptorSetObj descriptorSet(m_device);
8359 descriptorSet.AppendDummy();
8360 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8361
8362 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8363
8364 m_errorMonitor->VerifyNotFound();
8365}
8366
Karl Schultz6addd812016-02-02 17:17:23 -07008367TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008368 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008369 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008370
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008371 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008372
8373 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008374 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008375 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008376 "out gl_PerVertex {\n"
8377 " vec4 gl_Position;\n"
8378 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008379 "void main(){\n"
8380 " gl_Position = vec4(1);\n"
8381 "}\n";
8382 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008383 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008384 "\n"
8385 "void main(){\n"
8386 "}\n";
8387
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008388 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8389 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008390
8391 VkPipelineObj pipe(m_device);
8392 pipe.AddShader(&vs);
8393 pipe.AddShader(&fs);
8394
Chia-I Wu08accc62015-07-07 11:50:03 +08008395 /* set up CB 0, not written */
8396 pipe.AddColorAttachment();
8397 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008398
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008399 VkDescriptorSetObj descriptorSet(m_device);
8400 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008401 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008402
Tony Barbour5781e8f2015-08-04 16:23:11 -06008403 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008404
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008405 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008406}
8407
Karl Schultz6addd812016-02-02 17:17:23 -07008408TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07008409 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008410 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008411 "FS writes to output location 1 with no matching attachment");
8412
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008413 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008414
8415 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008416 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008417 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008418 "out gl_PerVertex {\n"
8419 " vec4 gl_Position;\n"
8420 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008421 "void main(){\n"
8422 " gl_Position = vec4(1);\n"
8423 "}\n";
8424 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008425 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008426 "\n"
8427 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008428 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008429 "void main(){\n"
8430 " x = vec4(1);\n"
8431 " y = vec4(1);\n"
8432 "}\n";
8433
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008434 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8435 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008436
8437 VkPipelineObj pipe(m_device);
8438 pipe.AddShader(&vs);
8439 pipe.AddShader(&fs);
8440
Chia-I Wu08accc62015-07-07 11:50:03 +08008441 /* set up CB 0, not written */
8442 pipe.AddColorAttachment();
8443 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008444 /* FS writes CB 1, but we don't configure it */
8445
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008446 VkDescriptorSetObj descriptorSet(m_device);
8447 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008448 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008449
Tony Barbour5781e8f2015-08-04 16:23:11 -06008450 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008451
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008452 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008453}
8454
Karl Schultz6addd812016-02-02 17:17:23 -07008455TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008457 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008458
Chris Forbesa36d69e2015-05-25 11:13:44 +12008459 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008460
8461 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008462 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008463 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008464 "out gl_PerVertex {\n"
8465 " vec4 gl_Position;\n"
8466 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008467 "void main(){\n"
8468 " gl_Position = vec4(1);\n"
8469 "}\n";
8470 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008471 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008472 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008473 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12008474 "void main(){\n"
8475 " x = ivec4(1);\n"
8476 "}\n";
8477
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008478 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8479 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12008480
8481 VkPipelineObj pipe(m_device);
8482 pipe.AddShader(&vs);
8483 pipe.AddShader(&fs);
8484
Chia-I Wu08accc62015-07-07 11:50:03 +08008485 /* set up CB 0; type is UNORM by default */
8486 pipe.AddColorAttachment();
8487 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008488
Chris Forbesa36d69e2015-05-25 11:13:44 +12008489 VkDescriptorSetObj descriptorSet(m_device);
8490 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008491 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12008492
Tony Barbour5781e8f2015-08-04 16:23:11 -06008493 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008494
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008495 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12008496}
Chris Forbes7b1b8932015-06-05 14:43:36 +12008497
Karl Schultz6addd812016-02-02 17:17:23 -07008498TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008500 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008501
Chris Forbes556c76c2015-08-14 12:04:59 +12008502 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12008503
8504 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008505 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008506 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008507 "out gl_PerVertex {\n"
8508 " vec4 gl_Position;\n"
8509 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008510 "void main(){\n"
8511 " gl_Position = vec4(1);\n"
8512 "}\n";
8513 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008514 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008515 "\n"
8516 "layout(location=0) out vec4 x;\n"
8517 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
8518 "void main(){\n"
8519 " x = vec4(bar.y);\n"
8520 "}\n";
8521
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008522 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8523 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12008524
Chris Forbes556c76c2015-08-14 12:04:59 +12008525 VkPipelineObj pipe(m_device);
8526 pipe.AddShader(&vs);
8527 pipe.AddShader(&fs);
8528
8529 /* set up CB 0; type is UNORM by default */
8530 pipe.AddColorAttachment();
8531 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8532
8533 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008534 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12008535
8536 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8537
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008538 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12008539}
8540
Chris Forbes5c59e902016-02-26 16:56:09 +13008541TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
8542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8543 "not declared in layout");
8544
8545 ASSERT_NO_FATAL_FAILURE(InitState());
8546
8547 char const *vsSource =
8548 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13008549 "\n"
8550 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
8551 "out gl_PerVertex {\n"
8552 " vec4 gl_Position;\n"
8553 "};\n"
8554 "void main(){\n"
8555 " gl_Position = vec4(consts.x);\n"
8556 "}\n";
8557 char const *fsSource =
8558 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13008559 "\n"
8560 "layout(location=0) out vec4 x;\n"
8561 "void main(){\n"
8562 " x = vec4(1);\n"
8563 "}\n";
8564
8565 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8566 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8567
8568 VkPipelineObj pipe(m_device);
8569 pipe.AddShader(&vs);
8570 pipe.AddShader(&fs);
8571
8572 /* set up CB 0; type is UNORM by default */
8573 pipe.AddColorAttachment();
8574 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8575
8576 VkDescriptorSetObj descriptorSet(m_device);
8577 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8578
8579 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8580
8581 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008582 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13008583}
8584
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008585#endif // SHADER_CHECKER_TESTS
8586
8587#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06008588TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07008589 m_errorMonitor->SetDesiredFailureMsg(
8590 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008591 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008592
8593 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008594
8595 // Create an image
8596 VkImage image;
8597
Karl Schultz6addd812016-02-02 17:17:23 -07008598 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8599 const int32_t tex_width = 32;
8600 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008601
8602 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008603 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8604 image_create_info.pNext = NULL;
8605 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8606 image_create_info.format = tex_format;
8607 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008608 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07008609 image_create_info.extent.depth = 1;
8610 image_create_info.mipLevels = 1;
8611 image_create_info.arrayLayers = 1;
8612 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8613 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8614 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8615 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008616
8617 // Introduce error by sending down a bogus width extent
8618 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008619 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008620
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008621 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008622}
8623
Mark Youngc48c4c12016-04-11 14:26:49 -06008624TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
8625 m_errorMonitor->SetDesiredFailureMsg(
8626 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8627 "CreateImage extents is 0 for at least one required dimension");
8628
8629 ASSERT_NO_FATAL_FAILURE(InitState());
8630
8631 // Create an image
8632 VkImage image;
8633
8634 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8635 const int32_t tex_width = 32;
8636 const int32_t tex_height = 32;
8637
8638 VkImageCreateInfo image_create_info = {};
8639 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8640 image_create_info.pNext = NULL;
8641 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8642 image_create_info.format = tex_format;
8643 image_create_info.extent.width = tex_width;
8644 image_create_info.extent.height = tex_height;
8645 image_create_info.extent.depth = 1;
8646 image_create_info.mipLevels = 1;
8647 image_create_info.arrayLayers = 1;
8648 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8649 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8650 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8651 image_create_info.flags = 0;
8652
8653 // Introduce error by sending down a bogus width extent
8654 image_create_info.extent.width = 0;
8655 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8656
8657 m_errorMonitor->VerifyFound();
8658}
8659
Karl Schultz6addd812016-02-02 17:17:23 -07008660TEST_F(VkLayerTest, UpdateBufferAlignment) {
8661 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06008662
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008664 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008665
Mike Stroyana3082432015-09-25 13:39:21 -06008666 ASSERT_NO_FATAL_FAILURE(InitState());
8667
8668 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8669 vk_testing::Buffer buffer;
8670 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8671
8672 BeginCommandBuffer();
8673 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008674 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008675 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008676
Mike Stroyana3082432015-09-25 13:39:21 -06008677 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008679 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008680
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008681 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008682 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008683 EndCommandBuffer();
8684}
8685
Karl Schultz6addd812016-02-02 17:17:23 -07008686TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008688 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06008689
8690 ASSERT_NO_FATAL_FAILURE(InitState());
8691
8692 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8693 vk_testing::Buffer buffer;
8694 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8695
8696 BeginCommandBuffer();
8697 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008698 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008699 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008700
Mike Stroyana3082432015-09-25 13:39:21 -06008701 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008703 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008704
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008705 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008706
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008707 m_errorMonitor->VerifyFound();
8708
Mike Stroyana3082432015-09-25 13:39:21 -06008709 EndCommandBuffer();
8710}
8711
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008712#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12008713
Tobin Ehliscde08892015-09-22 10:11:37 -06008714#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07008715TEST_F(VkLayerTest, InvalidImageView) {
8716 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06008717
Karl Schultz6addd812016-02-02 17:17:23 -07008718 m_errorMonitor->SetDesiredFailureMsg(
8719 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008720 "vkCreateImageView called with baseMipLevel 10 ");
8721
Tobin Ehliscde08892015-09-22 10:11:37 -06008722 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06008723
Mike Stroyana3082432015-09-25 13:39:21 -06008724 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07008725 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06008726
Karl Schultz6addd812016-02-02 17:17:23 -07008727 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8728 const int32_t tex_width = 32;
8729 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06008730
8731 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008732 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8733 image_create_info.pNext = NULL;
8734 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8735 image_create_info.format = tex_format;
8736 image_create_info.extent.width = tex_width;
8737 image_create_info.extent.height = tex_height;
8738 image_create_info.extent.depth = 1;
8739 image_create_info.mipLevels = 1;
8740 image_create_info.arrayLayers = 1;
8741 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8742 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8743 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8744 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06008745
Chia-I Wuf7458c52015-10-26 21:10:41 +08008746 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06008747 ASSERT_VK_SUCCESS(err);
8748
8749 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008750 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8751 image_view_create_info.image = image;
8752 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8753 image_view_create_info.format = tex_format;
8754 image_view_create_info.subresourceRange.layerCount = 1;
8755 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
8756 image_view_create_info.subresourceRange.levelCount = 1;
8757 image_view_create_info.subresourceRange.aspectMask =
8758 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06008759
8760 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008761 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8762 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06008763
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008764 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06008765}
Mike Stroyana3082432015-09-25 13:39:21 -06008766
Karl Schultz6addd812016-02-02 17:17:23 -07008767TEST_F(VkLayerTest, InvalidImageViewAspect) {
8768 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008769
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008771 "vkCreateImageView: Color image "
8772 "formats must have ONLY the "
8773 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008774
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008775 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008776
8777 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07008778 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008779
Karl Schultz6addd812016-02-02 17:17:23 -07008780 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8781 const int32_t tex_width = 32;
8782 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008783
8784 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008785 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8786 image_create_info.pNext = NULL;
8787 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8788 image_create_info.format = tex_format;
8789 image_create_info.extent.width = tex_width;
8790 image_create_info.extent.height = tex_height;
8791 image_create_info.extent.depth = 1;
8792 image_create_info.mipLevels = 1;
8793 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8794 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8795 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8796 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008797
Chia-I Wuf7458c52015-10-26 21:10:41 +08008798 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008799 ASSERT_VK_SUCCESS(err);
8800
8801 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008802 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8803 image_view_create_info.image = image;
8804 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8805 image_view_create_info.format = tex_format;
8806 image_view_create_info.subresourceRange.baseMipLevel = 0;
8807 image_view_create_info.subresourceRange.levelCount = 1;
8808 // Cause an error by setting an invalid image aspect
8809 image_view_create_info.subresourceRange.aspectMask =
8810 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008811
8812 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008813 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8814 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008815
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008816 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008817}
8818
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008819TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008820 VkResult err;
8821 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008822
Karl Schultz6addd812016-02-02 17:17:23 -07008823 m_errorMonitor->SetDesiredFailureMsg(
8824 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008825 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008826
Mike Stroyana3082432015-09-25 13:39:21 -06008827 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008828
8829 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008830 VkImage srcImage;
8831 VkImage dstImage;
8832 VkDeviceMemory srcMem;
8833 VkDeviceMemory destMem;
8834 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008835
8836 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008837 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8838 image_create_info.pNext = NULL;
8839 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8840 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8841 image_create_info.extent.width = 32;
8842 image_create_info.extent.height = 32;
8843 image_create_info.extent.depth = 1;
8844 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008845 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07008846 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8847 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8848 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8849 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008850
Karl Schultz6addd812016-02-02 17:17:23 -07008851 err =
8852 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008853 ASSERT_VK_SUCCESS(err);
8854
Karl Schultz6addd812016-02-02 17:17:23 -07008855 err =
8856 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008857 ASSERT_VK_SUCCESS(err);
8858
8859 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008860 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008861 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8862 memAlloc.pNext = NULL;
8863 memAlloc.allocationSize = 0;
8864 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008865
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008866 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008867 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008868 pass =
8869 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008870 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008871 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008872 ASSERT_VK_SUCCESS(err);
8873
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008874 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008875 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008876 pass =
8877 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008878 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008879 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008880 ASSERT_VK_SUCCESS(err);
8881
8882 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8883 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008884 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008885 ASSERT_VK_SUCCESS(err);
8886
8887 BeginCommandBuffer();
8888 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008889 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008890 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008891 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008892 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06008893 copyRegion.srcOffset.x = 0;
8894 copyRegion.srcOffset.y = 0;
8895 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008896 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008897 copyRegion.dstSubresource.mipLevel = 0;
8898 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008899 // Introduce failure by forcing the dst layerCount to differ from src
8900 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008901 copyRegion.dstOffset.x = 0;
8902 copyRegion.dstOffset.y = 0;
8903 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008904 copyRegion.extent.width = 1;
8905 copyRegion.extent.height = 1;
8906 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008907 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8908 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008909 EndCommandBuffer();
8910
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008911 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008912
Chia-I Wuf7458c52015-10-26 21:10:41 +08008913 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008914 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008915 vkFreeMemory(m_device->device(), srcMem, NULL);
8916 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008917}
8918
Tony Barbourd6673642016-05-05 14:46:39 -06008919TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
8920
8921 TEST_DESCRIPTION("Creating images with unsuported formats ");
8922
8923 ASSERT_NO_FATAL_FAILURE(InitState());
8924 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8925 VkImageObj image(m_device);
8926 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
8927 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
8928 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
8929 VK_IMAGE_TILING_OPTIMAL, 0);
8930 ASSERT_TRUE(image.initialized());
8931
8932 VkFormat unsupported = VK_FORMAT_UNDEFINED;
8933 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
8934 VkFormat format = static_cast<VkFormat>(f);
8935 VkFormatProperties fProps = m_device->format_properties(format);
8936 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
8937 fProps.optimalTilingFeatures == 0) {
8938 unsupported = format;
8939 break;
8940 }
8941 }
8942 if (unsupported != VK_FORMAT_UNDEFINED) {
8943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8944 "vkCreateImage parameter, "
8945 "VkFormat pCreateInfo->format, "
8946 "contains unsupported format");
8947 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
8948 VkImageCreateInfo image_create_info;
8949 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8950 image_create_info.pNext = NULL;
8951 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8952 image_create_info.format = unsupported;
8953 image_create_info.extent.width = 32;
8954 image_create_info.extent.height = 32;
8955 image_create_info.extent.depth = 1;
8956 image_create_info.mipLevels = 1;
8957 image_create_info.arrayLayers = 1;
8958 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8959 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8960 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8961 image_create_info.flags = 0;
8962
8963 VkImage localImage;
8964 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
8965 m_errorMonitor->VerifyFound();
8966
8967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8968 "vkCreateRenderPass parameter, "
8969 "VkFormat in "
8970 "pCreateInfo->pAttachments");
8971 // Create renderpass with unsupported format - Expect FORMAT_UNSUPPORTED
8972 VkAttachmentDescription att;
8973 att.format = unsupported;
8974 att.samples = VK_SAMPLE_COUNT_1_BIT;
8975 att.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
8976 att.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
8977 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
8978 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
8979 att.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8980 att.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8981
8982 VkRenderPassCreateInfo rp_info = {};
8983 VkRenderPass rp;
8984 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8985 rp_info.attachmentCount = 1;
8986 rp_info.pAttachments = &att;
8987 rp_info.subpassCount = 0;
8988 rp_info.pSubpasses = NULL;
8989 vkCreateRenderPass(m_device->handle(), &rp_info, NULL, &rp);
8990 m_errorMonitor->VerifyFound();
8991 }
8992}
8993
8994TEST_F(VkLayerTest, ImageLayerViewTests) {
8995 VkResult ret;
8996 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
8997
8998 ASSERT_NO_FATAL_FAILURE(InitState());
8999
9000 VkImageObj image(m_device);
9001 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9002 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
9003 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
9004 VK_IMAGE_TILING_OPTIMAL, 0);
9005 ASSERT_TRUE(image.initialized());
9006
9007 VkImageView imgView;
9008 VkImageViewCreateInfo imgViewInfo = {};
9009 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9010 imgViewInfo.image = image.handle();
9011 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
9012 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9013 imgViewInfo.subresourceRange.layerCount = 1;
9014 imgViewInfo.subresourceRange.baseMipLevel = 0;
9015 imgViewInfo.subresourceRange.levelCount = 1;
9016 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9017
9018 m_errorMonitor->SetDesiredFailureMsg(
9019 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9020 "vkCreateImageView called with baseMipLevel");
9021 // View can't have baseMipLevel >= image's mipLevels - Expect
9022 // VIEW_CREATE_ERROR
9023 imgViewInfo.subresourceRange.baseMipLevel = 1;
9024 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9025 m_errorMonitor->VerifyFound();
9026 imgViewInfo.subresourceRange.baseMipLevel = 0;
9027
9028 m_errorMonitor->SetDesiredFailureMsg(
9029 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9030 "vkCreateImageView called with baseArrayLayer");
9031 // View can't have baseArrayLayer >= image's arraySize - Expect
9032 // VIEW_CREATE_ERROR
9033 imgViewInfo.subresourceRange.baseArrayLayer = 1;
9034 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9035 m_errorMonitor->VerifyFound();
9036 imgViewInfo.subresourceRange.baseArrayLayer = 0;
9037
9038 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9039 "vkCreateImageView called with 0 in "
9040 "pCreateInfo->subresourceRange."
9041 "levelCount");
9042 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
9043 imgViewInfo.subresourceRange.levelCount = 0;
9044 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9045 m_errorMonitor->VerifyFound();
9046 imgViewInfo.subresourceRange.levelCount = 1;
9047
9048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9049 "vkCreateImageView called with 0 in "
9050 "pCreateInfo->subresourceRange."
9051 "layerCount");
9052 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
9053 imgViewInfo.subresourceRange.layerCount = 0;
9054 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9055 m_errorMonitor->VerifyFound();
9056 imgViewInfo.subresourceRange.layerCount = 1;
9057
9058 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9059 "but both must be color formats");
9060 // Can't use depth format for view into color image - Expect INVALID_FORMAT
9061 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
9062 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9063 m_errorMonitor->VerifyFound();
9064 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9065
9066 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9067 "Formats MUST be IDENTICAL unless "
9068 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
9069 "was set on image creation.");
9070 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
9071 // VIEW_CREATE_ERROR
9072 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
9073 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9074 m_errorMonitor->VerifyFound();
9075 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9076
9077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9078 "can support ImageViews with "
9079 "differing formats but they must be "
9080 "in the same compatibility class.");
9081 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
9082 // VIEW_CREATE_ERROR
9083 VkImageCreateInfo mutImgInfo = image.create_info();
9084 VkImage mutImage;
9085 mutImgInfo.format = VK_FORMAT_R8_UINT;
9086 assert(
9087 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
9088 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
9089 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
9090 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9091 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
9092 ASSERT_VK_SUCCESS(ret);
9093 imgViewInfo.image = mutImage;
9094 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9095 m_errorMonitor->VerifyFound();
9096 imgViewInfo.image = image.handle();
9097 vkDestroyImage(m_device->handle(), mutImage, NULL);
9098}
9099
9100TEST_F(VkLayerTest, MiscImageLayerTests) {
9101
9102 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
9103
9104 ASSERT_NO_FATAL_FAILURE(InitState());
9105
9106 VkImageObj image(m_device);
9107 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9108 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
9109 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
9110 VK_IMAGE_TILING_OPTIMAL, 0);
9111 ASSERT_TRUE(image.initialized());
9112
9113 m_errorMonitor->SetDesiredFailureMsg(
9114 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9115 "number of layers in image subresource is zero");
9116 vk_testing::Buffer buffer;
9117 VkMemoryPropertyFlags reqs = 0;
9118 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
9119 VkBufferImageCopy region = {};
9120 region.bufferRowLength = 128;
9121 region.bufferImageHeight = 128;
9122 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9123 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
9124 region.imageSubresource.layerCount = 0;
9125 region.imageExtent.height = 4;
9126 region.imageExtent.width = 4;
9127 region.imageExtent.depth = 1;
9128 m_commandBuffer->BeginCommandBuffer();
9129 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
9130 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
9131 1, &region);
9132 m_errorMonitor->VerifyFound();
9133 region.imageSubresource.layerCount = 1;
9134
9135 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9136 "aspectMasks for each region must "
9137 "specify only COLOR or DEPTH or "
9138 "STENCIL");
9139 // Expect MISMATCHED_IMAGE_ASPECT
9140 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
9141 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
9142 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
9143 1, &region);
9144 m_errorMonitor->VerifyFound();
9145 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9146
9147 m_errorMonitor->SetDesiredFailureMsg(
9148 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9149 "If the format of srcImage is a depth, stencil, depth stencil or "
9150 "integer-based format then filter must be VK_FILTER_NEAREST");
9151 // Expect INVALID_FILTER
9152 VkImageObj intImage1(m_device);
9153 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
9154 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
9155 0);
9156 VkImageObj intImage2(m_device);
9157 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
9158 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
9159 0);
9160 VkImageBlit blitRegion = {};
9161 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9162 blitRegion.srcSubresource.baseArrayLayer = 0;
9163 blitRegion.srcSubresource.layerCount = 1;
9164 blitRegion.srcSubresource.mipLevel = 0;
9165 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9166 blitRegion.dstSubresource.baseArrayLayer = 0;
9167 blitRegion.dstSubresource.layerCount = 1;
9168 blitRegion.dstSubresource.mipLevel = 0;
9169
9170 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
9171 intImage1.layout(), intImage2.handle(), intImage2.layout(),
9172 16, &blitRegion, VK_FILTER_LINEAR);
9173 m_errorMonitor->VerifyFound();
9174
9175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9176 "called with 0 in ppMemoryBarriers");
9177 VkImageMemoryBarrier img_barrier;
9178 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9179 img_barrier.pNext = NULL;
9180 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9181 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9182 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9183 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9184 img_barrier.image = image.handle();
9185 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9186 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9187 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9188 img_barrier.subresourceRange.baseArrayLayer = 0;
9189 img_barrier.subresourceRange.baseMipLevel = 0;
9190 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
9191 img_barrier.subresourceRange.layerCount = 0;
9192 img_barrier.subresourceRange.levelCount = 1;
9193 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9194 VK_PIPELINE_STAGE_HOST_BIT,
9195 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9196 nullptr, 1, &img_barrier);
9197 m_errorMonitor->VerifyFound();
9198 img_barrier.subresourceRange.layerCount = 1;
9199}
9200
9201TEST_F(VkLayerTest, ImageFormatLimits) {
9202
9203 TEST_DESCRIPTION("Exceed the limits of image format ");
9204
9205 m_errorMonitor->SetDesiredFailureMsg(
9206 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9207 "CreateImage extents exceed allowable limits for format");
9208 VkImageCreateInfo image_create_info = {};
9209 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9210 image_create_info.pNext = NULL;
9211 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9212 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9213 image_create_info.extent.width = 32;
9214 image_create_info.extent.height = 32;
9215 image_create_info.extent.depth = 1;
9216 image_create_info.mipLevels = 1;
9217 image_create_info.arrayLayers = 1;
9218 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9219 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9220 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9221 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9222 image_create_info.flags = 0;
9223
9224 VkImage nullImg;
9225 VkImageFormatProperties imgFmtProps;
9226 vkGetPhysicalDeviceImageFormatProperties(
9227 gpu(), image_create_info.format, image_create_info.imageType,
9228 image_create_info.tiling, image_create_info.usage,
9229 image_create_info.flags, &imgFmtProps);
9230 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
9231 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9232 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9233 m_errorMonitor->VerifyFound();
9234 image_create_info.extent.depth = 1;
9235
9236 m_errorMonitor->SetDesiredFailureMsg(
9237 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9238 "exceeds allowable maximum supported by format of");
9239 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
9240 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9241 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9242 m_errorMonitor->VerifyFound();
9243 image_create_info.mipLevels = 1;
9244
9245 m_errorMonitor->SetDesiredFailureMsg(
9246 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9247 "exceeds allowable maximum supported by format of");
9248 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
9249 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9250 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9251 m_errorMonitor->VerifyFound();
9252 image_create_info.arrayLayers = 1;
9253
9254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9255 "is not supported by format");
9256 int samples = imgFmtProps.sampleCounts >> 1;
9257 image_create_info.samples = (VkSampleCountFlagBits)samples;
9258 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9259 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9260 m_errorMonitor->VerifyFound();
9261 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9262
9263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9264 "pCreateInfo->initialLayout, must be "
9265 "VK_IMAGE_LAYOUT_UNDEFINED or "
9266 "VK_IMAGE_LAYOUT_PREINITIALIZED");
9267 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9268 // Expect INVALID_LAYOUT
9269 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9270 m_errorMonitor->VerifyFound();
9271 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9272}
9273
Karl Schultz6addd812016-02-02 17:17:23 -07009274TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06009275 VkResult err;
9276 bool pass;
9277
9278 // Create color images with different format sizes and try to copy between them
9279 m_errorMonitor->SetDesiredFailureMsg(
9280 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9281 "vkCmdCopyImage called with unmatched source and dest image format sizes");
9282
9283 ASSERT_NO_FATAL_FAILURE(InitState());
9284
9285 // Create two images of different types and try to copy between them
9286 VkImage srcImage;
9287 VkImage dstImage;
9288 VkDeviceMemory srcMem;
9289 VkDeviceMemory destMem;
9290 VkMemoryRequirements memReqs;
9291
9292 VkImageCreateInfo image_create_info = {};
9293 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9294 image_create_info.pNext = NULL;
9295 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9296 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9297 image_create_info.extent.width = 32;
9298 image_create_info.extent.height = 32;
9299 image_create_info.extent.depth = 1;
9300 image_create_info.mipLevels = 1;
9301 image_create_info.arrayLayers = 1;
9302 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9303 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9304 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9305 image_create_info.flags = 0;
9306
9307 err =
9308 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
9309 ASSERT_VK_SUCCESS(err);
9310
9311 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
9312 // Introduce failure by creating second image with a different-sized format.
9313 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
9314
9315 err =
9316 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
9317 ASSERT_VK_SUCCESS(err);
9318
9319 // Allocate memory
9320 VkMemoryAllocateInfo memAlloc = {};
9321 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9322 memAlloc.pNext = NULL;
9323 memAlloc.allocationSize = 0;
9324 memAlloc.memoryTypeIndex = 0;
9325
9326 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
9327 memAlloc.allocationSize = memReqs.size;
9328 pass =
9329 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
9330 ASSERT_TRUE(pass);
9331 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
9332 ASSERT_VK_SUCCESS(err);
9333
9334 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
9335 memAlloc.allocationSize = memReqs.size;
9336 pass =
9337 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
9338 ASSERT_TRUE(pass);
9339 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
9340 ASSERT_VK_SUCCESS(err);
9341
9342 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9343 ASSERT_VK_SUCCESS(err);
9344 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
9345 ASSERT_VK_SUCCESS(err);
9346
9347 BeginCommandBuffer();
9348 VkImageCopy copyRegion;
9349 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9350 copyRegion.srcSubresource.mipLevel = 0;
9351 copyRegion.srcSubresource.baseArrayLayer = 0;
9352 copyRegion.srcSubresource.layerCount = 0;
9353 copyRegion.srcOffset.x = 0;
9354 copyRegion.srcOffset.y = 0;
9355 copyRegion.srcOffset.z = 0;
9356 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9357 copyRegion.dstSubresource.mipLevel = 0;
9358 copyRegion.dstSubresource.baseArrayLayer = 0;
9359 copyRegion.dstSubresource.layerCount = 0;
9360 copyRegion.dstOffset.x = 0;
9361 copyRegion.dstOffset.y = 0;
9362 copyRegion.dstOffset.z = 0;
9363 copyRegion.extent.width = 1;
9364 copyRegion.extent.height = 1;
9365 copyRegion.extent.depth = 1;
9366 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9367 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
9368 EndCommandBuffer();
9369
9370 m_errorMonitor->VerifyFound();
9371
9372 vkDestroyImage(m_device->device(), srcImage, NULL);
9373 vkDestroyImage(m_device->device(), dstImage, NULL);
9374 vkFreeMemory(m_device->device(), srcMem, NULL);
9375 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009376}
9377
Karl Schultz6addd812016-02-02 17:17:23 -07009378TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
9379 VkResult err;
9380 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009381
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009382 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009383 m_errorMonitor->SetDesiredFailureMsg(
9384 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009385 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009386
Mike Stroyana3082432015-09-25 13:39:21 -06009387 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009388
9389 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009390 VkImage srcImage;
9391 VkImage dstImage;
9392 VkDeviceMemory srcMem;
9393 VkDeviceMemory destMem;
9394 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009395
9396 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009397 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9398 image_create_info.pNext = NULL;
9399 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9400 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9401 image_create_info.extent.width = 32;
9402 image_create_info.extent.height = 32;
9403 image_create_info.extent.depth = 1;
9404 image_create_info.mipLevels = 1;
9405 image_create_info.arrayLayers = 1;
9406 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9407 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9408 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9409 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009410
Karl Schultz6addd812016-02-02 17:17:23 -07009411 err =
9412 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009413 ASSERT_VK_SUCCESS(err);
9414
Karl Schultzbdb75952016-04-19 11:36:49 -06009415 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
9416
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009417 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07009418 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009419 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
9420 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009421
Karl Schultz6addd812016-02-02 17:17:23 -07009422 err =
9423 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009424 ASSERT_VK_SUCCESS(err);
9425
9426 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009427 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009428 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9429 memAlloc.pNext = NULL;
9430 memAlloc.allocationSize = 0;
9431 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009432
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009433 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009434 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009435 pass =
9436 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009437 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009438 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009439 ASSERT_VK_SUCCESS(err);
9440
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009441 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009442 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009443 pass =
9444 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009445 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009446 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009447 ASSERT_VK_SUCCESS(err);
9448
9449 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9450 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009451 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009452 ASSERT_VK_SUCCESS(err);
9453
9454 BeginCommandBuffer();
9455 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009456 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009457 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009458 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009459 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009460 copyRegion.srcOffset.x = 0;
9461 copyRegion.srcOffset.y = 0;
9462 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009463 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009464 copyRegion.dstSubresource.mipLevel = 0;
9465 copyRegion.dstSubresource.baseArrayLayer = 0;
9466 copyRegion.dstSubresource.layerCount = 0;
9467 copyRegion.dstOffset.x = 0;
9468 copyRegion.dstOffset.y = 0;
9469 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009470 copyRegion.extent.width = 1;
9471 copyRegion.extent.height = 1;
9472 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009473 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9474 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009475 EndCommandBuffer();
9476
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009477 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009478
Chia-I Wuf7458c52015-10-26 21:10:41 +08009479 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009480 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009481 vkFreeMemory(m_device->device(), srcMem, NULL);
9482 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009483}
9484
Karl Schultz6addd812016-02-02 17:17:23 -07009485TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
9486 VkResult err;
9487 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009488
Karl Schultz6addd812016-02-02 17:17:23 -07009489 m_errorMonitor->SetDesiredFailureMsg(
9490 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009491 "vkCmdResolveImage called with source sample count less than 2.");
9492
Mike Stroyana3082432015-09-25 13:39:21 -06009493 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009494
9495 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07009496 VkImage srcImage;
9497 VkImage dstImage;
9498 VkDeviceMemory srcMem;
9499 VkDeviceMemory destMem;
9500 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009501
9502 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009503 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9504 image_create_info.pNext = NULL;
9505 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9506 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9507 image_create_info.extent.width = 32;
9508 image_create_info.extent.height = 1;
9509 image_create_info.extent.depth = 1;
9510 image_create_info.mipLevels = 1;
9511 image_create_info.arrayLayers = 1;
9512 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9513 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9514 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9515 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009516
Karl Schultz6addd812016-02-02 17:17:23 -07009517 err =
9518 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009519 ASSERT_VK_SUCCESS(err);
9520
Karl Schultz6addd812016-02-02 17:17:23 -07009521 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009522
Karl Schultz6addd812016-02-02 17:17:23 -07009523 err =
9524 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009525 ASSERT_VK_SUCCESS(err);
9526
9527 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009528 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009529 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9530 memAlloc.pNext = NULL;
9531 memAlloc.allocationSize = 0;
9532 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009533
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009534 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009535 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009536 pass =
9537 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009538 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009539 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009540 ASSERT_VK_SUCCESS(err);
9541
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009542 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009543 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009544 pass =
9545 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009546 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009547 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009548 ASSERT_VK_SUCCESS(err);
9549
9550 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9551 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009552 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009553 ASSERT_VK_SUCCESS(err);
9554
9555 BeginCommandBuffer();
9556 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009557 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9558 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009559 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009560 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009561 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009562 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009563 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009564 resolveRegion.srcOffset.x = 0;
9565 resolveRegion.srcOffset.y = 0;
9566 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009567 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009568 resolveRegion.dstSubresource.mipLevel = 0;
9569 resolveRegion.dstSubresource.baseArrayLayer = 0;
9570 resolveRegion.dstSubresource.layerCount = 0;
9571 resolveRegion.dstOffset.x = 0;
9572 resolveRegion.dstOffset.y = 0;
9573 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009574 resolveRegion.extent.width = 1;
9575 resolveRegion.extent.height = 1;
9576 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009577 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9578 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009579 EndCommandBuffer();
9580
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009581 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009582
Chia-I Wuf7458c52015-10-26 21:10:41 +08009583 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009584 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009585 vkFreeMemory(m_device->device(), srcMem, NULL);
9586 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009587}
9588
Karl Schultz6addd812016-02-02 17:17:23 -07009589TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
9590 VkResult err;
9591 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009592
Karl Schultz6addd812016-02-02 17:17:23 -07009593 m_errorMonitor->SetDesiredFailureMsg(
9594 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009595 "vkCmdResolveImage called with dest sample count greater than 1.");
9596
Mike Stroyana3082432015-09-25 13:39:21 -06009597 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009598
Chris Forbesa7530692016-05-08 12:35:39 +12009599 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07009600 VkImage srcImage;
9601 VkImage dstImage;
9602 VkDeviceMemory srcMem;
9603 VkDeviceMemory destMem;
9604 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009605
9606 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009607 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9608 image_create_info.pNext = NULL;
9609 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9610 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9611 image_create_info.extent.width = 32;
9612 image_create_info.extent.height = 1;
9613 image_create_info.extent.depth = 1;
9614 image_create_info.mipLevels = 1;
9615 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +12009616 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07009617 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9618 // Note: Some implementations expect color attachment usage for any
9619 // multisample surface
9620 image_create_info.usage =
9621 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9622 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009623
Karl Schultz6addd812016-02-02 17:17:23 -07009624 err =
9625 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009626 ASSERT_VK_SUCCESS(err);
9627
Karl Schultz6addd812016-02-02 17:17:23 -07009628 // Note: Some implementations expect color attachment usage for any
9629 // multisample surface
9630 image_create_info.usage =
9631 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009632
Karl Schultz6addd812016-02-02 17:17:23 -07009633 err =
9634 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009635 ASSERT_VK_SUCCESS(err);
9636
9637 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009638 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009639 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9640 memAlloc.pNext = NULL;
9641 memAlloc.allocationSize = 0;
9642 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009643
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009644 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009645 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009646 pass =
9647 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009648 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009649 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009650 ASSERT_VK_SUCCESS(err);
9651
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009652 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009653 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009654 pass =
9655 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009656 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009657 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009658 ASSERT_VK_SUCCESS(err);
9659
9660 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9661 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009662 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009663 ASSERT_VK_SUCCESS(err);
9664
9665 BeginCommandBuffer();
9666 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009667 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9668 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009669 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009670 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009671 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009672 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009673 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009674 resolveRegion.srcOffset.x = 0;
9675 resolveRegion.srcOffset.y = 0;
9676 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009677 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009678 resolveRegion.dstSubresource.mipLevel = 0;
9679 resolveRegion.dstSubresource.baseArrayLayer = 0;
9680 resolveRegion.dstSubresource.layerCount = 0;
9681 resolveRegion.dstOffset.x = 0;
9682 resolveRegion.dstOffset.y = 0;
9683 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009684 resolveRegion.extent.width = 1;
9685 resolveRegion.extent.height = 1;
9686 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009687 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9688 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009689 EndCommandBuffer();
9690
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009691 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009692
Chia-I Wuf7458c52015-10-26 21:10:41 +08009693 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009694 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009695 vkFreeMemory(m_device->device(), srcMem, NULL);
9696 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009697}
9698
Karl Schultz6addd812016-02-02 17:17:23 -07009699TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
9700 VkResult err;
9701 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009702
Karl Schultz6addd812016-02-02 17:17:23 -07009703 m_errorMonitor->SetDesiredFailureMsg(
9704 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009705 "vkCmdResolveImage called with unmatched source and dest formats.");
9706
Mike Stroyana3082432015-09-25 13:39:21 -06009707 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009708
9709 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009710 VkImage srcImage;
9711 VkImage dstImage;
9712 VkDeviceMemory srcMem;
9713 VkDeviceMemory destMem;
9714 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009715
9716 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009717 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9718 image_create_info.pNext = NULL;
9719 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9720 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9721 image_create_info.extent.width = 32;
9722 image_create_info.extent.height = 1;
9723 image_create_info.extent.depth = 1;
9724 image_create_info.mipLevels = 1;
9725 image_create_info.arrayLayers = 1;
9726 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
9727 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9728 // Note: Some implementations expect color attachment usage for any
9729 // multisample surface
9730 image_create_info.usage =
9731 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9732 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009733
Karl Schultz6addd812016-02-02 17:17:23 -07009734 err =
9735 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009736 ASSERT_VK_SUCCESS(err);
9737
Karl Schultz6addd812016-02-02 17:17:23 -07009738 // Set format to something other than source image
9739 image_create_info.format = VK_FORMAT_R32_SFLOAT;
9740 // Note: Some implementations expect color attachment usage for any
9741 // multisample surface
9742 image_create_info.usage =
9743 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9744 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009745
Karl Schultz6addd812016-02-02 17:17:23 -07009746 err =
9747 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009748 ASSERT_VK_SUCCESS(err);
9749
9750 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009751 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009752 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9753 memAlloc.pNext = NULL;
9754 memAlloc.allocationSize = 0;
9755 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009756
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009757 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009758 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009759 pass =
9760 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009761 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009762 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009763 ASSERT_VK_SUCCESS(err);
9764
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009765 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009766 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009767 pass =
9768 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009769 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009770 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009771 ASSERT_VK_SUCCESS(err);
9772
9773 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9774 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009775 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009776 ASSERT_VK_SUCCESS(err);
9777
9778 BeginCommandBuffer();
9779 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009780 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9781 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009782 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009783 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009784 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009785 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009786 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009787 resolveRegion.srcOffset.x = 0;
9788 resolveRegion.srcOffset.y = 0;
9789 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009790 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009791 resolveRegion.dstSubresource.mipLevel = 0;
9792 resolveRegion.dstSubresource.baseArrayLayer = 0;
9793 resolveRegion.dstSubresource.layerCount = 0;
9794 resolveRegion.dstOffset.x = 0;
9795 resolveRegion.dstOffset.y = 0;
9796 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009797 resolveRegion.extent.width = 1;
9798 resolveRegion.extent.height = 1;
9799 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009800 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9801 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009802 EndCommandBuffer();
9803
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009804 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009805
Chia-I Wuf7458c52015-10-26 21:10:41 +08009806 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009807 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009808 vkFreeMemory(m_device->device(), srcMem, NULL);
9809 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009810}
9811
Karl Schultz6addd812016-02-02 17:17:23 -07009812TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
9813 VkResult err;
9814 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009815
Karl Schultz6addd812016-02-02 17:17:23 -07009816 m_errorMonitor->SetDesiredFailureMsg(
9817 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009818 "vkCmdResolveImage called with unmatched source and dest image types.");
9819
Mike Stroyana3082432015-09-25 13:39:21 -06009820 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009821
9822 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009823 VkImage srcImage;
9824 VkImage dstImage;
9825 VkDeviceMemory srcMem;
9826 VkDeviceMemory destMem;
9827 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009828
9829 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009830 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9831 image_create_info.pNext = NULL;
9832 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9833 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9834 image_create_info.extent.width = 32;
9835 image_create_info.extent.height = 1;
9836 image_create_info.extent.depth = 1;
9837 image_create_info.mipLevels = 1;
9838 image_create_info.arrayLayers = 1;
9839 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
9840 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9841 // Note: Some implementations expect color attachment usage for any
9842 // multisample surface
9843 image_create_info.usage =
9844 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9845 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009846
Karl Schultz6addd812016-02-02 17:17:23 -07009847 err =
9848 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009849 ASSERT_VK_SUCCESS(err);
9850
Karl Schultz6addd812016-02-02 17:17:23 -07009851 image_create_info.imageType = VK_IMAGE_TYPE_1D;
9852 // Note: Some implementations expect color attachment usage for any
9853 // multisample surface
9854 image_create_info.usage =
9855 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9856 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009857
Karl Schultz6addd812016-02-02 17:17:23 -07009858 err =
9859 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009860 ASSERT_VK_SUCCESS(err);
9861
9862 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009863 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009864 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9865 memAlloc.pNext = NULL;
9866 memAlloc.allocationSize = 0;
9867 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009868
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009869 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009870 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009871 pass =
9872 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009873 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009874 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009875 ASSERT_VK_SUCCESS(err);
9876
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009877 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009878 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009879 pass =
9880 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009881 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009882 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009883 ASSERT_VK_SUCCESS(err);
9884
9885 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9886 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009887 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009888 ASSERT_VK_SUCCESS(err);
9889
9890 BeginCommandBuffer();
9891 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009892 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9893 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009894 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009895 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009896 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009897 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009898 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009899 resolveRegion.srcOffset.x = 0;
9900 resolveRegion.srcOffset.y = 0;
9901 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009902 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009903 resolveRegion.dstSubresource.mipLevel = 0;
9904 resolveRegion.dstSubresource.baseArrayLayer = 0;
9905 resolveRegion.dstSubresource.layerCount = 0;
9906 resolveRegion.dstOffset.x = 0;
9907 resolveRegion.dstOffset.y = 0;
9908 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009909 resolveRegion.extent.width = 1;
9910 resolveRegion.extent.height = 1;
9911 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009912 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9913 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009914 EndCommandBuffer();
9915
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009916 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009917
Chia-I Wuf7458c52015-10-26 21:10:41 +08009918 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009919 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009920 vkFreeMemory(m_device->device(), srcMem, NULL);
9921 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009922}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009923
Karl Schultz6addd812016-02-02 17:17:23 -07009924TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009925 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07009926 // to using a DS format, then cause it to hit error due to COLOR_BIT not
9927 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009928 // The image format check comes 2nd in validation so we trigger it first,
9929 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07009930 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009931
Karl Schultz6addd812016-02-02 17:17:23 -07009932 m_errorMonitor->SetDesiredFailureMsg(
9933 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009934 "Combination depth/stencil image formats can have only the ");
9935
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009936 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009937
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009938 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009939 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
9940 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009941
9942 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009943 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9944 ds_pool_ci.pNext = NULL;
9945 ds_pool_ci.maxSets = 1;
9946 ds_pool_ci.poolSizeCount = 1;
9947 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009948
9949 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009950 err =
9951 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009952 ASSERT_VK_SUCCESS(err);
9953
9954 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009955 dsl_binding.binding = 0;
9956 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
9957 dsl_binding.descriptorCount = 1;
9958 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9959 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009960
9961 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009962 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9963 ds_layout_ci.pNext = NULL;
9964 ds_layout_ci.bindingCount = 1;
9965 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009966 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009967 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9968 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009969 ASSERT_VK_SUCCESS(err);
9970
9971 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009972 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009973 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009974 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009975 alloc_info.descriptorPool = ds_pool;
9976 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009977 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9978 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009979 ASSERT_VK_SUCCESS(err);
9980
Karl Schultz6addd812016-02-02 17:17:23 -07009981 VkImage image_bad;
9982 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009983 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07009984 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009985 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07009986 const int32_t tex_width = 32;
9987 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009988
9989 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009990 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9991 image_create_info.pNext = NULL;
9992 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9993 image_create_info.format = tex_format_bad;
9994 image_create_info.extent.width = tex_width;
9995 image_create_info.extent.height = tex_height;
9996 image_create_info.extent.depth = 1;
9997 image_create_info.mipLevels = 1;
9998 image_create_info.arrayLayers = 1;
9999 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10000 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10001 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
10002 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
10003 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010004
Karl Schultz6addd812016-02-02 17:17:23 -070010005 err =
10006 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010007 ASSERT_VK_SUCCESS(err);
10008 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070010009 image_create_info.usage =
10010 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10011 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
10012 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010013 ASSERT_VK_SUCCESS(err);
10014
10015 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010016 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10017 image_view_create_info.image = image_bad;
10018 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
10019 image_view_create_info.format = tex_format_bad;
10020 image_view_create_info.subresourceRange.baseArrayLayer = 0;
10021 image_view_create_info.subresourceRange.baseMipLevel = 0;
10022 image_view_create_info.subresourceRange.layerCount = 1;
10023 image_view_create_info.subresourceRange.levelCount = 1;
10024 image_view_create_info.subresourceRange.aspectMask =
10025 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010026
10027 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070010028 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
10029 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010030
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010031 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010032
Chia-I Wuf7458c52015-10-26 21:10:41 +080010033 vkDestroyImage(m_device->device(), image_bad, NULL);
10034 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010035 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10036 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010037}
Tobin Ehliscde08892015-09-22 10:11:37 -060010038#endif // IMAGE_TESTS
10039
Tony Barbour300a6082015-04-07 13:44:53 -060010040int main(int argc, char **argv) {
10041 int result;
10042
Cody Northrop8e54a402016-03-08 22:25:52 -070010043#ifdef ANDROID
10044 int vulkanSupport = InitVulkan();
10045 if (vulkanSupport == 0)
10046 return 1;
10047#endif
10048
Tony Barbour300a6082015-04-07 13:44:53 -060010049 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060010050 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060010051
10052 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
10053
10054 result = RUN_ALL_TESTS();
10055
Tony Barbour6918cd52015-04-09 12:58:51 -060010056 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060010057 return result;
10058}