blob: de87f46dfc0fa5e94253b23d0dcfcd9e5c8b9d03 [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) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003687 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003688 ASSERT_NO_FATAL_FAILURE(InitState());
3689 ASSERT_NO_FATAL_FAILURE(InitViewport());
3690 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3691
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003692 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003693 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003694 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3695 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3696 pipeline_layout_ci.pushConstantRangeCount = 1;
3697 pipeline_layout_ci.pPushConstantRanges = &pc_range;
3698
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003699 //
3700 // Check for invalid push constant ranges in pipeline layouts.
3701 //
3702 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06003703 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003704 char const *msg;
3705 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003706
Karl Schultzc81037d2016-05-12 08:11:23 -06003707 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
3708 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
3709 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
3710 "vkCreatePipelineLayout() call has push constants index 0 with "
3711 "size 0."},
3712 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
3713 "vkCreatePipelineLayout() call has push constants index 0 with "
3714 "size 1."},
3715 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
3716 "vkCreatePipelineLayout() call has push constants index 0 with "
3717 "size 1."},
3718 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
3719 "vkCreatePipelineLayout() call has push constants index 0 with "
3720 "size 0."},
3721 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
3722 "vkCreatePipelineLayout() call has push constants index 0 with "
3723 "offset 1. Offset must"},
3724 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
3725 "vkCreatePipelineLayout() call has push constants index 0 "
3726 "with offset "},
3727 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
3728 "vkCreatePipelineLayout() call has push constants "
3729 "index 0 with offset "},
3730 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
3731 "vkCreatePipelineLayout() call has push constants index 0 "
3732 "with offset "},
3733 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
3734 "vkCreatePipelineLayout() call has push "
3735 "constants index 0 with offset "},
3736 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
3737 "vkCreatePipelineLayout() call has push "
3738 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003739 }};
3740
3741 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06003742 for (const auto &iter : range_tests) {
3743 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3745 iter.msg);
3746 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
3747 NULL, &pipeline_layout);
3748 m_errorMonitor->VerifyFound();
3749 if (VK_SUCCESS == err) {
3750 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3751 }
3752 }
3753
3754 // Check for invalid stage flag
3755 pc_range.offset = 0;
3756 pc_range.size = 16;
3757 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003758 m_errorMonitor->SetDesiredFailureMsg(
3759 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003760 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003761 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3762 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003763 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003764 if (VK_SUCCESS == err) {
3765 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3766 }
3767
3768 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06003769 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003770 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06003771 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003772 char const *msg;
3773 };
3774
Karl Schultzc81037d2016-05-12 08:11:23 -06003775 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003776 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
3777 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
3778 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
3779 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
3780 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
3781 "vkCreatePipelineLayout() call has push constants with overlapping "
3782 "ranges: 0:[0, 4), 1:[0, 4)"},
3783 {
3784 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
3785 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
3786 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
3787 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
3788 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
3789 "vkCreatePipelineLayout() call has push constants with "
3790 "overlapping "
3791 "ranges: 3:[12, 20), 4:[16, 20)",
3792 },
3793 {
3794 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
3795 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
3796 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
3797 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
3798 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
3799 "vkCreatePipelineLayout() call has push constants with "
3800 "overlapping "
3801 "ranges: 0:[16, 20), 1:[12, 20)",
3802 },
3803 {
3804 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
3805 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
3806 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
3807 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
3808 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
3809 "vkCreatePipelineLayout() call has push constants with "
3810 "overlapping "
3811 "ranges: 0:[16, 20), 3:[12, 20)",
3812 },
3813 {
3814 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
3815 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
3816 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
3817 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
3818 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
3819 "vkCreatePipelineLayout() call has push constants with "
3820 "overlapping "
3821 "ranges: 0:[16, 20), 2:[4, 100)",
3822 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003823
Karl Schultzc81037d2016-05-12 08:11:23 -06003824 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003825 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06003826 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
3827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003828 iter.msg);
3829 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
3830 NULL, &pipeline_layout);
3831 m_errorMonitor->VerifyFound();
3832 if (VK_SUCCESS == err) {
3833 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3834 }
3835 }
3836
3837 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06003838 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
3839 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
3840 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
3841 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
3842 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
3843 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
3844 ""},
3845 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
3846 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
3847 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
3848 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
3849 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
3850 ""}}};
3851 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003852 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
3853 m_errorMonitor->ExpectSuccess();
3854 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
3855 NULL, &pipeline_layout);
3856 m_errorMonitor->VerifyNotFound();
3857 if (VK_SUCCESS == err) {
3858 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3859 }
3860 }
3861
3862 //
3863 // CmdPushConstants tests
3864 //
Karl Schultzc81037d2016-05-12 08:11:23 -06003865 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003866
3867 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06003868 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
3869 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
3870 "vkCmdPushConstants() call has push constants with size 0. Size "
3871 "must be greater than zero and a multiple of 4."},
3872 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
3873 "vkCmdPushConstants() call has push constants with size 1. Size "
3874 "must be greater than zero and a multiple of 4."},
3875 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
3876 "vkCmdPushConstants() call has push constants with size 1. Size "
3877 "must be greater than zero and a multiple of 4."},
3878 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
3879 "vkCmdPushConstants() call has push constants with offset 1. "
3880 "Offset must be a multiple of 4."},
3881 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
3882 "vkCmdPushConstants() call has push constants with offset 1. "
3883 "Offset must be a multiple of 4."},
3884 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
3885 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
3886 "0x1 not within flag-matching ranges in pipeline layout"},
3887 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
3888 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
3889 "0x1 not within flag-matching ranges in pipeline layout"},
3890 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
3891 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
3892 "0x1 not within flag-matching ranges in pipeline layout"},
3893 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
3894 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
3895 "0x1 not within flag-matching ranges in pipeline layout"},
3896 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
3897 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
3898 "any of the ranges in pipeline layout"},
3899 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
3900 0, 16},
3901 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
3902 "any of the ranges in pipeline layout"},
3903 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003904 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06003905 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003906 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06003907 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003908 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06003909 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003910 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06003911 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003912 "vkCmdPushConstants() call has push constants with offset "},
3913 }};
3914
3915 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06003916 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003917 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06003918 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003919 };
Karl Schultzc81037d2016-05-12 08:11:23 -06003920 pipeline_layout_ci.pushConstantRangeCount =
3921 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003922 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003923 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3924 &pipeline_layout);
3925 ASSERT_VK_SUCCESS(err);
3926 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06003927 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3929 iter.msg);
3930 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06003931 iter.range.stageFlags, iter.range.offset,
3932 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003933 m_errorMonitor->VerifyFound();
3934 }
3935
3936 // Check for invalid stage flag
3937 m_errorMonitor->SetDesiredFailureMsg(
3938 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3939 "vkCmdPushConstants() call has no stageFlags set.");
3940 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06003941 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003942 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06003943 EndCommandBuffer();
3944 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
3945 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003946
Karl Schultzc81037d2016-05-12 08:11:23 -06003947 // overlapping range tests with cmd
3948 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
3949 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
3950 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
3951 "0x1 not within flag-matching ranges in pipeline layout"},
3952 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
3953 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
3954 "0x1 not within flag-matching ranges in pipeline layout"},
3955 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
3956 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
3957 "0x1 not within flag-matching ranges in pipeline layout"},
3958 }};
3959 const VkPushConstantRange pc_range3[] = {
3960 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
3961 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
3962 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
3963 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
3964 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
3965 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
3966 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
3967 };
3968 pipeline_layout_ci.pushConstantRangeCount =
3969 sizeof(pc_range3) / sizeof(VkPushConstantRange);
3970 pipeline_layout_ci.pPushConstantRanges = pc_range3;
3971 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3972 &pipeline_layout);
3973 ASSERT_VK_SUCCESS(err);
3974 BeginCommandBuffer();
3975 for (const auto &iter : cmd_overlap_tests) {
3976 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3977 iter.msg);
3978 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
3979 iter.range.stageFlags, iter.range.offset,
3980 iter.range.size, dummy_values);
3981 m_errorMonitor->VerifyFound();
3982 }
3983 EndCommandBuffer();
3984 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
3985 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3986
3987 // positive overlapping range tests with cmd
3988 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
3989 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
3990 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
3991 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
3992 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
3993 }};
3994 const VkPushConstantRange pc_range4[] = {
3995 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
3996 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
3997 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
3998 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
3999 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
4000 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
4001 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
4002 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
4003 };
4004 pipeline_layout_ci.pushConstantRangeCount =
4005 sizeof(pc_range4) / sizeof(VkPushConstantRange);
4006 pipeline_layout_ci.pPushConstantRanges = pc_range4;
4007 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4008 &pipeline_layout);
4009 ASSERT_VK_SUCCESS(err);
4010 BeginCommandBuffer();
4011 for (const auto &iter : cmd_overlap_tests_pos) {
4012 m_errorMonitor->ExpectSuccess();
4013 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
4014 iter.range.stageFlags, iter.range.offset,
4015 iter.range.size, dummy_values);
4016 m_errorMonitor->VerifyNotFound();
4017 }
4018 EndCommandBuffer();
4019 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004020 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4021}
4022
Karl Schultz6addd812016-02-02 17:17:23 -07004023TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07004024 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07004025 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004026
4027 ASSERT_NO_FATAL_FAILURE(InitState());
4028 ASSERT_NO_FATAL_FAILURE(InitViewport());
4029 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4030
4031 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
4032 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004033 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4034 ds_type_count[0].descriptorCount = 10;
4035 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
4036 ds_type_count[1].descriptorCount = 2;
4037 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
4038 ds_type_count[2].descriptorCount = 2;
4039 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
4040 ds_type_count[3].descriptorCount = 5;
4041 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
4042 // type
4043 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4044 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4045 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004046
4047 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004048 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4049 ds_pool_ci.pNext = NULL;
4050 ds_pool_ci.maxSets = 5;
4051 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
4052 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004053
4054 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004055 err =
4056 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004057 ASSERT_VK_SUCCESS(err);
4058
4059 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
4060 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004061 dsl_binding[0].binding = 0;
4062 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4063 dsl_binding[0].descriptorCount = 5;
4064 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4065 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004066
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004067 // Create layout identical to set0 layout but w/ different stageFlags
4068 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004069 dsl_fs_stage_only.binding = 0;
4070 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4071 dsl_fs_stage_only.descriptorCount = 5;
4072 dsl_fs_stage_only.stageFlags =
4073 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
4074 // bind time
4075 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004076 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004077 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4078 ds_layout_ci.pNext = NULL;
4079 ds_layout_ci.bindingCount = 1;
4080 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004081 static const uint32_t NUM_LAYOUTS = 4;
4082 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004083 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004084 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
4085 // layout for error case
4086 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4087 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004088 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004089 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07004090 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4091 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004092 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004093 dsl_binding[0].binding = 0;
4094 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004095 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004096 dsl_binding[1].binding = 1;
4097 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
4098 dsl_binding[1].descriptorCount = 2;
4099 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
4100 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004101 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004102 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07004103 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4104 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004105 ASSERT_VK_SUCCESS(err);
4106 dsl_binding[0].binding = 0;
4107 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004108 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004109 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07004110 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4111 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004112 ASSERT_VK_SUCCESS(err);
4113 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004114 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07004115 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4116 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004117 ASSERT_VK_SUCCESS(err);
4118
4119 static const uint32_t NUM_SETS = 4;
4120 VkDescriptorSet descriptorSet[NUM_SETS] = {};
4121 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004122 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004123 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004124 alloc_info.descriptorPool = ds_pool;
4125 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004126 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4127 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004128 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004129 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07004130 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004131 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07004132 err =
4133 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004134 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004135
4136 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004137 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4138 pipeline_layout_ci.pNext = NULL;
4139 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
4140 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004141
4142 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004143 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4144 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004145 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004146 // Create pipelineLayout with only one setLayout
4147 pipeline_layout_ci.setLayoutCount = 1;
4148 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004149 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4150 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004151 ASSERT_VK_SUCCESS(err);
4152 // Create pipelineLayout with 2 descriptor setLayout at index 0
4153 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
4154 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07004155 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4156 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004157 ASSERT_VK_SUCCESS(err);
4158 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
4159 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
4160 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07004161 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4162 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004163 ASSERT_VK_SUCCESS(err);
4164 // Create pipelineLayout with UB type, but stageFlags for FS only
4165 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
4166 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07004167 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4168 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004169 ASSERT_VK_SUCCESS(err);
4170 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
4171 VkDescriptorSetLayout pl_bad_s0[2] = {};
4172 pl_bad_s0[0] = ds_layout_fs_only;
4173 pl_bad_s0[1] = ds_layout[1];
4174 pipeline_layout_ci.setLayoutCount = 2;
4175 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
4176 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07004177 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4178 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004179 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004180
4181 // Create a buffer to update the descriptor with
4182 uint32_t qfi = 0;
4183 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004184 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4185 buffCI.size = 1024;
4186 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4187 buffCI.queueFamilyIndexCount = 1;
4188 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004189
4190 VkBuffer dyub;
4191 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4192 ASSERT_VK_SUCCESS(err);
4193 // Correctly update descriptor to avoid "NOT_UPDATED" error
4194 static const uint32_t NUM_BUFFS = 5;
4195 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004196 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07004197 buffInfo[i].buffer = dyub;
4198 buffInfo[i].offset = 0;
4199 buffInfo[i].range = 1024;
4200 }
Karl Schultz6addd812016-02-02 17:17:23 -07004201 VkImage image;
4202 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4203 const int32_t tex_width = 32;
4204 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004205 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004206 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4207 image_create_info.pNext = NULL;
4208 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4209 image_create_info.format = tex_format;
4210 image_create_info.extent.width = tex_width;
4211 image_create_info.extent.height = tex_height;
4212 image_create_info.extent.depth = 1;
4213 image_create_info.mipLevels = 1;
4214 image_create_info.arrayLayers = 1;
4215 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4216 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4217 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4218 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004219 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
4220 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004221
Karl Schultz6addd812016-02-02 17:17:23 -07004222 VkMemoryRequirements memReqs;
4223 VkDeviceMemory imageMem;
4224 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004225 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004226 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4227 memAlloc.pNext = NULL;
4228 memAlloc.allocationSize = 0;
4229 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004230 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
4231 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07004232 pass =
4233 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004234 ASSERT_TRUE(pass);
4235 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
4236 ASSERT_VK_SUCCESS(err);
4237 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
4238 ASSERT_VK_SUCCESS(err);
4239
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004240 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004241 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4242 image_view_create_info.image = image;
4243 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
4244 image_view_create_info.format = tex_format;
4245 image_view_create_info.subresourceRange.layerCount = 1;
4246 image_view_create_info.subresourceRange.baseMipLevel = 0;
4247 image_view_create_info.subresourceRange.levelCount = 1;
4248 image_view_create_info.subresourceRange.aspectMask =
4249 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004250
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004251 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07004252 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
4253 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004254 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004255 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004256 imageInfo[0].imageView = view;
4257 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4258 imageInfo[1].imageView = view;
4259 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004260 imageInfo[2].imageView = view;
4261 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4262 imageInfo[3].imageView = view;
4263 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004264
4265 static const uint32_t NUM_SET_UPDATES = 3;
4266 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
4267 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4268 descriptor_write[0].dstSet = descriptorSet[0];
4269 descriptor_write[0].dstBinding = 0;
4270 descriptor_write[0].descriptorCount = 5;
4271 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4272 descriptor_write[0].pBufferInfo = buffInfo;
4273 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4274 descriptor_write[1].dstSet = descriptorSet[1];
4275 descriptor_write[1].dstBinding = 0;
4276 descriptor_write[1].descriptorCount = 2;
4277 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
4278 descriptor_write[1].pImageInfo = imageInfo;
4279 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4280 descriptor_write[2].dstSet = descriptorSet[1];
4281 descriptor_write[2].dstBinding = 1;
4282 descriptor_write[2].descriptorCount = 2;
4283 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004284 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004285
4286 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004287
Tobin Ehlis88452832015-12-03 09:40:56 -07004288 // Create PSO to be used for draw-time errors below
4289 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004290 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004291 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07004292 "out gl_PerVertex {\n"
4293 " vec4 gl_Position;\n"
4294 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004295 "void main(){\n"
4296 " gl_Position = vec4(1);\n"
4297 "}\n";
4298 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004299 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004300 "\n"
4301 "layout(location=0) out vec4 x;\n"
4302 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
4303 "void main(){\n"
4304 " x = vec4(bar.y);\n"
4305 "}\n";
4306 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4307 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004308 VkPipelineObj pipe(m_device);
4309 pipe.AddShader(&vs);
4310 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07004311 pipe.AddColorAttachment();
4312 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07004313
4314 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07004315
Karl Schultz6addd812016-02-02 17:17:23 -07004316 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4317 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4318 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
4319 // of PSO
4320 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
4321 // cmd_pipeline.c
4322 // due to the fact that cmd_alloc_dset_data() has not been called in
4323 // cmd_bind_graphics_pipeline()
4324 // TODO : Want to cause various binding incompatibility issues here to test
4325 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07004326 // First cause various verify_layout_compatibility() fails
4327 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004328 // verify_set_layout_compatibility fail cases:
4329 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07004330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4331 " due to: invalid VkPipelineLayout ");
4332 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4333 VK_PIPELINE_BIND_POINT_GRAPHICS,
4334 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
4335 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004336 m_errorMonitor->VerifyFound();
4337
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004338 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07004339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4340 " attempting to bind set to index 1");
4341 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4342 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
4343 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004344 m_errorMonitor->VerifyFound();
4345
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004346 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004347 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
4348 // descriptors
4349 m_errorMonitor->SetDesiredFailureMsg(
4350 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06004351 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07004352 vkCmdBindDescriptorSets(
4353 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4354 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004355 m_errorMonitor->VerifyFound();
4356
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004357 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
4358 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07004359 m_errorMonitor->SetDesiredFailureMsg(
4360 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06004361 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07004362 vkCmdBindDescriptorSets(
4363 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4364 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004365 m_errorMonitor->VerifyFound();
4366
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004367 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
4368 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07004369 m_errorMonitor->SetDesiredFailureMsg(
4370 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06004371 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07004372 vkCmdBindDescriptorSets(
4373 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4374 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004375 m_errorMonitor->VerifyFound();
4376
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004377 // Cause INFO messages due to disturbing previously bound Sets
4378 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07004379 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4380 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4381 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004382 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07004383 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004384 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004385 " previously bound as set #0 was disturbed ");
4386 vkCmdBindDescriptorSets(
4387 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4388 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004389 m_errorMonitor->VerifyFound();
4390
Karl Schultz6addd812016-02-02 17:17:23 -07004391 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4392 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4393 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004394 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004396 " newly bound as set #0 so set #1 and "
4397 "any subsequent sets were disturbed ");
4398 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4399 VK_PIPELINE_BIND_POINT_GRAPHICS,
4400 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004401 m_errorMonitor->VerifyFound();
4402
Tobin Ehlis88452832015-12-03 09:40:56 -07004403 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07004404 // 1. Error due to not binding required set (we actually use same code as
4405 // above to disturb set0)
4406 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4407 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4408 2, &descriptorSet[0], 0, NULL);
4409 vkCmdBindDescriptorSets(
4410 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4411 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
4412 m_errorMonitor->SetDesiredFailureMsg(
4413 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4414 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07004415 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004416 m_errorMonitor->VerifyFound();
4417
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004418 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004419 // 2. Error due to bound set not being compatible with PSO's
4420 // VkPipelineLayout (diff stageFlags in this case)
4421 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4422 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4423 2, &descriptorSet[0], 0, NULL);
4424 m_errorMonitor->SetDesiredFailureMsg(
4425 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4426 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07004427 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004428 m_errorMonitor->VerifyFound();
4429
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004430 // Remaining clean-up
4431 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004432 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004433 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
4434 }
4435 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06004436 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
4437 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004438 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004439 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4440 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4441}
Tobin Ehlis559c6382015-11-05 09:52:49 -07004442
Karl Schultz6addd812016-02-02 17:17:23 -07004443TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004444
Karl Schultz6addd812016-02-02 17:17:23 -07004445 m_errorMonitor->SetDesiredFailureMsg(
4446 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004447 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004448
4449 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004450 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004451 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004452 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004453
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004454 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004455}
4456
Karl Schultz6addd812016-02-02 17:17:23 -07004457TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
4458 VkResult err;
4459 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004460
Karl Schultz6addd812016-02-02 17:17:23 -07004461 m_errorMonitor->SetDesiredFailureMsg(
4462 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07004463 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004464
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004465 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004466
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004467 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004468 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06004469 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004470 cmd.commandPool = m_commandPool;
4471 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004472 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06004473
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004474 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06004475 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004476
4477 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004478 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07004479 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004480 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06004481 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07004482 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
4483 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004484 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004485
4486 // The error should be caught by validation of the BeginCommandBuffer call
4487 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
4488
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004489 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004490 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004491}
4492
Karl Schultz6addd812016-02-02 17:17:23 -07004493TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004494 // Cause error due to Begin while recording CB
4495 // Then cause 2 errors for attempting to reset CB w/o having
4496 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
4497 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004499 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004500
4501 ASSERT_NO_FATAL_FAILURE(InitState());
4502
4503 // Calls AllocateCommandBuffers
4504 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
4505
Karl Schultz6addd812016-02-02 17:17:23 -07004506 // Force the failure by setting the Renderpass and Framebuffer fields with
4507 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004508 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07004509 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004510 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4511 cmd_buf_info.pNext = NULL;
4512 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004513 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004514
4515 // Begin CB to transition to recording state
4516 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
4517 // Can't re-begin. This should trigger error
4518 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004519 m_errorMonitor->VerifyFound();
4520
Karl Schultz6addd812016-02-02 17:17:23 -07004521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4522 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004523 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
4524 // Reset attempt will trigger error due to incorrect CommandPool state
4525 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004526 m_errorMonitor->VerifyFound();
4527
Karl Schultz6addd812016-02-02 17:17:23 -07004528 m_errorMonitor->SetDesiredFailureMsg(
4529 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4530 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004531 // Transition CB to RECORDED state
4532 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
4533 // Now attempting to Begin will implicitly reset, which triggers error
4534 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004535 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004536}
4537
Karl Schultz6addd812016-02-02 17:17:23 -07004538TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004539 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07004540 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004541
Karl Schultz6addd812016-02-02 17:17:23 -07004542 m_errorMonitor->SetDesiredFailureMsg(
4543 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004544 "Invalid Pipeline CreateInfo State: Vtx Shader required");
4545
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004546 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06004547 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004548
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004549 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004550 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4551 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004552
4553 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004554 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4555 ds_pool_ci.pNext = NULL;
4556 ds_pool_ci.maxSets = 1;
4557 ds_pool_ci.poolSizeCount = 1;
4558 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004559
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004560 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004561 err =
4562 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004563 ASSERT_VK_SUCCESS(err);
4564
Tony Barboureb254902015-07-15 12:50:33 -06004565 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004566 dsl_binding.binding = 0;
4567 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4568 dsl_binding.descriptorCount = 1;
4569 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4570 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004571
Tony Barboureb254902015-07-15 12:50:33 -06004572 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004573 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4574 ds_layout_ci.pNext = NULL;
4575 ds_layout_ci.bindingCount = 1;
4576 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004577
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004578 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004579 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4580 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004581 ASSERT_VK_SUCCESS(err);
4582
4583 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004584 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004585 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004586 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004587 alloc_info.descriptorPool = ds_pool;
4588 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004589 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4590 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004591 ASSERT_VK_SUCCESS(err);
4592
Tony Barboureb254902015-07-15 12:50:33 -06004593 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004594 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4595 pipeline_layout_ci.setLayoutCount = 1;
4596 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004597
4598 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004599 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4600 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004601 ASSERT_VK_SUCCESS(err);
4602
Tobin Ehlise68360f2015-10-01 11:15:13 -06004603 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07004604 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06004605
4606 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004607 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4608 vp_state_ci.scissorCount = 1;
4609 vp_state_ci.pScissors = &sc;
4610 vp_state_ci.viewportCount = 1;
4611 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004612
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004613 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4614 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4615 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4616 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4617 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4618 rs_state_ci.depthClampEnable = VK_FALSE;
4619 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4620 rs_state_ci.depthBiasEnable = VK_FALSE;
4621
Tony Barboureb254902015-07-15 12:50:33 -06004622 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004623 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4624 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004625 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004626 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4627 gp_ci.layout = pipeline_layout;
4628 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06004629
4630 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004631 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4632 pc_ci.initialDataSize = 0;
4633 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004634
4635 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06004636 VkPipelineCache pipelineCache;
4637
Karl Schultz6addd812016-02-02 17:17:23 -07004638 err =
4639 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06004640 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004641 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4642 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004643
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004644 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004645
Chia-I Wuf7458c52015-10-26 21:10:41 +08004646 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4647 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4648 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4649 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004650}
Tobin Ehlis912df022015-09-17 08:46:18 -06004651/*// TODO : This test should be good, but needs Tess support in compiler to run
4652TEST_F(VkLayerTest, InvalidPatchControlPoints)
4653{
4654 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06004655 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004656
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004658 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
4659primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004660
Tobin Ehlis912df022015-09-17 08:46:18 -06004661 ASSERT_NO_FATAL_FAILURE(InitState());
4662 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06004663
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004664 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06004665 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004666 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004667
4668 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4669 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4670 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004671 ds_pool_ci.poolSizeCount = 1;
4672 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06004673
4674 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004675 err = vkCreateDescriptorPool(m_device->device(),
4676VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06004677 ASSERT_VK_SUCCESS(err);
4678
4679 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08004680 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06004681 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08004682 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004683 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4684 dsl_binding.pImmutableSamplers = NULL;
4685
4686 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004687 ds_layout_ci.sType =
4688VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06004689 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004690 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004691 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06004692
4693 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004694 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4695&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06004696 ASSERT_VK_SUCCESS(err);
4697
4698 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004699 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
4700VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06004701 ASSERT_VK_SUCCESS(err);
4702
4703 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004704 pipeline_layout_ci.sType =
4705VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06004706 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004707 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004708 pipeline_layout_ci.pSetLayouts = &ds_layout;
4709
4710 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004711 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4712&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06004713 ASSERT_VK_SUCCESS(err);
4714
4715 VkPipelineShaderStageCreateInfo shaderStages[3];
4716 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
4717
Karl Schultz6addd812016-02-02 17:17:23 -07004718 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
4719this);
Tobin Ehlis912df022015-09-17 08:46:18 -06004720 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07004721 VkShaderObj
4722tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
4723this);
4724 VkShaderObj
4725te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
4726this);
Tobin Ehlis912df022015-09-17 08:46:18 -06004727
Karl Schultz6addd812016-02-02 17:17:23 -07004728 shaderStages[0].sType =
4729VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004730 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004731 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07004732 shaderStages[1].sType =
4733VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004734 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004735 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07004736 shaderStages[2].sType =
4737VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004738 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004739 shaderStages[2].shader = te.handle();
4740
4741 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004742 iaCI.sType =
4743VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08004744 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06004745
4746 VkPipelineTessellationStateCreateInfo tsCI = {};
4747 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
4748 tsCI.patchControlPoints = 0; // This will cause an error
4749
4750 VkGraphicsPipelineCreateInfo gp_ci = {};
4751 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4752 gp_ci.pNext = NULL;
4753 gp_ci.stageCount = 3;
4754 gp_ci.pStages = shaderStages;
4755 gp_ci.pVertexInputState = NULL;
4756 gp_ci.pInputAssemblyState = &iaCI;
4757 gp_ci.pTessellationState = &tsCI;
4758 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004759 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06004760 gp_ci.pMultisampleState = NULL;
4761 gp_ci.pDepthStencilState = NULL;
4762 gp_ci.pColorBlendState = NULL;
4763 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4764 gp_ci.layout = pipeline_layout;
4765 gp_ci.renderPass = renderPass();
4766
4767 VkPipelineCacheCreateInfo pc_ci = {};
4768 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4769 pc_ci.pNext = NULL;
4770 pc_ci.initialSize = 0;
4771 pc_ci.initialData = 0;
4772 pc_ci.maxSize = 0;
4773
4774 VkPipeline pipeline;
4775 VkPipelineCache pipelineCache;
4776
Karl Schultz6addd812016-02-02 17:17:23 -07004777 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
4778&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06004779 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004780 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4781&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06004782
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004783 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004784
Chia-I Wuf7458c52015-10-26 21:10:41 +08004785 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4786 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4787 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4788 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06004789}
4790*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06004791// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07004792TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07004793 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004794
Karl Schultz6addd812016-02-02 17:17:23 -07004795 m_errorMonitor->SetDesiredFailureMsg(
4796 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004797 "Gfx Pipeline viewport count (1) must match scissor count (0).");
4798
Tobin Ehlise68360f2015-10-01 11:15:13 -06004799 ASSERT_NO_FATAL_FAILURE(InitState());
4800 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004801
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004802 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004803 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4804 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004805
4806 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004807 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4808 ds_pool_ci.maxSets = 1;
4809 ds_pool_ci.poolSizeCount = 1;
4810 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004811
4812 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004813 err =
4814 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004815 ASSERT_VK_SUCCESS(err);
4816
4817 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004818 dsl_binding.binding = 0;
4819 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4820 dsl_binding.descriptorCount = 1;
4821 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004822
4823 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004824 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4825 ds_layout_ci.bindingCount = 1;
4826 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004827
4828 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004829 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4830 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004831 ASSERT_VK_SUCCESS(err);
4832
4833 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004834 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004835 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004836 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004837 alloc_info.descriptorPool = ds_pool;
4838 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004839 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4840 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004841 ASSERT_VK_SUCCESS(err);
4842
4843 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004844 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4845 pipeline_layout_ci.setLayoutCount = 1;
4846 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004847
4848 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004849 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4850 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004851 ASSERT_VK_SUCCESS(err);
4852
4853 VkViewport vp = {}; // Just need dummy vp to point to
4854
4855 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004856 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4857 vp_state_ci.scissorCount = 0;
4858 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
4859 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004860
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004861 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4862 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4863 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4864 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4865 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4866 rs_state_ci.depthClampEnable = VK_FALSE;
4867 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4868 rs_state_ci.depthBiasEnable = VK_FALSE;
4869
Cody Northropeb3a6c12015-10-05 14:44:45 -06004870 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004871 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004872
Karl Schultz6addd812016-02-02 17:17:23 -07004873 VkShaderObj vs(m_device, bindStateVertShaderText,
4874 VK_SHADER_STAGE_VERTEX_BIT, this);
4875 VkShaderObj fs(m_device, bindStateFragShaderText,
4876 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004877 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004878 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004879 shaderStages[0] = vs.GetStageCreateInfo();
4880 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004881
4882 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004883 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4884 gp_ci.stageCount = 2;
4885 gp_ci.pStages = shaderStages;
4886 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004887 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004888 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4889 gp_ci.layout = pipeline_layout;
4890 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004891
4892 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004893 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004894
4895 VkPipeline pipeline;
4896 VkPipelineCache pipelineCache;
4897
Karl Schultz6addd812016-02-02 17:17:23 -07004898 err =
4899 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004900 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004901 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4902 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004903
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004904 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004905
Chia-I Wuf7458c52015-10-26 21:10:41 +08004906 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4907 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4908 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4909 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004910}
Karl Schultz6addd812016-02-02 17:17:23 -07004911// Don't set viewport state in PSO. This is an error b/c we always need this
4912// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06004913// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07004914TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06004915 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07004916 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004917
Karl Schultz6addd812016-02-02 17:17:23 -07004918 m_errorMonitor->SetDesiredFailureMsg(
4919 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004920 "Gfx Pipeline pViewportState is null. Even if ");
4921
Tobin Ehlise68360f2015-10-01 11:15:13 -06004922 ASSERT_NO_FATAL_FAILURE(InitState());
4923 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004924
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004925 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004926 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4927 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004928
4929 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004930 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4931 ds_pool_ci.maxSets = 1;
4932 ds_pool_ci.poolSizeCount = 1;
4933 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004934
4935 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004936 err =
4937 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004938 ASSERT_VK_SUCCESS(err);
4939
4940 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004941 dsl_binding.binding = 0;
4942 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4943 dsl_binding.descriptorCount = 1;
4944 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004945
4946 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004947 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4948 ds_layout_ci.bindingCount = 1;
4949 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004950
4951 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004952 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4953 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004954 ASSERT_VK_SUCCESS(err);
4955
4956 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004957 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004958 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004959 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004960 alloc_info.descriptorPool = ds_pool;
4961 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004962 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4963 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004964 ASSERT_VK_SUCCESS(err);
4965
4966 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004967 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4968 pipeline_layout_ci.setLayoutCount = 1;
4969 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004970
4971 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004972 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4973 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004974 ASSERT_VK_SUCCESS(err);
4975
4976 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4977 // Set scissor as dynamic to avoid second error
4978 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004979 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4980 dyn_state_ci.dynamicStateCount = 1;
4981 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004982
Cody Northropeb3a6c12015-10-05 14:44:45 -06004983 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004984 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004985
Karl Schultz6addd812016-02-02 17:17:23 -07004986 VkShaderObj vs(m_device, bindStateVertShaderText,
4987 VK_SHADER_STAGE_VERTEX_BIT, this);
4988 VkShaderObj fs(m_device, bindStateFragShaderText,
4989 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004990 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004991 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004992 shaderStages[0] = vs.GetStageCreateInfo();
4993 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004994
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004995
4996 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4997 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4998 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4999 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
5000 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
5001 rs_state_ci.depthClampEnable = VK_FALSE;
5002 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
5003 rs_state_ci.depthBiasEnable = VK_FALSE;
5004
Tobin Ehlise68360f2015-10-01 11:15:13 -06005005 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005006 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5007 gp_ci.stageCount = 2;
5008 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005009 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07005010 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
5011 // should cause validation error
5012 gp_ci.pDynamicState = &dyn_state_ci;
5013 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5014 gp_ci.layout = pipeline_layout;
5015 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005016
5017 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005018 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005019
5020 VkPipeline pipeline;
5021 VkPipelineCache pipelineCache;
5022
Karl Schultz6addd812016-02-02 17:17:23 -07005023 err =
5024 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005025 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005026 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5027 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005028
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005029 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005030
Chia-I Wuf7458c52015-10-26 21:10:41 +08005031 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5032 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5033 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5034 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005035}
5036// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07005037// Then run second test where dynamic scissor count doesn't match PSO scissor
5038// count
5039TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
5040 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005041
Karl Schultz6addd812016-02-02 17:17:23 -07005042 m_errorMonitor->SetDesiredFailureMsg(
5043 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005044 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
5045
Tobin Ehlise68360f2015-10-01 11:15:13 -06005046 ASSERT_NO_FATAL_FAILURE(InitState());
5047 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06005048
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005049 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005050 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5051 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005052
5053 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005054 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5055 ds_pool_ci.maxSets = 1;
5056 ds_pool_ci.poolSizeCount = 1;
5057 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005058
5059 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005060 err =
5061 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005062 ASSERT_VK_SUCCESS(err);
5063
5064 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005065 dsl_binding.binding = 0;
5066 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5067 dsl_binding.descriptorCount = 1;
5068 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005069
5070 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005071 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5072 ds_layout_ci.bindingCount = 1;
5073 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005074
5075 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005076 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5077 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005078 ASSERT_VK_SUCCESS(err);
5079
5080 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005081 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005082 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005083 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005084 alloc_info.descriptorPool = ds_pool;
5085 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005086 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5087 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005088 ASSERT_VK_SUCCESS(err);
5089
5090 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005091 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5092 pipeline_layout_ci.setLayoutCount = 1;
5093 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005094
5095 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005096 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5097 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005098 ASSERT_VK_SUCCESS(err);
5099
5100 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005101 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5102 vp_state_ci.viewportCount = 1;
5103 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
5104 vp_state_ci.scissorCount = 1;
5105 vp_state_ci.pScissors =
5106 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06005107
5108 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
5109 // Set scissor as dynamic to avoid that error
5110 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005111 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5112 dyn_state_ci.dynamicStateCount = 1;
5113 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005114
Cody Northropeb3a6c12015-10-05 14:44:45 -06005115 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07005116 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06005117
Karl Schultz6addd812016-02-02 17:17:23 -07005118 VkShaderObj vs(m_device, bindStateVertShaderText,
5119 VK_SHADER_STAGE_VERTEX_BIT, this);
5120 VkShaderObj fs(m_device, bindStateFragShaderText,
5121 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005122 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005123 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08005124 shaderStages[0] = vs.GetStageCreateInfo();
5125 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005126
Cody Northropf6622dc2015-10-06 10:33:21 -06005127 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5128 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5129 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005130 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06005131 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005132 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06005133 vi_ci.pVertexAttributeDescriptions = nullptr;
5134
5135 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5136 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5137 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5138
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005139 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005140 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06005141 rs_ci.pNext = nullptr;
5142
Mark Youngc89c6312016-03-31 16:03:20 -06005143 VkPipelineColorBlendAttachmentState att = {};
5144 att.blendEnable = VK_FALSE;
5145 att.colorWriteMask = 0xf;
5146
Cody Northropf6622dc2015-10-06 10:33:21 -06005147 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5148 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5149 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06005150 cb_ci.attachmentCount = 1;
5151 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06005152
Tobin Ehlise68360f2015-10-01 11:15:13 -06005153 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005154 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5155 gp_ci.stageCount = 2;
5156 gp_ci.pStages = shaderStages;
5157 gp_ci.pVertexInputState = &vi_ci;
5158 gp_ci.pInputAssemblyState = &ia_ci;
5159 gp_ci.pViewportState = &vp_state_ci;
5160 gp_ci.pRasterizationState = &rs_ci;
5161 gp_ci.pColorBlendState = &cb_ci;
5162 gp_ci.pDynamicState = &dyn_state_ci;
5163 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5164 gp_ci.layout = pipeline_layout;
5165 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005166
5167 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005168 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005169
5170 VkPipeline pipeline;
5171 VkPipelineCache pipelineCache;
5172
Karl Schultz6addd812016-02-02 17:17:23 -07005173 err =
5174 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005175 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005176 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5177 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005178
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005179 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005180
Tobin Ehlisd332f282015-10-02 11:00:56 -06005181 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07005182 // First need to successfully create the PSO from above by setting
5183 // pViewports
5184 m_errorMonitor->SetDesiredFailureMsg(
5185 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5186 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
5187 "scissorCount is 1. These counts must match.");
5188
5189 VkViewport vp = {}; // Just need dummy vp to point to
5190 vp_state_ci.pViewports = &vp;
5191 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5192 &gp_ci, NULL, &pipeline);
5193 ASSERT_VK_SUCCESS(err);
5194 BeginCommandBuffer();
5195 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5196 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5197 VkRect2D scissors[2] = {}; // don't care about data
5198 // Count of 2 doesn't match PSO count of 1
5199 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
5200 Draw(1, 0, 0, 0);
5201
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005202 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07005203
5204 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5205 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5206 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5207 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5208}
5209// Create PSO w/o non-zero scissorCount but no scissor data
5210// Then run second test where dynamic viewportCount doesn't match PSO
5211// viewportCount
5212TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
5213 VkResult err;
5214
5215 m_errorMonitor->SetDesiredFailureMsg(
5216 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5217 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
5218
5219 ASSERT_NO_FATAL_FAILURE(InitState());
5220 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5221
5222 VkDescriptorPoolSize ds_type_count = {};
5223 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5224 ds_type_count.descriptorCount = 1;
5225
5226 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5227 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5228 ds_pool_ci.maxSets = 1;
5229 ds_pool_ci.poolSizeCount = 1;
5230 ds_pool_ci.pPoolSizes = &ds_type_count;
5231
5232 VkDescriptorPool ds_pool;
5233 err =
5234 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5235 ASSERT_VK_SUCCESS(err);
5236
5237 VkDescriptorSetLayoutBinding dsl_binding = {};
5238 dsl_binding.binding = 0;
5239 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5240 dsl_binding.descriptorCount = 1;
5241 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5242
5243 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5244 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5245 ds_layout_ci.bindingCount = 1;
5246 ds_layout_ci.pBindings = &dsl_binding;
5247
5248 VkDescriptorSetLayout ds_layout;
5249 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5250 &ds_layout);
5251 ASSERT_VK_SUCCESS(err);
5252
5253 VkDescriptorSet descriptorSet;
5254 VkDescriptorSetAllocateInfo alloc_info = {};
5255 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5256 alloc_info.descriptorSetCount = 1;
5257 alloc_info.descriptorPool = ds_pool;
5258 alloc_info.pSetLayouts = &ds_layout;
5259 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5260 &descriptorSet);
5261 ASSERT_VK_SUCCESS(err);
5262
5263 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5264 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5265 pipeline_layout_ci.setLayoutCount = 1;
5266 pipeline_layout_ci.pSetLayouts = &ds_layout;
5267
5268 VkPipelineLayout pipeline_layout;
5269 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5270 &pipeline_layout);
5271 ASSERT_VK_SUCCESS(err);
5272
5273 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5274 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5275 vp_state_ci.scissorCount = 1;
5276 vp_state_ci.pScissors =
5277 NULL; // Null scissor w/ count of 1 should cause error
5278 vp_state_ci.viewportCount = 1;
5279 vp_state_ci.pViewports =
5280 NULL; // vp is dynamic (below) so this won't cause error
5281
5282 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
5283 // Set scissor as dynamic to avoid that error
5284 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5285 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5286 dyn_state_ci.dynamicStateCount = 1;
5287 dyn_state_ci.pDynamicStates = &vp_state;
5288
5289 VkPipelineShaderStageCreateInfo shaderStages[2];
5290 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5291
5292 VkShaderObj vs(m_device, bindStateVertShaderText,
5293 VK_SHADER_STAGE_VERTEX_BIT, this);
5294 VkShaderObj fs(m_device, bindStateFragShaderText,
5295 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005296 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005297 // but add it to be able to run on more devices
5298 shaderStages[0] = vs.GetStageCreateInfo();
5299 shaderStages[1] = fs.GetStageCreateInfo();
5300
5301 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5302 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5303 vi_ci.pNext = nullptr;
5304 vi_ci.vertexBindingDescriptionCount = 0;
5305 vi_ci.pVertexBindingDescriptions = nullptr;
5306 vi_ci.vertexAttributeDescriptionCount = 0;
5307 vi_ci.pVertexAttributeDescriptions = nullptr;
5308
5309 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5310 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5311 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5312
5313 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5314 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5315 rs_ci.pNext = nullptr;
5316
Mark Youngc89c6312016-03-31 16:03:20 -06005317 VkPipelineColorBlendAttachmentState att = {};
5318 att.blendEnable = VK_FALSE;
5319 att.colorWriteMask = 0xf;
5320
Karl Schultz6addd812016-02-02 17:17:23 -07005321 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5322 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5323 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06005324 cb_ci.attachmentCount = 1;
5325 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07005326
5327 VkGraphicsPipelineCreateInfo gp_ci = {};
5328 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5329 gp_ci.stageCount = 2;
5330 gp_ci.pStages = shaderStages;
5331 gp_ci.pVertexInputState = &vi_ci;
5332 gp_ci.pInputAssemblyState = &ia_ci;
5333 gp_ci.pViewportState = &vp_state_ci;
5334 gp_ci.pRasterizationState = &rs_ci;
5335 gp_ci.pColorBlendState = &cb_ci;
5336 gp_ci.pDynamicState = &dyn_state_ci;
5337 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5338 gp_ci.layout = pipeline_layout;
5339 gp_ci.renderPass = renderPass();
5340
5341 VkPipelineCacheCreateInfo pc_ci = {};
5342 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5343
5344 VkPipeline pipeline;
5345 VkPipelineCache pipelineCache;
5346
5347 err =
5348 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5349 ASSERT_VK_SUCCESS(err);
5350 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5351 &gp_ci, NULL, &pipeline);
5352
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005353 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07005354
5355 // Now hit second fail case where we set scissor w/ different count than PSO
5356 // First need to successfully create the PSO from above by setting
5357 // pViewports
5358 m_errorMonitor->SetDesiredFailureMsg(
5359 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5360 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
5361 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005362
Tobin Ehlisd332f282015-10-02 11:00:56 -06005363 VkRect2D sc = {}; // Just need dummy vp to point to
5364 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07005365 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5366 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005367 ASSERT_VK_SUCCESS(err);
5368 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005369 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5370 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005371 VkViewport viewports[2] = {}; // don't care about data
5372 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07005373 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005374 Draw(1, 0, 0, 0);
5375
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005376 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005377
Chia-I Wuf7458c52015-10-26 21:10:41 +08005378 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5379 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5380 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5381 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005382}
5383
Mark Young7394fdd2016-03-31 14:56:43 -06005384TEST_F(VkLayerTest, PSOLineWidthInvalid) {
5385 VkResult err;
5386
5387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06005388 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06005389
5390 ASSERT_NO_FATAL_FAILURE(InitState());
5391 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5392
5393 VkDescriptorPoolSize ds_type_count = {};
5394 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5395 ds_type_count.descriptorCount = 1;
5396
5397 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5398 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5399 ds_pool_ci.maxSets = 1;
5400 ds_pool_ci.poolSizeCount = 1;
5401 ds_pool_ci.pPoolSizes = &ds_type_count;
5402
5403 VkDescriptorPool ds_pool;
5404 err =
5405 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5406 ASSERT_VK_SUCCESS(err);
5407
5408 VkDescriptorSetLayoutBinding dsl_binding = {};
5409 dsl_binding.binding = 0;
5410 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5411 dsl_binding.descriptorCount = 1;
5412 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5413
5414 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5415 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5416 ds_layout_ci.bindingCount = 1;
5417 ds_layout_ci.pBindings = &dsl_binding;
5418
5419 VkDescriptorSetLayout ds_layout;
5420 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5421 &ds_layout);
5422 ASSERT_VK_SUCCESS(err);
5423
5424 VkDescriptorSet descriptorSet;
5425 VkDescriptorSetAllocateInfo alloc_info = {};
5426 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5427 alloc_info.descriptorSetCount = 1;
5428 alloc_info.descriptorPool = ds_pool;
5429 alloc_info.pSetLayouts = &ds_layout;
5430 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5431 &descriptorSet);
5432 ASSERT_VK_SUCCESS(err);
5433
5434 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5435 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5436 pipeline_layout_ci.setLayoutCount = 1;
5437 pipeline_layout_ci.pSetLayouts = &ds_layout;
5438
5439 VkPipelineLayout pipeline_layout;
5440 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5441 &pipeline_layout);
5442 ASSERT_VK_SUCCESS(err);
5443
5444 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5445 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5446 vp_state_ci.scissorCount = 1;
5447 vp_state_ci.pScissors = NULL;
5448 vp_state_ci.viewportCount = 1;
5449 vp_state_ci.pViewports = NULL;
5450
5451 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
5452 VK_DYNAMIC_STATE_SCISSOR,
5453 VK_DYNAMIC_STATE_LINE_WIDTH};
5454 // Set scissor as dynamic to avoid that error
5455 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5456 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5457 dyn_state_ci.dynamicStateCount = 2;
5458 dyn_state_ci.pDynamicStates = dynamic_states;
5459
5460 VkPipelineShaderStageCreateInfo shaderStages[2];
5461 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5462
5463 VkShaderObj vs(m_device, bindStateVertShaderText,
5464 VK_SHADER_STAGE_VERTEX_BIT, this);
5465 VkShaderObj fs(m_device, bindStateFragShaderText,
5466 VK_SHADER_STAGE_FRAGMENT_BIT,
5467 this); // TODO - We shouldn't need a fragment shader
5468 // but add it to be able to run on more devices
5469 shaderStages[0] = vs.GetStageCreateInfo();
5470 shaderStages[1] = fs.GetStageCreateInfo();
5471
5472 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5473 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5474 vi_ci.pNext = nullptr;
5475 vi_ci.vertexBindingDescriptionCount = 0;
5476 vi_ci.pVertexBindingDescriptions = nullptr;
5477 vi_ci.vertexAttributeDescriptionCount = 0;
5478 vi_ci.pVertexAttributeDescriptions = nullptr;
5479
5480 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5481 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5482 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5483
5484 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5485 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5486 rs_ci.pNext = nullptr;
5487
Mark Young47107952016-05-02 15:59:55 -06005488 // Check too low (line width of -1.0f).
5489 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06005490
5491 VkPipelineColorBlendAttachmentState att = {};
5492 att.blendEnable = VK_FALSE;
5493 att.colorWriteMask = 0xf;
5494
5495 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5496 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5497 cb_ci.pNext = nullptr;
5498 cb_ci.attachmentCount = 1;
5499 cb_ci.pAttachments = &att;
5500
5501 VkGraphicsPipelineCreateInfo gp_ci = {};
5502 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5503 gp_ci.stageCount = 2;
5504 gp_ci.pStages = shaderStages;
5505 gp_ci.pVertexInputState = &vi_ci;
5506 gp_ci.pInputAssemblyState = &ia_ci;
5507 gp_ci.pViewportState = &vp_state_ci;
5508 gp_ci.pRasterizationState = &rs_ci;
5509 gp_ci.pColorBlendState = &cb_ci;
5510 gp_ci.pDynamicState = &dyn_state_ci;
5511 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5512 gp_ci.layout = pipeline_layout;
5513 gp_ci.renderPass = renderPass();
5514
5515 VkPipelineCacheCreateInfo pc_ci = {};
5516 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5517
5518 VkPipeline pipeline;
5519 VkPipelineCache pipelineCache;
5520
5521 err =
5522 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5523 ASSERT_VK_SUCCESS(err);
5524 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5525 &gp_ci, NULL, &pipeline);
5526
5527 m_errorMonitor->VerifyFound();
5528
5529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5530 "Attempt to set lineWidth to 65536");
5531
5532 // Check too high (line width of 65536.0f).
5533 rs_ci.lineWidth = 65536.0f;
5534
5535 err =
5536 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5537 ASSERT_VK_SUCCESS(err);
5538 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5539 &gp_ci, NULL, &pipeline);
5540
5541 m_errorMonitor->VerifyFound();
5542
5543 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06005544 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06005545
5546 dyn_state_ci.dynamicStateCount = 3;
5547
5548 rs_ci.lineWidth = 1.0f;
5549
5550 err =
5551 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5552 ASSERT_VK_SUCCESS(err);
5553 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5554 &gp_ci, NULL, &pipeline);
5555 BeginCommandBuffer();
5556 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5557 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5558
5559 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06005560 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06005561 m_errorMonitor->VerifyFound();
5562
5563 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5564 "Attempt to set lineWidth to 65536");
5565
5566 // Check too high with dynamic setting.
5567 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
5568 m_errorMonitor->VerifyFound();
5569 EndCommandBuffer();
5570
5571 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5572 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5573 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5574 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5575}
5576
Karl Schultz6addd812016-02-02 17:17:23 -07005577TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005578 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005579 m_errorMonitor->SetDesiredFailureMsg(
5580 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005581 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005582
5583 ASSERT_NO_FATAL_FAILURE(InitState());
5584 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005585
Tony Barbourfe3351b2015-07-28 10:17:20 -06005586 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005587 // Don't care about RenderPass handle b/c error should be flagged before
5588 // that
5589 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
5590 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005591
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005592 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005593}
5594
Karl Schultz6addd812016-02-02 17:17:23 -07005595TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005596 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005597 m_errorMonitor->SetDesiredFailureMsg(
5598 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005599 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005600
5601 ASSERT_NO_FATAL_FAILURE(InitState());
5602 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005603
Tony Barbourfe3351b2015-07-28 10:17:20 -06005604 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005605 // Just create a dummy Renderpass that's non-NULL so we can get to the
5606 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06005607 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005608 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
5609 rp_begin.pNext = NULL;
5610 rp_begin.renderPass = renderPass();
5611 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005612
Karl Schultz6addd812016-02-02 17:17:23 -07005613 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
5614 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005615
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005616 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005617}
5618
Cody Northrop3bb4d962016-05-09 16:15:57 -06005619TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
5620
5621 TEST_DESCRIPTION("End a command buffer with an active render pass");
5622
5623 m_errorMonitor->SetDesiredFailureMsg(
5624 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5625 "It is invalid to issue this call inside an active render pass");
5626
5627 ASSERT_NO_FATAL_FAILURE(InitState());
5628 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5629
5630 // The framework's BeginCommandBuffer calls CreateRenderPass
5631 BeginCommandBuffer();
5632
5633 // Call directly into vkEndCommandBuffer instead of the
5634 // the framework's EndCommandBuffer, which inserts a
5635 // vkEndRenderPass
5636 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
5637
5638 m_errorMonitor->VerifyFound();
5639
5640 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
5641 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
5642}
5643
Karl Schultz6addd812016-02-02 17:17:23 -07005644TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005645 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07005646 m_errorMonitor->SetDesiredFailureMsg(
5647 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005648 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005649
5650 ASSERT_NO_FATAL_FAILURE(InitState());
5651 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005652
5653 // Renderpass is started here
5654 BeginCommandBuffer();
5655
5656 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005657 vk_testing::Buffer dstBuffer;
5658 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005659
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005660 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005661
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005662 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005663}
5664
Karl Schultz6addd812016-02-02 17:17:23 -07005665TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005666 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07005667 m_errorMonitor->SetDesiredFailureMsg(
5668 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005669 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005670
5671 ASSERT_NO_FATAL_FAILURE(InitState());
5672 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005673
5674 // Renderpass is started here
5675 BeginCommandBuffer();
5676
5677 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005678 vk_testing::Buffer dstBuffer;
5679 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005680
Karl Schultz6addd812016-02-02 17:17:23 -07005681 VkDeviceSize dstOffset = 0;
5682 VkDeviceSize dataSize = 1024;
5683 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005684
Karl Schultz6addd812016-02-02 17:17:23 -07005685 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
5686 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005687
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005688 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005689}
5690
Karl Schultz6addd812016-02-02 17:17:23 -07005691TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005692 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005693 m_errorMonitor->SetDesiredFailureMsg(
5694 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005695 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005696
5697 ASSERT_NO_FATAL_FAILURE(InitState());
5698 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005699
5700 // Renderpass is started here
5701 BeginCommandBuffer();
5702
Michael Lentine0a369f62016-02-03 16:51:46 -06005703 VkClearColorValue clear_color;
5704 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07005705 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
5706 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5707 const int32_t tex_width = 32;
5708 const int32_t tex_height = 32;
5709 VkImageCreateInfo image_create_info = {};
5710 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5711 image_create_info.pNext = NULL;
5712 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5713 image_create_info.format = tex_format;
5714 image_create_info.extent.width = tex_width;
5715 image_create_info.extent.height = tex_height;
5716 image_create_info.extent.depth = 1;
5717 image_create_info.mipLevels = 1;
5718 image_create_info.arrayLayers = 1;
5719 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5720 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
5721 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005722
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005723 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005724 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5725 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005726
Karl Schultz6addd812016-02-02 17:17:23 -07005727 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5728 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005729
Karl Schultz6addd812016-02-02 17:17:23 -07005730 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5731 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005732
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005733 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005734}
5735
Karl Schultz6addd812016-02-02 17:17:23 -07005736TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005737 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005738 m_errorMonitor->SetDesiredFailureMsg(
5739 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005740 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005741
5742 ASSERT_NO_FATAL_FAILURE(InitState());
5743 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005744
5745 // Renderpass is started here
5746 BeginCommandBuffer();
5747
5748 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07005749 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005750 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
5751 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5752 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
5753 image_create_info.extent.width = 64;
5754 image_create_info.extent.height = 64;
5755 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5756 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005757
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005758 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005759 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5760 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005761
Karl Schultz6addd812016-02-02 17:17:23 -07005762 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5763 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005764
Karl Schultz6addd812016-02-02 17:17:23 -07005765 vkCmdClearDepthStencilImage(
5766 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5767 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
5768 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005769
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005770 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005771}
5772
Karl Schultz6addd812016-02-02 17:17:23 -07005773TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005774 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005775 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005776
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005778 "vkCmdClearAttachments: This call "
5779 "must be issued inside an active "
5780 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005781
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005782 ASSERT_NO_FATAL_FAILURE(InitState());
5783 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005784
5785 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005786 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005787 ASSERT_VK_SUCCESS(err);
5788
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005789 VkClearAttachment color_attachment;
5790 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5791 color_attachment.clearValue.color.float32[0] = 0;
5792 color_attachment.clearValue.color.float32[1] = 0;
5793 color_attachment.clearValue.color.float32[2] = 0;
5794 color_attachment.clearValue.color.float32[3] = 0;
5795 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005796 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
5797 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5798 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005799
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005800 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005801}
5802
Karl Schultz9e66a292016-04-21 15:57:51 -06005803TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
5804 // Try to add a buffer memory barrier with no buffer.
5805 m_errorMonitor->SetDesiredFailureMsg(
5806 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5807 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
5808
5809 ASSERT_NO_FATAL_FAILURE(InitState());
5810 BeginCommandBuffer();
5811
5812 VkBufferMemoryBarrier buf_barrier = {};
5813 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5814 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5815 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5816 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5817 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5818 buf_barrier.buffer = VK_NULL_HANDLE;
5819 buf_barrier.offset = 0;
5820 buf_barrier.size = VK_WHOLE_SIZE;
5821 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5822 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
5823 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
5824
5825 m_errorMonitor->VerifyFound();
5826}
5827
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06005828TEST_F(VkLayerTest, InvalidBarriers) {
5829 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
5830
5831 m_errorMonitor->SetDesiredFailureMsg(
5832 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
5833
5834 ASSERT_NO_FATAL_FAILURE(InitState());
5835 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5836
5837 VkMemoryBarrier mem_barrier = {};
5838 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
5839 mem_barrier.pNext = NULL;
5840 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5841 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5842 BeginCommandBuffer();
5843 // BeginCommandBuffer() starts a render pass
5844 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5845 VK_PIPELINE_STAGE_HOST_BIT,
5846 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
5847 &mem_barrier, 0, nullptr, 0, nullptr);
5848 m_errorMonitor->VerifyFound();
5849
5850 m_errorMonitor->SetDesiredFailureMsg(
5851 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5852 "Image Layout cannot be transitioned to UNDEFINED");
5853 VkImageObj image(m_device);
5854 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
5855 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5856 ASSERT_TRUE(image.initialized());
5857 VkImageMemoryBarrier img_barrier = {};
5858 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
5859 img_barrier.pNext = NULL;
5860 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5861 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5862 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5863 // New layout can't be UNDEFINED
5864 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5865 img_barrier.image = image.handle();
5866 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5867 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5868 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5869 img_barrier.subresourceRange.baseArrayLayer = 0;
5870 img_barrier.subresourceRange.baseMipLevel = 0;
5871 img_barrier.subresourceRange.layerCount = 1;
5872 img_barrier.subresourceRange.levelCount = 1;
5873 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5874 VK_PIPELINE_STAGE_HOST_BIT,
5875 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5876 nullptr, 1, &img_barrier);
5877 m_errorMonitor->VerifyFound();
5878 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5879
5880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5881 "Subresource must have the sum of the "
5882 "baseArrayLayer");
5883 // baseArrayLayer + layerCount must be <= image's arrayLayers
5884 img_barrier.subresourceRange.baseArrayLayer = 1;
5885 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5886 VK_PIPELINE_STAGE_HOST_BIT,
5887 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5888 nullptr, 1, &img_barrier);
5889 m_errorMonitor->VerifyFound();
5890 img_barrier.subresourceRange.baseArrayLayer = 0;
5891
5892 m_errorMonitor->SetDesiredFailureMsg(
5893 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5894 "Subresource must have the sum of the baseMipLevel");
5895 // baseMipLevel + levelCount must be <= image's mipLevels
5896 img_barrier.subresourceRange.baseMipLevel = 1;
5897 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5898 VK_PIPELINE_STAGE_HOST_BIT,
5899 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5900 nullptr, 1, &img_barrier);
5901 m_errorMonitor->VerifyFound();
5902 img_barrier.subresourceRange.baseMipLevel = 0;
5903
5904 m_errorMonitor->SetDesiredFailureMsg(
5905 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5906 "Buffer Barriers cannot be used during a render pass");
5907 vk_testing::Buffer buffer;
5908 buffer.init(*m_device, 256);
5909 VkBufferMemoryBarrier buf_barrier = {};
5910 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5911 buf_barrier.pNext = NULL;
5912 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5913 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5914 buf_barrier.buffer = buffer.handle();
5915 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5916 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5917 buf_barrier.offset = 0;
5918 buf_barrier.size = VK_WHOLE_SIZE;
5919 // Can't send buffer barrier during a render pass
5920 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5921 VK_PIPELINE_STAGE_HOST_BIT,
5922 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5923 &buf_barrier, 0, nullptr);
5924 m_errorMonitor->VerifyFound();
5925 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
5926
5927 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5928 "which is not less than total size");
5929 buf_barrier.offset = 257;
5930 // Offset greater than total size
5931 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5932 VK_PIPELINE_STAGE_HOST_BIT,
5933 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5934 &buf_barrier, 0, nullptr);
5935 m_errorMonitor->VerifyFound();
5936 buf_barrier.offset = 0;
5937
5938 m_errorMonitor->SetDesiredFailureMsg(
5939 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
5940 buf_barrier.size = 257;
5941 // Size greater than total size
5942 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5943 VK_PIPELINE_STAGE_HOST_BIT,
5944 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5945 &buf_barrier, 0, nullptr);
5946 m_errorMonitor->VerifyFound();
5947 buf_barrier.size = VK_WHOLE_SIZE;
5948
5949 m_errorMonitor->SetDesiredFailureMsg(
5950 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5951 "Image is a depth and stencil format and thus must "
5952 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
5953 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
5954 VkDepthStencilObj ds_image(m_device);
5955 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
5956 ASSERT_TRUE(ds_image.initialized());
5957 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5958 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
5959 img_barrier.image = ds_image.handle();
5960 // Leave aspectMask at COLOR on purpose
5961 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5962 VK_PIPELINE_STAGE_HOST_BIT,
5963 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5964 nullptr, 1, &img_barrier);
5965 m_errorMonitor->VerifyFound();
5966}
5967
Karl Schultz6addd812016-02-02 17:17:23 -07005968TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005969 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005970 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005971
Karl Schultz6addd812016-02-02 17:17:23 -07005972 m_errorMonitor->SetDesiredFailureMsg(
5973 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005974 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
5975
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005976 ASSERT_NO_FATAL_FAILURE(InitState());
5977 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005978 uint32_t qfi = 0;
5979 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005980 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5981 buffCI.size = 1024;
5982 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5983 buffCI.queueFamilyIndexCount = 1;
5984 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005985
5986 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005987 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005988 ASSERT_VK_SUCCESS(err);
5989
5990 BeginCommandBuffer();
5991 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005992 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5993 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005994 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07005995 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
5996 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005997
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005998 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005999
Chia-I Wuf7458c52015-10-26 21:10:41 +08006000 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006001}
6002
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07006003TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
6004 // Create an out-of-range queueFamilyIndex
6005 m_errorMonitor->SetDesiredFailureMsg(
6006 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -06006007 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
6008 "of the indices specified when the device was created, via the "
6009 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07006010
6011 ASSERT_NO_FATAL_FAILURE(InitState());
6012 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6013 VkBufferCreateInfo buffCI = {};
6014 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6015 buffCI.size = 1024;
6016 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
6017 buffCI.queueFamilyIndexCount = 1;
6018 // Introduce failure by specifying invalid queue_family_index
6019 uint32_t qfi = 777;
6020 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06006021 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07006022
6023 VkBuffer ib;
6024 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
6025
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006026 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07006027}
6028
Karl Schultz6addd812016-02-02 17:17:23 -07006029TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
6030 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
6031 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006032
Karl Schultz6addd812016-02-02 17:17:23 -07006033 m_errorMonitor->SetDesiredFailureMsg(
6034 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006035 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06006036
6037 ASSERT_NO_FATAL_FAILURE(InitState());
6038 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06006039
6040 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006041 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006042 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
6043 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06006044
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006045 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06006046}
6047
Karl Schultz6addd812016-02-02 17:17:23 -07006048TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006049 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07006050 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006051
Karl Schultz6addd812016-02-02 17:17:23 -07006052 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006053 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6054 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
6055 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006056
Tobin Ehlis3b780662015-05-28 12:11:26 -06006057 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006058 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006059 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006060 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6061 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006062
6063 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006064 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6065 ds_pool_ci.pNext = NULL;
6066 ds_pool_ci.maxSets = 1;
6067 ds_pool_ci.poolSizeCount = 1;
6068 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006069
Tobin Ehlis3b780662015-05-28 12:11:26 -06006070 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006071 err =
6072 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006073 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06006074 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006075 dsl_binding.binding = 0;
6076 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6077 dsl_binding.descriptorCount = 1;
6078 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6079 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006080
Tony Barboureb254902015-07-15 12:50:33 -06006081 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006082 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6083 ds_layout_ci.pNext = NULL;
6084 ds_layout_ci.bindingCount = 1;
6085 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006086
Tobin Ehlis3b780662015-05-28 12:11:26 -06006087 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006088 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6089 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006090 ASSERT_VK_SUCCESS(err);
6091
6092 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006093 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006094 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006095 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006096 alloc_info.descriptorPool = ds_pool;
6097 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006098 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6099 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006100 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006101
Tobin Ehlis30db8f82016-05-05 08:19:48 -06006102 VkSamplerCreateInfo sampler_ci = {};
6103 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6104 sampler_ci.pNext = NULL;
6105 sampler_ci.magFilter = VK_FILTER_NEAREST;
6106 sampler_ci.minFilter = VK_FILTER_NEAREST;
6107 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6108 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6109 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6110 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6111 sampler_ci.mipLodBias = 1.0;
6112 sampler_ci.anisotropyEnable = VK_FALSE;
6113 sampler_ci.maxAnisotropy = 1;
6114 sampler_ci.compareEnable = VK_FALSE;
6115 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6116 sampler_ci.minLod = 1.0;
6117 sampler_ci.maxLod = 1.0;
6118 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6119 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6120 VkSampler sampler;
6121 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6122 ASSERT_VK_SUCCESS(err);
6123
6124 VkDescriptorImageInfo info = {};
6125 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006126
6127 VkWriteDescriptorSet descriptor_write;
6128 memset(&descriptor_write, 0, sizeof(descriptor_write));
6129 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006130 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006131 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006132 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006133 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006134 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006135
6136 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6137
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006138 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006139
Chia-I Wuf7458c52015-10-26 21:10:41 +08006140 vkDestroySampler(m_device->device(), sampler, NULL);
6141 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6142 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006143}
6144
Karl Schultz6addd812016-02-02 17:17:23 -07006145TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006146 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07006147 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006148
Karl Schultz6addd812016-02-02 17:17:23 -07006149 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006150 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6151 " binding #0 with 1 total descriptors but update of 1 descriptors "
6152 "starting at binding offset of 0 combined with update array element "
6153 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006154
Tobin Ehlis3b780662015-05-28 12:11:26 -06006155 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006156 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006157 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006158 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6159 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006160
6161 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006162 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6163 ds_pool_ci.pNext = NULL;
6164 ds_pool_ci.maxSets = 1;
6165 ds_pool_ci.poolSizeCount = 1;
6166 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006167
Tobin Ehlis3b780662015-05-28 12:11:26 -06006168 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006169 err =
6170 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006171 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006172
Tony Barboureb254902015-07-15 12:50:33 -06006173 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006174 dsl_binding.binding = 0;
6175 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6176 dsl_binding.descriptorCount = 1;
6177 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6178 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06006179
6180 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006181 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6182 ds_layout_ci.pNext = NULL;
6183 ds_layout_ci.bindingCount = 1;
6184 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006185
Tobin Ehlis3b780662015-05-28 12:11:26 -06006186 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006187 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6188 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006189 ASSERT_VK_SUCCESS(err);
6190
6191 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006192 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006193 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006194 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006195 alloc_info.descriptorPool = ds_pool;
6196 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006197 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6198 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006199 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006200
Tobin Ehlis30db8f82016-05-05 08:19:48 -06006201 // Correctly update descriptor to avoid "NOT_UPDATED" error
6202 VkDescriptorBufferInfo buff_info = {};
6203 buff_info.buffer =
6204 VkBuffer(0); // Don't care about buffer handle for this test
6205 buff_info.offset = 0;
6206 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006207
6208 VkWriteDescriptorSet descriptor_write;
6209 memset(&descriptor_write, 0, sizeof(descriptor_write));
6210 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006211 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006212 descriptor_write.dstArrayElement =
6213 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08006214 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006215 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6216 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006217
6218 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6219
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006220 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006221
Chia-I Wuf7458c52015-10-26 21:10:41 +08006222 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6223 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006224}
6225
Karl Schultz6addd812016-02-02 17:17:23 -07006226TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
6227 // Create layout w/ count of 1 and attempt update to that layout w/ binding
6228 // index 2
6229 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006230
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6232 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006233
Tobin Ehlis3b780662015-05-28 12:11:26 -06006234 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006235 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006236 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006237 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6238 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006239
6240 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006241 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6242 ds_pool_ci.pNext = NULL;
6243 ds_pool_ci.maxSets = 1;
6244 ds_pool_ci.poolSizeCount = 1;
6245 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006246
Tobin Ehlis3b780662015-05-28 12:11:26 -06006247 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006248 err =
6249 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006250 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006251
Tony Barboureb254902015-07-15 12:50:33 -06006252 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006253 dsl_binding.binding = 0;
6254 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6255 dsl_binding.descriptorCount = 1;
6256 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6257 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06006258
6259 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006260 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6261 ds_layout_ci.pNext = NULL;
6262 ds_layout_ci.bindingCount = 1;
6263 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006264 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006265 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6266 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006267 ASSERT_VK_SUCCESS(err);
6268
6269 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006270 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006271 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006272 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006273 alloc_info.descriptorPool = ds_pool;
6274 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006275 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6276 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006277 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006278
Tony Barboureb254902015-07-15 12:50:33 -06006279 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006280 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6281 sampler_ci.pNext = NULL;
6282 sampler_ci.magFilter = VK_FILTER_NEAREST;
6283 sampler_ci.minFilter = VK_FILTER_NEAREST;
6284 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6285 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6286 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6287 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6288 sampler_ci.mipLodBias = 1.0;
6289 sampler_ci.anisotropyEnable = VK_FALSE;
6290 sampler_ci.maxAnisotropy = 1;
6291 sampler_ci.compareEnable = VK_FALSE;
6292 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6293 sampler_ci.minLod = 1.0;
6294 sampler_ci.maxLod = 1.0;
6295 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6296 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06006297
Tobin Ehlis3b780662015-05-28 12:11:26 -06006298 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006299 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006300 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006301
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006302 VkDescriptorImageInfo info = {};
6303 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006304
6305 VkWriteDescriptorSet descriptor_write;
6306 memset(&descriptor_write, 0, sizeof(descriptor_write));
6307 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006308 descriptor_write.dstSet = descriptorSet;
6309 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006310 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006311 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006312 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006313 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006314
6315 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6316
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006317 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -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 Ehlis49eb23d2015-05-22 12:38:55 -06006322}
6323
Karl Schultz6addd812016-02-02 17:17:23 -07006324TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
6325 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
6326 // types
6327 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006328
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006330 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006331
Tobin Ehlis3b780662015-05-28 12:11:26 -06006332 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006333
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006334 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006335 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6336 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006337
6338 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006339 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6340 ds_pool_ci.pNext = NULL;
6341 ds_pool_ci.maxSets = 1;
6342 ds_pool_ci.poolSizeCount = 1;
6343 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006344
Tobin Ehlis3b780662015-05-28 12:11:26 -06006345 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006346 err =
6347 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006348 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06006349 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006350 dsl_binding.binding = 0;
6351 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6352 dsl_binding.descriptorCount = 1;
6353 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6354 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006355
Tony Barboureb254902015-07-15 12:50:33 -06006356 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006357 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6358 ds_layout_ci.pNext = NULL;
6359 ds_layout_ci.bindingCount = 1;
6360 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006361
Tobin Ehlis3b780662015-05-28 12:11:26 -06006362 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006363 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6364 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006365 ASSERT_VK_SUCCESS(err);
6366
6367 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006368 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006369 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006370 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006371 alloc_info.descriptorPool = ds_pool;
6372 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006373 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6374 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006375 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006376
Tony Barboureb254902015-07-15 12:50:33 -06006377 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006378 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6379 sampler_ci.pNext = NULL;
6380 sampler_ci.magFilter = VK_FILTER_NEAREST;
6381 sampler_ci.minFilter = VK_FILTER_NEAREST;
6382 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6383 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6384 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6385 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6386 sampler_ci.mipLodBias = 1.0;
6387 sampler_ci.anisotropyEnable = VK_FALSE;
6388 sampler_ci.maxAnisotropy = 1;
6389 sampler_ci.compareEnable = VK_FALSE;
6390 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6391 sampler_ci.minLod = 1.0;
6392 sampler_ci.maxLod = 1.0;
6393 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6394 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006395 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006396 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006397 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006398
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006399 VkDescriptorImageInfo info = {};
6400 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006401
6402 VkWriteDescriptorSet descriptor_write;
6403 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07006404 descriptor_write.sType =
6405 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006406 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006407 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006408 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006409 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006410 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006411
6412 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6413
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006414 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006415
Chia-I Wuf7458c52015-10-26 21:10:41 +08006416 vkDestroySampler(m_device->device(), sampler, NULL);
6417 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6418 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006419}
6420
Karl Schultz6addd812016-02-02 17:17:23 -07006421TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006422 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07006423 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006424
Karl Schultz6addd812016-02-02 17:17:23 -07006425 m_errorMonitor->SetDesiredFailureMsg(
6426 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006427 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006428
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006429 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006430 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
6431 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006432 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006433 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6434 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006435
6436 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006437 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6438 ds_pool_ci.pNext = NULL;
6439 ds_pool_ci.maxSets = 1;
6440 ds_pool_ci.poolSizeCount = 1;
6441 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006442
6443 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006444 err =
6445 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006446 ASSERT_VK_SUCCESS(err);
6447
6448 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006449 dsl_binding.binding = 0;
6450 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6451 dsl_binding.descriptorCount = 1;
6452 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6453 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006454
6455 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006456 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6457 ds_layout_ci.pNext = NULL;
6458 ds_layout_ci.bindingCount = 1;
6459 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006460 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006461 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6462 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006463 ASSERT_VK_SUCCESS(err);
6464
6465 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006466 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006467 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006468 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006469 alloc_info.descriptorPool = ds_pool;
6470 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006471 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6472 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006473 ASSERT_VK_SUCCESS(err);
6474
Karl Schultz6addd812016-02-02 17:17:23 -07006475 VkSampler sampler =
6476 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006477
6478 VkDescriptorImageInfo descriptor_info;
6479 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
6480 descriptor_info.sampler = sampler;
6481
6482 VkWriteDescriptorSet descriptor_write;
6483 memset(&descriptor_write, 0, sizeof(descriptor_write));
6484 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006485 descriptor_write.dstSet = descriptorSet;
6486 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006487 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006488 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6489 descriptor_write.pImageInfo = &descriptor_info;
6490
6491 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6492
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006493 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006494
Chia-I Wuf7458c52015-10-26 21:10:41 +08006495 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6496 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006497}
6498
Karl Schultz6addd812016-02-02 17:17:23 -07006499TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
6500 // Create a single combined Image/Sampler descriptor and send it an invalid
6501 // imageView
6502 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006503
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006504 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6505 "Attempted write update to combined "
6506 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -06006507 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006508
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006509 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006510 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006511 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6512 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006513
6514 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006515 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6516 ds_pool_ci.pNext = NULL;
6517 ds_pool_ci.maxSets = 1;
6518 ds_pool_ci.poolSizeCount = 1;
6519 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006520
6521 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006522 err =
6523 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006524 ASSERT_VK_SUCCESS(err);
6525
6526 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006527 dsl_binding.binding = 0;
6528 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6529 dsl_binding.descriptorCount = 1;
6530 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6531 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006532
6533 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006534 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6535 ds_layout_ci.pNext = NULL;
6536 ds_layout_ci.bindingCount = 1;
6537 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006538 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006539 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6540 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006541 ASSERT_VK_SUCCESS(err);
6542
6543 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006544 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006545 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006546 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006547 alloc_info.descriptorPool = ds_pool;
6548 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006549 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6550 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006551 ASSERT_VK_SUCCESS(err);
6552
6553 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006554 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6555 sampler_ci.pNext = NULL;
6556 sampler_ci.magFilter = VK_FILTER_NEAREST;
6557 sampler_ci.minFilter = VK_FILTER_NEAREST;
6558 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6559 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6560 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6561 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6562 sampler_ci.mipLodBias = 1.0;
6563 sampler_ci.anisotropyEnable = VK_FALSE;
6564 sampler_ci.maxAnisotropy = 1;
6565 sampler_ci.compareEnable = VK_FALSE;
6566 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6567 sampler_ci.minLod = 1.0;
6568 sampler_ci.maxLod = 1.0;
6569 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6570 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006571
6572 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006573 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006574 ASSERT_VK_SUCCESS(err);
6575
Karl Schultz6addd812016-02-02 17:17:23 -07006576 VkImageView view =
6577 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006578
6579 VkDescriptorImageInfo descriptor_info;
6580 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
6581 descriptor_info.sampler = sampler;
6582 descriptor_info.imageView = view;
6583
6584 VkWriteDescriptorSet descriptor_write;
6585 memset(&descriptor_write, 0, sizeof(descriptor_write));
6586 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006587 descriptor_write.dstSet = descriptorSet;
6588 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006589 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006590 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6591 descriptor_write.pImageInfo = &descriptor_info;
6592
6593 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6594
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006595 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006596
Chia-I Wuf7458c52015-10-26 21:10:41 +08006597 vkDestroySampler(m_device->device(), sampler, NULL);
6598 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6599 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006600}
6601
Karl Schultz6addd812016-02-02 17:17:23 -07006602TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
6603 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
6604 // into the other
6605 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006606
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6608 " binding #1 with type "
6609 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
6610 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006611
Tobin Ehlis04356f92015-10-27 16:35:27 -06006612 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006613 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006614 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006615 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6616 ds_type_count[0].descriptorCount = 1;
6617 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
6618 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006619
6620 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006621 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6622 ds_pool_ci.pNext = NULL;
6623 ds_pool_ci.maxSets = 1;
6624 ds_pool_ci.poolSizeCount = 2;
6625 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006626
6627 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006628 err =
6629 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006630 ASSERT_VK_SUCCESS(err);
6631 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006632 dsl_binding[0].binding = 0;
6633 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6634 dsl_binding[0].descriptorCount = 1;
6635 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6636 dsl_binding[0].pImmutableSamplers = NULL;
6637 dsl_binding[1].binding = 1;
6638 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6639 dsl_binding[1].descriptorCount = 1;
6640 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
6641 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006642
6643 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006644 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6645 ds_layout_ci.pNext = NULL;
6646 ds_layout_ci.bindingCount = 2;
6647 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006648
6649 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006650 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6651 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006652 ASSERT_VK_SUCCESS(err);
6653
6654 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006655 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006656 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006657 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006658 alloc_info.descriptorPool = ds_pool;
6659 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006660 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6661 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006662 ASSERT_VK_SUCCESS(err);
6663
6664 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006665 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6666 sampler_ci.pNext = NULL;
6667 sampler_ci.magFilter = VK_FILTER_NEAREST;
6668 sampler_ci.minFilter = VK_FILTER_NEAREST;
6669 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6670 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6671 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6672 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6673 sampler_ci.mipLodBias = 1.0;
6674 sampler_ci.anisotropyEnable = VK_FALSE;
6675 sampler_ci.maxAnisotropy = 1;
6676 sampler_ci.compareEnable = VK_FALSE;
6677 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6678 sampler_ci.minLod = 1.0;
6679 sampler_ci.maxLod = 1.0;
6680 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6681 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006682
6683 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006684 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006685 ASSERT_VK_SUCCESS(err);
6686
6687 VkDescriptorImageInfo info = {};
6688 info.sampler = sampler;
6689
6690 VkWriteDescriptorSet descriptor_write;
6691 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
6692 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006693 descriptor_write.dstSet = descriptorSet;
6694 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08006695 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006696 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6697 descriptor_write.pImageInfo = &info;
6698 // This write update should succeed
6699 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6700 // Now perform a copy update that fails due to type mismatch
6701 VkCopyDescriptorSet copy_ds_update;
6702 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6703 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6704 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06006705 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006706 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006707 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08006708 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006709 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6710
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006711 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006712 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006713 m_errorMonitor->SetDesiredFailureMsg(
6714 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006715 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -06006716 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6717 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6718 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006719 copy_ds_update.srcBinding =
6720 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006721 copy_ds_update.dstSet = descriptorSet;
6722 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06006723 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006724 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6725
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006726 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006727
Tobin Ehlis04356f92015-10-27 16:35:27 -06006728 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006729 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006730 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
6731 "update array offset of 0 and update of "
6732 "5 descriptors oversteps total number "
6733 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006734
Tobin Ehlis04356f92015-10-27 16:35:27 -06006735 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6736 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6737 copy_ds_update.srcSet = descriptorSet;
6738 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006739 copy_ds_update.dstSet = descriptorSet;
6740 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006741 copy_ds_update.descriptorCount =
6742 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06006743 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6744
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006745 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006746
Chia-I Wuf7458c52015-10-26 21:10:41 +08006747 vkDestroySampler(m_device->device(), sampler, NULL);
6748 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6749 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006750}
6751
Karl Schultz6addd812016-02-02 17:17:23 -07006752TEST_F(VkLayerTest, NumSamplesMismatch) {
6753 // Create CommandBuffer where MSAA samples doesn't match RenderPass
6754 // sampleCount
6755 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006756
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006757 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006758 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006759
Tobin Ehlis3b780662015-05-28 12:11:26 -06006760 ASSERT_NO_FATAL_FAILURE(InitState());
6761 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006762 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06006763 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006764 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006765
6766 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006767 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6768 ds_pool_ci.pNext = NULL;
6769 ds_pool_ci.maxSets = 1;
6770 ds_pool_ci.poolSizeCount = 1;
6771 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006772
Tobin Ehlis3b780662015-05-28 12:11:26 -06006773 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006774 err =
6775 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006776 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006777
Tony Barboureb254902015-07-15 12:50:33 -06006778 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08006779 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06006780 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08006781 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006782 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6783 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006784
Tony Barboureb254902015-07-15 12:50:33 -06006785 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6786 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6787 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006788 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006789 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006790
Tobin Ehlis3b780662015-05-28 12:11:26 -06006791 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006792 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6793 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006794 ASSERT_VK_SUCCESS(err);
6795
6796 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006797 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006798 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006799 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006800 alloc_info.descriptorPool = ds_pool;
6801 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006802 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6803 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006804 ASSERT_VK_SUCCESS(err);
6805
Tony Barboureb254902015-07-15 12:50:33 -06006806 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006807 pipe_ms_state_ci.sType =
6808 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6809 pipe_ms_state_ci.pNext = NULL;
6810 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6811 pipe_ms_state_ci.sampleShadingEnable = 0;
6812 pipe_ms_state_ci.minSampleShading = 1.0;
6813 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006814
Tony Barboureb254902015-07-15 12:50:33 -06006815 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006816 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6817 pipeline_layout_ci.pNext = NULL;
6818 pipeline_layout_ci.setLayoutCount = 1;
6819 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006820
6821 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006822 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6823 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006824 ASSERT_VK_SUCCESS(err);
6825
Karl Schultz6addd812016-02-02 17:17:23 -07006826 VkShaderObj vs(m_device, bindStateVertShaderText,
6827 VK_SHADER_STAGE_VERTEX_BIT, this);
6828 VkShaderObj fs(m_device, bindStateFragShaderText,
6829 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006830 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006831 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006832 VkPipelineObj pipe(m_device);
6833 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006834 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006835 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006836 pipe.SetMSAA(&pipe_ms_state_ci);
6837 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006838
Tony Barbourfe3351b2015-07-28 10:17:20 -06006839 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006840 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6841 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006842
Mark Young29927482016-05-04 14:38:51 -06006843 // Render triangle (the error should trigger on the attempt to draw).
6844 Draw(3, 1, 0, 0);
6845
6846 // Finalize recording of the command buffer
6847 EndCommandBuffer();
6848
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006849 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006850
Chia-I Wuf7458c52015-10-26 21:10:41 +08006851 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6852 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6853 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006854}
Mark Young29927482016-05-04 14:38:51 -06006855
Mark Youngc89c6312016-03-31 16:03:20 -06006856TEST_F(VkLayerTest, NumBlendAttachMismatch) {
6857 // Create Pipeline where the number of blend attachments doesn't match the
6858 // number of color attachments. In this case, we don't add any color
6859 // blend attachments even though we have a color attachment.
6860 VkResult err;
6861
6862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -06006863 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -06006864
6865 ASSERT_NO_FATAL_FAILURE(InitState());
6866 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6867 VkDescriptorPoolSize ds_type_count = {};
6868 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6869 ds_type_count.descriptorCount = 1;
6870
6871 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6872 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6873 ds_pool_ci.pNext = NULL;
6874 ds_pool_ci.maxSets = 1;
6875 ds_pool_ci.poolSizeCount = 1;
6876 ds_pool_ci.pPoolSizes = &ds_type_count;
6877
6878 VkDescriptorPool ds_pool;
6879 err =
6880 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6881 ASSERT_VK_SUCCESS(err);
6882
6883 VkDescriptorSetLayoutBinding dsl_binding = {};
6884 dsl_binding.binding = 0;
6885 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6886 dsl_binding.descriptorCount = 1;
6887 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6888 dsl_binding.pImmutableSamplers = NULL;
6889
6890 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6891 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6892 ds_layout_ci.pNext = NULL;
6893 ds_layout_ci.bindingCount = 1;
6894 ds_layout_ci.pBindings = &dsl_binding;
6895
6896 VkDescriptorSetLayout ds_layout;
6897 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6898 &ds_layout);
6899 ASSERT_VK_SUCCESS(err);
6900
6901 VkDescriptorSet descriptorSet;
6902 VkDescriptorSetAllocateInfo alloc_info = {};
6903 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6904 alloc_info.descriptorSetCount = 1;
6905 alloc_info.descriptorPool = ds_pool;
6906 alloc_info.pSetLayouts = &ds_layout;
6907 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6908 &descriptorSet);
6909 ASSERT_VK_SUCCESS(err);
6910
6911 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
6912 pipe_ms_state_ci.sType =
6913 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6914 pipe_ms_state_ci.pNext = NULL;
6915 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6916 pipe_ms_state_ci.sampleShadingEnable = 0;
6917 pipe_ms_state_ci.minSampleShading = 1.0;
6918 pipe_ms_state_ci.pSampleMask = NULL;
6919
6920 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6921 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6922 pipeline_layout_ci.pNext = NULL;
6923 pipeline_layout_ci.setLayoutCount = 1;
6924 pipeline_layout_ci.pSetLayouts = &ds_layout;
6925
6926 VkPipelineLayout pipeline_layout;
6927 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6928 &pipeline_layout);
6929 ASSERT_VK_SUCCESS(err);
6930
6931 VkShaderObj vs(m_device, bindStateVertShaderText,
6932 VK_SHADER_STAGE_VERTEX_BIT, this);
6933 VkShaderObj fs(m_device, bindStateFragShaderText,
6934 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006935 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06006936 // but add it to be able to run on more devices
6937 VkPipelineObj pipe(m_device);
6938 pipe.AddShader(&vs);
6939 pipe.AddShader(&fs);
6940 pipe.SetMSAA(&pipe_ms_state_ci);
6941 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6942
6943 BeginCommandBuffer();
6944 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6945 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6946
Mark Young29927482016-05-04 14:38:51 -06006947 // Render triangle (the error should trigger on the attempt to draw).
6948 Draw(3, 1, 0, 0);
6949
6950 // Finalize recording of the command buffer
6951 EndCommandBuffer();
6952
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006953 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06006954
6955 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6956 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6957 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6958}
Mark Young29927482016-05-04 14:38:51 -06006959
Karl Schultz6addd812016-02-02 17:17:23 -07006960TEST_F(VkLayerTest, ClearCmdNoDraw) {
6961 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
6962 // to issuing a Draw
6963 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006964
Karl Schultz6addd812016-02-02 17:17:23 -07006965 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07006966 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006967 "vkCmdClearAttachments() issued on CB object ");
6968
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006969 ASSERT_NO_FATAL_FAILURE(InitState());
6970 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006971
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006972 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006973 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6974 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006975
6976 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006977 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6978 ds_pool_ci.pNext = NULL;
6979 ds_pool_ci.maxSets = 1;
6980 ds_pool_ci.poolSizeCount = 1;
6981 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006982
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006983 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006984 err =
6985 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006986 ASSERT_VK_SUCCESS(err);
6987
Tony Barboureb254902015-07-15 12:50:33 -06006988 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006989 dsl_binding.binding = 0;
6990 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6991 dsl_binding.descriptorCount = 1;
6992 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6993 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006994
Tony Barboureb254902015-07-15 12:50:33 -06006995 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006996 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6997 ds_layout_ci.pNext = NULL;
6998 ds_layout_ci.bindingCount = 1;
6999 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007000
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007001 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007002 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7003 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007004 ASSERT_VK_SUCCESS(err);
7005
7006 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007007 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007008 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007009 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007010 alloc_info.descriptorPool = ds_pool;
7011 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007012 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7013 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007014 ASSERT_VK_SUCCESS(err);
7015
Tony Barboureb254902015-07-15 12:50:33 -06007016 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007017 pipe_ms_state_ci.sType =
7018 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7019 pipe_ms_state_ci.pNext = NULL;
7020 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7021 pipe_ms_state_ci.sampleShadingEnable = 0;
7022 pipe_ms_state_ci.minSampleShading = 1.0;
7023 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007024
Tony Barboureb254902015-07-15 12:50:33 -06007025 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007026 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7027 pipeline_layout_ci.pNext = NULL;
7028 pipeline_layout_ci.setLayoutCount = 1;
7029 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007030
7031 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007032 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7033 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007034 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007035
Karl Schultz6addd812016-02-02 17:17:23 -07007036 VkShaderObj vs(m_device, bindStateVertShaderText,
7037 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06007038 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07007039 // on more devices
7040 VkShaderObj fs(m_device, bindStateFragShaderText,
7041 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007042
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007043 VkPipelineObj pipe(m_device);
7044 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007045 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007046 pipe.SetMSAA(&pipe_ms_state_ci);
7047 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007048
7049 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007050
Karl Schultz6addd812016-02-02 17:17:23 -07007051 // Main thing we care about for this test is that the VkImage obj we're
7052 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007053 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06007054 VkClearAttachment color_attachment;
7055 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7056 color_attachment.clearValue.color.float32[0] = 1.0;
7057 color_attachment.clearValue.color.float32[1] = 1.0;
7058 color_attachment.clearValue.color.float32[2] = 1.0;
7059 color_attachment.clearValue.color.float32[3] = 1.0;
7060 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07007061 VkClearRect clear_rect = {
7062 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007063
Karl Schultz6addd812016-02-02 17:17:23 -07007064 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
7065 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007066
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007067 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007068
Chia-I Wuf7458c52015-10-26 21:10:41 +08007069 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7070 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7071 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007072}
7073
Karl Schultz6addd812016-02-02 17:17:23 -07007074TEST_F(VkLayerTest, VtxBufferBadIndex) {
7075 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007076
Karl Schultz6addd812016-02-02 17:17:23 -07007077 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007078 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07007079 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007080
Tobin Ehlis502480b2015-06-24 15:53:07 -06007081 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06007082 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06007083 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06007084
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007085 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007086 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7087 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007088
7089 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007090 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7091 ds_pool_ci.pNext = NULL;
7092 ds_pool_ci.maxSets = 1;
7093 ds_pool_ci.poolSizeCount = 1;
7094 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06007095
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06007096 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007097 err =
7098 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007099 ASSERT_VK_SUCCESS(err);
7100
Tony Barboureb254902015-07-15 12:50:33 -06007101 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007102 dsl_binding.binding = 0;
7103 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7104 dsl_binding.descriptorCount = 1;
7105 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7106 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007107
Tony Barboureb254902015-07-15 12:50:33 -06007108 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007109 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7110 ds_layout_ci.pNext = NULL;
7111 ds_layout_ci.bindingCount = 1;
7112 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007113
Tobin Ehlis502480b2015-06-24 15:53:07 -06007114 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007115 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7116 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007117 ASSERT_VK_SUCCESS(err);
7118
7119 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007120 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007121 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007122 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007123 alloc_info.descriptorPool = ds_pool;
7124 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007125 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7126 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007127 ASSERT_VK_SUCCESS(err);
7128
Tony Barboureb254902015-07-15 12:50:33 -06007129 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007130 pipe_ms_state_ci.sType =
7131 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7132 pipe_ms_state_ci.pNext = NULL;
7133 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7134 pipe_ms_state_ci.sampleShadingEnable = 0;
7135 pipe_ms_state_ci.minSampleShading = 1.0;
7136 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007137
Tony Barboureb254902015-07-15 12:50:33 -06007138 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007139 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7140 pipeline_layout_ci.pNext = NULL;
7141 pipeline_layout_ci.setLayoutCount = 1;
7142 pipeline_layout_ci.pSetLayouts = &ds_layout;
7143 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007144
Karl Schultz6addd812016-02-02 17:17:23 -07007145 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7146 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007147 ASSERT_VK_SUCCESS(err);
7148
Karl Schultz6addd812016-02-02 17:17:23 -07007149 VkShaderObj vs(m_device, bindStateVertShaderText,
7150 VK_SHADER_STAGE_VERTEX_BIT, this);
7151 VkShaderObj fs(m_device, bindStateFragShaderText,
7152 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06007153 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07007154 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007155 VkPipelineObj pipe(m_device);
7156 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007157 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06007158 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007159 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007160 pipe.SetViewport(m_viewports);
7161 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007162 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007163
7164 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007165 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7166 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06007167 // Don't care about actual data, just need to get to draw to flag error
7168 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07007169 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
7170 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06007171 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06007172 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007173
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007174 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007175
Chia-I Wuf7458c52015-10-26 21:10:41 +08007176 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7177 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7178 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007179}
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06007180// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
7181TEST_F(VkLayerTest, InvalidImageLayout) {
7182 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
7183 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
7184 "images in the wrong layout when they're copied or transitioned.");
7185 // 3 in ValidateCmdBufImageLayouts
7186 // * -1 Attempt to submit cmd buf w/ deleted image
7187 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
7188 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
7189 m_errorMonitor->SetDesiredFailureMsg(
7190 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7191 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
7192
7193 ASSERT_NO_FATAL_FAILURE(InitState());
7194 // Create src & dst images to use for copy operations
7195 VkImage src_image;
7196 VkImage dst_image;
7197
7198 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7199 const int32_t tex_width = 32;
7200 const int32_t tex_height = 32;
7201
7202 VkImageCreateInfo image_create_info = {};
7203 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7204 image_create_info.pNext = NULL;
7205 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7206 image_create_info.format = tex_format;
7207 image_create_info.extent.width = tex_width;
7208 image_create_info.extent.height = tex_height;
7209 image_create_info.extent.depth = 1;
7210 image_create_info.mipLevels = 1;
7211 image_create_info.arrayLayers = 4;
7212 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7213 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7214 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7215 image_create_info.flags = 0;
7216
7217 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
7218 ASSERT_VK_SUCCESS(err);
7219 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
7220 ASSERT_VK_SUCCESS(err);
7221
7222 BeginCommandBuffer();
7223 VkImageCopy copyRegion;
7224 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7225 copyRegion.srcSubresource.mipLevel = 0;
7226 copyRegion.srcSubresource.baseArrayLayer = 0;
7227 copyRegion.srcSubresource.layerCount = 1;
7228 copyRegion.srcOffset.x = 0;
7229 copyRegion.srcOffset.y = 0;
7230 copyRegion.srcOffset.z = 0;
7231 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7232 copyRegion.dstSubresource.mipLevel = 0;
7233 copyRegion.dstSubresource.baseArrayLayer = 0;
7234 copyRegion.dstSubresource.layerCount = 1;
7235 copyRegion.dstOffset.x = 0;
7236 copyRegion.dstOffset.y = 0;
7237 copyRegion.dstOffset.z = 0;
7238 copyRegion.extent.width = 1;
7239 copyRegion.extent.height = 1;
7240 copyRegion.extent.depth = 1;
7241 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7242 m_errorMonitor->VerifyFound();
7243 // Now cause error due to src image layout changing
7244 m_errorMonitor->SetDesiredFailureMsg(
7245 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7246 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
7247 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7248 m_errorMonitor->VerifyFound();
7249 // Final src error is due to bad layout type
7250 m_errorMonitor->SetDesiredFailureMsg(
7251 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7252 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
7253 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7254 m_errorMonitor->VerifyFound();
7255 // Now verify same checks for dst
7256 m_errorMonitor->SetDesiredFailureMsg(
7257 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7258 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
7259 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7260 m_errorMonitor->VerifyFound();
7261 // Now cause error due to src image layout changing
7262 m_errorMonitor->SetDesiredFailureMsg(
7263 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7264 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
7265 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
7266 m_errorMonitor->VerifyFound();
7267 m_errorMonitor->SetDesiredFailureMsg(
7268 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7269 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
7270 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
7271 m_errorMonitor->VerifyFound();
7272 // Now cause error due to bad image layout transition in PipelineBarrier
7273 VkImageMemoryBarrier image_barrier[1] = {};
7274 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7275 image_barrier[0].image = src_image;
7276 image_barrier[0].subresourceRange.layerCount = 2;
7277 image_barrier[0].subresourceRange.levelCount = 2;
7278 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7279 m_errorMonitor->SetDesiredFailureMsg(
7280 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7281 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
7282 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
7283 m_errorMonitor->VerifyFound();
7284
7285 // Finally some layout errors at RenderPass create time
7286 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
7287 VkAttachmentReference attach = {};
7288 // perf warning for GENERAL layout w/ non-DS input attachment
7289 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7290 VkSubpassDescription subpass = {};
7291 subpass.inputAttachmentCount = 1;
7292 subpass.pInputAttachments = &attach;
7293 VkRenderPassCreateInfo rpci = {};
7294 rpci.subpassCount = 1;
7295 rpci.pSubpasses = &subpass;
7296 rpci.attachmentCount = 1;
7297 VkAttachmentDescription attach_desc = {};
7298 attach_desc.format = VK_FORMAT_UNDEFINED;
7299 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -06007300 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06007301 VkRenderPass rp;
7302 m_errorMonitor->SetDesiredFailureMsg(
7303 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7304 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
7305 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7306 m_errorMonitor->VerifyFound();
7307 // error w/ non-general layout
7308 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7309
7310 m_errorMonitor->SetDesiredFailureMsg(
7311 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7312 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
7313 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7314 m_errorMonitor->VerifyFound();
7315 subpass.inputAttachmentCount = 0;
7316 subpass.colorAttachmentCount = 1;
7317 subpass.pColorAttachments = &attach;
7318 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7319 // perf warning for GENERAL layout on color attachment
7320 m_errorMonitor->SetDesiredFailureMsg(
7321 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7322 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
7323 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7324 m_errorMonitor->VerifyFound();
7325 // error w/ non-color opt or GENERAL layout for color attachment
7326 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7327 m_errorMonitor->SetDesiredFailureMsg(
7328 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7329 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
7330 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7331 m_errorMonitor->VerifyFound();
7332 subpass.colorAttachmentCount = 0;
7333 subpass.pDepthStencilAttachment = &attach;
7334 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7335 // perf warning for GENERAL layout on DS attachment
7336 m_errorMonitor->SetDesiredFailureMsg(
7337 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7338 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
7339 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7340 m_errorMonitor->VerifyFound();
7341 // error w/ non-ds opt or GENERAL layout for color attachment
7342 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7343 m_errorMonitor->SetDesiredFailureMsg(
7344 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7345 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
7346 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7347 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -06007348 // For this error we need a valid renderpass so create default one
7349 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7350 attach.attachment = 0;
7351 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
7352 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
7353 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
7354 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
7355 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
7356 // Can't do a CLEAR load on READ_ONLY initialLayout
7357 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
7358 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7359 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
7360 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7361 " with invalid first layout "
7362 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
7363 "ONLY_OPTIMAL");
7364 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7365 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06007366
7367 vkDestroyImage(m_device->device(), src_image, NULL);
7368 vkDestroyImage(m_device->device(), dst_image, NULL);
7369}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007370#endif // DRAW_STATE_TESTS
7371
Tobin Ehlis0788f522015-05-26 16:11:58 -06007372#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06007373#if GTEST_IS_THREADSAFE
7374struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007375 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007376 VkEvent event;
7377 bool bailout;
7378};
7379
Karl Schultz6addd812016-02-02 17:17:23 -07007380extern "C" void *AddToCommandBuffer(void *arg) {
7381 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007382
Karl Schultz6addd812016-02-02 17:17:23 -07007383 for (int i = 0; i < 10000; i++) {
7384 vkCmdSetEvent(data->commandBuffer, data->event,
7385 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007386 if (data->bailout) {
7387 break;
7388 }
7389 }
7390 return NULL;
7391}
7392
Karl Schultz6addd812016-02-02 17:17:23 -07007393TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007394 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007395
Karl Schultz6addd812016-02-02 17:17:23 -07007396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7397 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007398
Mike Stroyanaccf7692015-05-12 16:00:45 -06007399 ASSERT_NO_FATAL_FAILURE(InitState());
7400 ASSERT_NO_FATAL_FAILURE(InitViewport());
7401 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7402
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007403 // Calls AllocateCommandBuffers
7404 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06007405
7406 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007407 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007408
7409 VkEventCreateInfo event_info;
7410 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007411 VkResult err;
7412
7413 memset(&event_info, 0, sizeof(event_info));
7414 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
7415
Chia-I Wuf7458c52015-10-26 21:10:41 +08007416 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007417 ASSERT_VK_SUCCESS(err);
7418
Mike Stroyanaccf7692015-05-12 16:00:45 -06007419 err = vkResetEvent(device(), event);
7420 ASSERT_VK_SUCCESS(err);
7421
7422 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007423 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007424 data.event = event;
7425 data.bailout = false;
7426 m_errorMonitor->SetBailout(&data.bailout);
7427 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007428 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007429 // Add many entries to command buffer from this thread at the same time.
7430 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06007431
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007432 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007433 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007434
Mike Stroyan10b8cb72016-01-22 15:22:03 -07007435 m_errorMonitor->SetBailout(NULL);
7436
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007437 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007438
Chia-I Wuf7458c52015-10-26 21:10:41 +08007439 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007440}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007441#endif // GTEST_IS_THREADSAFE
7442#endif // THREADING_TESTS
7443
Chris Forbes9f7ff632015-05-25 11:13:08 +12007444#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007445TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007447 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007448
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007449 ASSERT_NO_FATAL_FAILURE(InitState());
7450 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7451
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007452 VkShaderModule module;
7453 VkShaderModuleCreateInfo moduleCreateInfo;
7454 struct icd_spv_header spv;
7455
7456 spv.magic = ICD_SPV_MAGIC;
7457 spv.version = ICD_SPV_VERSION;
7458 spv.gen_magic = 0;
7459
7460 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7461 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007462 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007463 moduleCreateInfo.codeSize = 4;
7464 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007465 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007466
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007467 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007468}
7469
Karl Schultz6addd812016-02-02 17:17:23 -07007470TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007471 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007472 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007473
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007474 ASSERT_NO_FATAL_FAILURE(InitState());
7475 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7476
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007477 VkShaderModule module;
7478 VkShaderModuleCreateInfo moduleCreateInfo;
7479 struct icd_spv_header spv;
7480
7481 spv.magic = ~ICD_SPV_MAGIC;
7482 spv.version = ICD_SPV_VERSION;
7483 spv.gen_magic = 0;
7484
7485 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7486 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007487 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007488 moduleCreateInfo.codeSize = sizeof(spv) + 10;
7489 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007490 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007491
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007492 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007493}
7494
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007495#if 0
7496// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07007497TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007499 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007500
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007501 ASSERT_NO_FATAL_FAILURE(InitState());
7502 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7503
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007504 VkShaderModule module;
7505 VkShaderModuleCreateInfo moduleCreateInfo;
7506 struct icd_spv_header spv;
7507
7508 spv.magic = ICD_SPV_MAGIC;
7509 spv.version = ~ICD_SPV_VERSION;
7510 spv.gen_magic = 0;
7511
7512 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7513 moduleCreateInfo.pNext = NULL;
7514
Karl Schultz6addd812016-02-02 17:17:23 -07007515 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007516 moduleCreateInfo.codeSize = sizeof(spv) + 10;
7517 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007518 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007519
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007520 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007521}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007522#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007523
Karl Schultz6addd812016-02-02 17:17:23 -07007524TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007526 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007527
Chris Forbes9f7ff632015-05-25 11:13:08 +12007528 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12007530
7531 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007532 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12007533 "\n"
7534 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007535 "out gl_PerVertex {\n"
7536 " vec4 gl_Position;\n"
7537 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12007538 "void main(){\n"
7539 " gl_Position = vec4(1);\n"
7540 " x = 0;\n"
7541 "}\n";
7542 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007543 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12007544 "\n"
7545 "layout(location=0) out vec4 color;\n"
7546 "void main(){\n"
7547 " color = vec4(1);\n"
7548 "}\n";
7549
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007550 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7551 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12007552
7553 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007554 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12007555 pipe.AddShader(&vs);
7556 pipe.AddShader(&fs);
7557
Chris Forbes9f7ff632015-05-25 11:13:08 +12007558 VkDescriptorSetObj descriptorSet(m_device);
7559 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007560 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12007561
Tony Barbour5781e8f2015-08-04 16:23:11 -06007562 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12007563
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007564 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12007565}
Chris Forbes9f7ff632015-05-25 11:13:08 +12007566
Karl Schultz6addd812016-02-02 17:17:23 -07007567TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007568 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007569 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007570
Chris Forbes59cb88d2015-05-25 11:13:13 +12007571 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007572 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12007573
7574 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007575 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12007576 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007577 "out gl_PerVertex {\n"
7578 " vec4 gl_Position;\n"
7579 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12007580 "void main(){\n"
7581 " gl_Position = vec4(1);\n"
7582 "}\n";
7583 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007584 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12007585 "\n"
7586 "layout(location=0) in float x;\n"
7587 "layout(location=0) out vec4 color;\n"
7588 "void main(){\n"
7589 " color = vec4(x);\n"
7590 "}\n";
7591
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007592 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7593 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12007594
7595 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007596 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12007597 pipe.AddShader(&vs);
7598 pipe.AddShader(&fs);
7599
Chris Forbes59cb88d2015-05-25 11:13:13 +12007600 VkDescriptorSetObj descriptorSet(m_device);
7601 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007602 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12007603
Tony Barbour5781e8f2015-08-04 16:23:11 -06007604 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12007605
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007606 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12007607}
7608
Karl Schultz6addd812016-02-02 17:17:23 -07007609TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13007610 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007611 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13007612
7613 ASSERT_NO_FATAL_FAILURE(InitState());
7614 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7615
7616 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007617 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007618 "\n"
7619 "out gl_PerVertex {\n"
7620 " vec4 gl_Position;\n"
7621 "};\n"
7622 "void main(){\n"
7623 " gl_Position = vec4(1);\n"
7624 "}\n";
7625 char const *fsSource =
7626 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007627 "\n"
7628 "in block { layout(location=0) float x; } ins;\n"
7629 "layout(location=0) out vec4 color;\n"
7630 "void main(){\n"
7631 " color = vec4(ins.x);\n"
7632 "}\n";
7633
7634 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7635 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7636
7637 VkPipelineObj pipe(m_device);
7638 pipe.AddColorAttachment();
7639 pipe.AddShader(&vs);
7640 pipe.AddShader(&fs);
7641
7642 VkDescriptorSetObj descriptorSet(m_device);
7643 descriptorSet.AppendDummy();
7644 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7645
7646 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7647
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007648 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13007649}
7650
Karl Schultz6addd812016-02-02 17:17:23 -07007651TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13007652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13007653 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07007654 "output arr[2] of float32' vs 'ptr to "
7655 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13007656
7657 ASSERT_NO_FATAL_FAILURE(InitState());
7658 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7659
7660 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007661 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13007662 "\n"
7663 "layout(location=0) out float x[2];\n"
7664 "out gl_PerVertex {\n"
7665 " vec4 gl_Position;\n"
7666 "};\n"
7667 "void main(){\n"
7668 " x[0] = 0; x[1] = 0;\n"
7669 " gl_Position = vec4(1);\n"
7670 "}\n";
7671 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007672 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13007673 "\n"
7674 "layout(location=0) in float x[3];\n"
7675 "layout(location=0) out vec4 color;\n"
7676 "void main(){\n"
7677 " color = vec4(x[0] + x[1] + x[2]);\n"
7678 "}\n";
7679
7680 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7681 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7682
7683 VkPipelineObj pipe(m_device);
7684 pipe.AddColorAttachment();
7685 pipe.AddShader(&vs);
7686 pipe.AddShader(&fs);
7687
7688 VkDescriptorSetObj descriptorSet(m_device);
7689 descriptorSet.AppendDummy();
7690 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7691
7692 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7693
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007694 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13007695}
7696
Karl Schultz6addd812016-02-02 17:17:23 -07007697TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007699 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007700
Chris Forbesb56af562015-05-25 11:13:17 +12007701 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007702 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12007703
7704 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007705 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007706 "\n"
7707 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007708 "out gl_PerVertex {\n"
7709 " vec4 gl_Position;\n"
7710 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007711 "void main(){\n"
7712 " x = 0;\n"
7713 " gl_Position = vec4(1);\n"
7714 "}\n";
7715 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007716 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007717 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007718 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12007719 "layout(location=0) out vec4 color;\n"
7720 "void main(){\n"
7721 " color = vec4(x);\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 Forbesb56af562015-05-25 11:13:17 +12007726
7727 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007728 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12007729 pipe.AddShader(&vs);
7730 pipe.AddShader(&fs);
7731
Chris Forbesb56af562015-05-25 11:13:17 +12007732 VkDescriptorSetObj descriptorSet(m_device);
7733 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007734 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12007735
Tony Barbour5781e8f2015-08-04 16:23:11 -06007736 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12007737
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007738 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12007739}
7740
Karl Schultz6addd812016-02-02 17:17:23 -07007741TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13007742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007743 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13007744
7745 ASSERT_NO_FATAL_FAILURE(InitState());
7746 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7747
7748 char const *vsSource =
7749 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007750 "\n"
7751 "out block { layout(location=0) int x; } outs;\n"
7752 "out gl_PerVertex {\n"
7753 " vec4 gl_Position;\n"
7754 "};\n"
7755 "void main(){\n"
7756 " outs.x = 0;\n"
7757 " gl_Position = vec4(1);\n"
7758 "}\n";
7759 char const *fsSource =
7760 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007761 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007762 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13007763 "layout(location=0) out vec4 color;\n"
7764 "void main(){\n"
7765 " color = vec4(ins.x);\n"
7766 "}\n";
7767
7768 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7769 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7770
7771 VkPipelineObj pipe(m_device);
7772 pipe.AddColorAttachment();
7773 pipe.AddShader(&vs);
7774 pipe.AddShader(&fs);
7775
7776 VkDescriptorSetObj descriptorSet(m_device);
7777 descriptorSet.AppendDummy();
7778 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7779
7780 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7781
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007782 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13007783}
7784
7785TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
7786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7787 "location 0.0 which is not written by vertex shader");
7788
7789 ASSERT_NO_FATAL_FAILURE(InitState());
7790 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7791
7792 char const *vsSource =
7793 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007794 "\n"
7795 "out block { layout(location=1) float x; } outs;\n"
7796 "out gl_PerVertex {\n"
7797 " vec4 gl_Position;\n"
7798 "};\n"
7799 "void main(){\n"
7800 " outs.x = 0;\n"
7801 " gl_Position = vec4(1);\n"
7802 "}\n";
7803 char const *fsSource =
7804 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007805 "\n"
7806 "in block { layout(location=0) float x; } ins;\n"
7807 "layout(location=0) out vec4 color;\n"
7808 "void main(){\n"
7809 " color = vec4(ins.x);\n"
7810 "}\n";
7811
7812 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7813 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7814
7815 VkPipelineObj pipe(m_device);
7816 pipe.AddColorAttachment();
7817 pipe.AddShader(&vs);
7818 pipe.AddShader(&fs);
7819
7820 VkDescriptorSetObj descriptorSet(m_device);
7821 descriptorSet.AppendDummy();
7822 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7823
7824 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7825
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007826 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13007827}
7828
7829TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
7830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7831 "location 0.1 which is not written by vertex shader");
7832
7833 ASSERT_NO_FATAL_FAILURE(InitState());
7834 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7835
7836 char const *vsSource =
7837 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007838 "\n"
7839 "out block { layout(location=0, component=0) float x; } outs;\n"
7840 "out gl_PerVertex {\n"
7841 " vec4 gl_Position;\n"
7842 "};\n"
7843 "void main(){\n"
7844 " outs.x = 0;\n"
7845 " gl_Position = vec4(1);\n"
7846 "}\n";
7847 char const *fsSource =
7848 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007849 "\n"
7850 "in block { layout(location=0, component=1) float x; } ins;\n"
7851 "layout(location=0) out vec4 color;\n"
7852 "void main(){\n"
7853 " color = vec4(ins.x);\n"
7854 "}\n";
7855
7856 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7857 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7858
7859 VkPipelineObj pipe(m_device);
7860 pipe.AddColorAttachment();
7861 pipe.AddShader(&vs);
7862 pipe.AddShader(&fs);
7863
7864 VkDescriptorSetObj descriptorSet(m_device);
7865 descriptorSet.AppendDummy();
7866 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7867
7868 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7869
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007870 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13007871}
7872
Karl Schultz6addd812016-02-02 17:17:23 -07007873TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007875 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007876
Chris Forbesde136e02015-05-25 11:13:28 +12007877 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007878 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12007879
7880 VkVertexInputBindingDescription input_binding;
7881 memset(&input_binding, 0, sizeof(input_binding));
7882
7883 VkVertexInputAttributeDescription input_attrib;
7884 memset(&input_attrib, 0, sizeof(input_attrib));
7885 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7886
7887 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007888 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007889 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007890 "out gl_PerVertex {\n"
7891 " vec4 gl_Position;\n"
7892 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007893 "void main(){\n"
7894 " gl_Position = vec4(1);\n"
7895 "}\n";
7896 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007897 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007898 "\n"
7899 "layout(location=0) out vec4 color;\n"
7900 "void main(){\n"
7901 " color = vec4(1);\n"
7902 "}\n";
7903
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007904 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7905 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12007906
7907 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007908 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12007909 pipe.AddShader(&vs);
7910 pipe.AddShader(&fs);
7911
7912 pipe.AddVertexInputBindings(&input_binding, 1);
7913 pipe.AddVertexInputAttribs(&input_attrib, 1);
7914
Chris Forbesde136e02015-05-25 11:13:28 +12007915 VkDescriptorSetObj descriptorSet(m_device);
7916 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007917 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12007918
Tony Barbour5781e8f2015-08-04 16:23:11 -06007919 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12007920
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007921 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12007922}
7923
Karl Schultz6addd812016-02-02 17:17:23 -07007924TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007926 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13007927
7928 ASSERT_NO_FATAL_FAILURE(InitState());
7929 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7930
7931 VkVertexInputBindingDescription input_binding;
7932 memset(&input_binding, 0, sizeof(input_binding));
7933
7934 VkVertexInputAttributeDescription input_attrib;
7935 memset(&input_attrib, 0, sizeof(input_attrib));
7936 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7937
7938 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007939 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007940 "\n"
7941 "layout(location=1) in float x;\n"
7942 "out gl_PerVertex {\n"
7943 " vec4 gl_Position;\n"
7944 "};\n"
7945 "void main(){\n"
7946 " gl_Position = vec4(x);\n"
7947 "}\n";
7948 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007949 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007950 "\n"
7951 "layout(location=0) out vec4 color;\n"
7952 "void main(){\n"
7953 " color = vec4(1);\n"
7954 "}\n";
7955
7956 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7957 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7958
7959 VkPipelineObj pipe(m_device);
7960 pipe.AddColorAttachment();
7961 pipe.AddShader(&vs);
7962 pipe.AddShader(&fs);
7963
7964 pipe.AddVertexInputBindings(&input_binding, 1);
7965 pipe.AddVertexInputAttribs(&input_attrib, 1);
7966
7967 VkDescriptorSetObj descriptorSet(m_device);
7968 descriptorSet.AppendDummy();
7969 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7970
7971 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7972
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007973 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13007974}
7975
Karl Schultz6addd812016-02-02 17:17:23 -07007976TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
7977 m_errorMonitor->SetDesiredFailureMsg(
7978 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007979 "VS consumes input at location 0 but not provided");
7980
Chris Forbes62e8e502015-05-25 11:13:29 +12007981 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007982 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12007983
7984 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007985 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007986 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007987 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07007988 "out gl_PerVertex {\n"
7989 " vec4 gl_Position;\n"
7990 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007991 "void main(){\n"
7992 " gl_Position = x;\n"
7993 "}\n";
7994 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007995 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007996 "\n"
7997 "layout(location=0) out vec4 color;\n"
7998 "void main(){\n"
7999 " color = vec4(1);\n"
8000 "}\n";
8001
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008002 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8003 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12008004
8005 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008006 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12008007 pipe.AddShader(&vs);
8008 pipe.AddShader(&fs);
8009
Chris Forbes62e8e502015-05-25 11:13:29 +12008010 VkDescriptorSetObj descriptorSet(m_device);
8011 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008012 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12008013
Tony Barbour5781e8f2015-08-04 16:23:11 -06008014 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12008015
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008016 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12008017}
8018
Karl Schultz6addd812016-02-02 17:17:23 -07008019TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
8020 m_errorMonitor->SetDesiredFailureMsg(
8021 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008022 "location 0 does not match VS input type");
8023
Chris Forbesc97d98e2015-05-25 11:13:31 +12008024 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008025 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12008026
8027 VkVertexInputBindingDescription input_binding;
8028 memset(&input_binding, 0, sizeof(input_binding));
8029
8030 VkVertexInputAttributeDescription input_attrib;
8031 memset(&input_attrib, 0, sizeof(input_attrib));
8032 input_attrib.format = VK_FORMAT_R32_SFLOAT;
8033
8034 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008035 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12008036 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008037 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07008038 "out gl_PerVertex {\n"
8039 " vec4 gl_Position;\n"
8040 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12008041 "void main(){\n"
8042 " gl_Position = vec4(x);\n"
8043 "}\n";
8044 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008045 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12008046 "\n"
8047 "layout(location=0) out vec4 color;\n"
8048 "void main(){\n"
8049 " color = vec4(1);\n"
8050 "}\n";
8051
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008052 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8053 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12008054
8055 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008056 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12008057 pipe.AddShader(&vs);
8058 pipe.AddShader(&fs);
8059
8060 pipe.AddVertexInputBindings(&input_binding, 1);
8061 pipe.AddVertexInputAttribs(&input_attrib, 1);
8062
Chris Forbesc97d98e2015-05-25 11:13:31 +12008063 VkDescriptorSetObj descriptorSet(m_device);
8064 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008065 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12008066
Tony Barbour5781e8f2015-08-04 16:23:11 -06008067 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12008068
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008069 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12008070}
8071
Chris Forbesc68b43c2016-04-06 11:18:47 +12008072TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
8073 m_errorMonitor->SetDesiredFailureMsg(
8074 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8075 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
8076
8077 ASSERT_NO_FATAL_FAILURE(InitState());
8078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8079
8080 char const *vsSource =
8081 "#version 450\n"
8082 "\n"
8083 "out gl_PerVertex {\n"
8084 " vec4 gl_Position;\n"
8085 "};\n"
8086 "void main(){\n"
8087 " gl_Position = vec4(1);\n"
8088 "}\n";
8089 char const *fsSource =
8090 "#version 450\n"
8091 "\n"
8092 "layout(location=0) out vec4 color;\n"
8093 "void main(){\n"
8094 " color = vec4(1);\n"
8095 "}\n";
8096
8097 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8098 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8099
8100 VkPipelineObj pipe(m_device);
8101 pipe.AddColorAttachment();
8102 pipe.AddShader(&vs);
8103 pipe.AddShader(&vs);
8104 pipe.AddShader(&fs);
8105
8106 VkDescriptorSetObj descriptorSet(m_device);
8107 descriptorSet.AppendDummy();
8108 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8109
8110 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8111
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008112 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12008113}
8114
Karl Schultz6addd812016-02-02 17:17:23 -07008115TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008116 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13008117
8118 ASSERT_NO_FATAL_FAILURE(InitState());
8119 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8120
8121 VkVertexInputBindingDescription input_binding;
8122 memset(&input_binding, 0, sizeof(input_binding));
8123
8124 VkVertexInputAttributeDescription input_attribs[2];
8125 memset(input_attribs, 0, sizeof(input_attribs));
8126
8127 for (int i = 0; i < 2; i++) {
8128 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
8129 input_attribs[i].location = i;
8130 }
8131
8132 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008133 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008134 "\n"
8135 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07008136 "out gl_PerVertex {\n"
8137 " vec4 gl_Position;\n"
8138 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008139 "void main(){\n"
8140 " gl_Position = x[0] + x[1];\n"
8141 "}\n";
8142 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008143 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008144 "\n"
8145 "layout(location=0) out vec4 color;\n"
8146 "void main(){\n"
8147 " color = vec4(1);\n"
8148 "}\n";
8149
8150 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_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(&fs);
8157
8158 pipe.AddVertexInputBindings(&input_binding, 1);
8159 pipe.AddVertexInputAttribs(input_attribs, 2);
8160
8161 VkDescriptorSetObj descriptorSet(m_device);
8162 descriptorSet.AppendDummy();
8163 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8164
8165 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8166
8167 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008168 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13008169}
8170
Chris Forbes2682b242015-11-24 11:13:14 +13008171TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
8172{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008173 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13008174
8175 ASSERT_NO_FATAL_FAILURE(InitState());
8176 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8177
8178 VkVertexInputBindingDescription input_binding;
8179 memset(&input_binding, 0, sizeof(input_binding));
8180
8181 VkVertexInputAttributeDescription input_attribs[2];
8182 memset(input_attribs, 0, sizeof(input_attribs));
8183
8184 for (int i = 0; i < 2; i++) {
8185 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
8186 input_attribs[i].location = i;
8187 }
8188
8189 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008190 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008191 "\n"
8192 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07008193 "out gl_PerVertex {\n"
8194 " vec4 gl_Position;\n"
8195 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008196 "void main(){\n"
8197 " gl_Position = x[0] + x[1];\n"
8198 "}\n";
8199 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008200 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008201 "\n"
8202 "layout(location=0) out vec4 color;\n"
8203 "void main(){\n"
8204 " color = vec4(1);\n"
8205 "}\n";
8206
8207 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8208 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8209
8210 VkPipelineObj pipe(m_device);
8211 pipe.AddColorAttachment();
8212 pipe.AddShader(&vs);
8213 pipe.AddShader(&fs);
8214
8215 pipe.AddVertexInputBindings(&input_binding, 1);
8216 pipe.AddVertexInputAttribs(input_attribs, 2);
8217
8218 VkDescriptorSetObj descriptorSet(m_device);
8219 descriptorSet.AppendDummy();
8220 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8221
8222 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8223
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008224 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13008225}
Chris Forbes2682b242015-11-24 11:13:14 +13008226
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008227TEST_F(VkLayerTest, CreatePipelineSimplePositive)
8228{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008229 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008230
8231 ASSERT_NO_FATAL_FAILURE(InitState());
8232 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8233
8234 char const *vsSource =
8235 "#version 450\n"
8236 "out gl_PerVertex {\n"
8237 " vec4 gl_Position;\n"
8238 "};\n"
8239 "void main(){\n"
8240 " gl_Position = vec4(0);\n"
8241 "}\n";
8242 char const *fsSource =
8243 "#version 450\n"
8244 "\n"
8245 "layout(location=0) out vec4 color;\n"
8246 "void main(){\n"
8247 " color = vec4(1);\n"
8248 "}\n";
8249
8250 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8251 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8252
8253 VkPipelineObj pipe(m_device);
8254 pipe.AddColorAttachment();
8255 pipe.AddShader(&vs);
8256 pipe.AddShader(&fs);
8257
8258 VkDescriptorSetObj descriptorSet(m_device);
8259 descriptorSet.AppendDummy();
8260 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8261
8262 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8263
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008264 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008265}
8266
Chris Forbes912c9192016-04-05 17:50:35 +12008267TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
8268{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008269 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12008270
8271 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
8272
8273 ASSERT_NO_FATAL_FAILURE(InitState());
8274 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8275
8276 char const *vsSource =
8277 "#version 450\n"
8278 "out gl_PerVertex {\n"
8279 " vec4 gl_Position;\n"
8280 "};\n"
8281 "layout(location=0) out vec3 x;\n"
8282 "layout(location=1) out ivec3 y;\n"
8283 "layout(location=2) out vec3 z;\n"
8284 "void main(){\n"
8285 " gl_Position = vec4(0);\n"
8286 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
8287 "}\n";
8288 char const *fsSource =
8289 "#version 450\n"
8290 "\n"
8291 "layout(location=0) out vec4 color;\n"
8292 "layout(location=0) in float x;\n"
8293 "layout(location=1) flat in int y;\n"
8294 "layout(location=2) in vec2 z;\n"
8295 "void main(){\n"
8296 " color = vec4(1 + x + y + z.x);\n"
8297 "}\n";
8298
8299 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8300 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8301
8302 VkPipelineObj pipe(m_device);
8303 pipe.AddColorAttachment();
8304 pipe.AddShader(&vs);
8305 pipe.AddShader(&fs);
8306
8307 VkDescriptorSetObj descriptorSet(m_device);
8308 descriptorSet.AppendDummy();
8309 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8310
8311 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8312
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008313 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12008314}
8315
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008316TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
8317{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008318 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008319
8320 ASSERT_NO_FATAL_FAILURE(InitState());
8321 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8322
Chris Forbesc1e852d2016-04-04 19:26:42 +12008323 if (!m_device->phy().features().tessellationShader) {
8324 printf("Device does not support tessellation shaders; skipped.\n");
8325 return;
8326 }
8327
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008328 char const *vsSource =
8329 "#version 450\n"
8330 "void main(){}\n";
8331 char const *tcsSource =
8332 "#version 450\n"
8333 "layout(location=0) out int x[];\n"
8334 "layout(vertices=3) out;\n"
8335 "void main(){\n"
8336 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
8337 " gl_TessLevelInner[0] = 1;\n"
8338 " x[gl_InvocationID] = gl_InvocationID;\n"
8339 "}\n";
8340 char const *tesSource =
8341 "#version 450\n"
8342 "layout(triangles, equal_spacing, cw) in;\n"
8343 "layout(location=0) in int x[];\n"
8344 "out gl_PerVertex { vec4 gl_Position; };\n"
8345 "void main(){\n"
8346 " gl_Position.xyz = gl_TessCoord;\n"
8347 " gl_Position.w = x[0] + x[1] + x[2];\n"
8348 "}\n";
8349 char const *fsSource =
8350 "#version 450\n"
8351 "layout(location=0) out vec4 color;\n"
8352 "void main(){\n"
8353 " color = vec4(1);\n"
8354 "}\n";
8355
8356 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8357 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
8358 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
8359 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8360
8361 VkPipelineInputAssemblyStateCreateInfo iasci{
8362 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
8363 nullptr,
8364 0,
8365 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
8366 VK_FALSE};
8367
Chris Forbesb4cacb62016-04-04 19:15:00 +12008368 VkPipelineTessellationStateCreateInfo tsci{
8369 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
8370 nullptr,
8371 0,
8372 3};
8373
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008374 VkPipelineObj pipe(m_device);
8375 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12008376 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008377 pipe.AddColorAttachment();
8378 pipe.AddShader(&vs);
8379 pipe.AddShader(&tcs);
8380 pipe.AddShader(&tes);
8381 pipe.AddShader(&fs);
8382
8383 VkDescriptorSetObj descriptorSet(m_device);
8384 descriptorSet.AppendDummy();
8385 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8386
8387 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8388
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008389 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008390}
8391
Chris Forbesa0ab8152016-04-20 13:34:27 +12008392TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
8393{
8394 m_errorMonitor->ExpectSuccess();
8395
8396 ASSERT_NO_FATAL_FAILURE(InitState());
8397 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8398
8399 if (!m_device->phy().features().geometryShader) {
8400 printf("Device does not support geometry shaders; skipped.\n");
8401 return;
8402 }
8403
8404 char const *vsSource =
8405 "#version 450\n"
8406 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
8407 "void main(){\n"
8408 " vs_out.x = vec4(1);\n"
8409 "}\n";
8410 char const *gsSource =
8411 "#version 450\n"
8412 "layout(triangles) in;\n"
8413 "layout(triangle_strip, max_vertices=3) out;\n"
8414 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
8415 "out gl_PerVertex { vec4 gl_Position; };\n"
8416 "void main() {\n"
8417 " gl_Position = gs_in[0].x;\n"
8418 " EmitVertex();\n"
8419 "}\n";
8420 char const *fsSource =
8421 "#version 450\n"
8422 "layout(location=0) out vec4 color;\n"
8423 "void main(){\n"
8424 " color = vec4(1);\n"
8425 "}\n";
8426
8427 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8428 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
8429 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8430
8431 VkPipelineObj pipe(m_device);
8432 pipe.AddColorAttachment();
8433 pipe.AddShader(&vs);
8434 pipe.AddShader(&gs);
8435 pipe.AddShader(&fs);
8436
8437 VkDescriptorSetObj descriptorSet(m_device);
8438 descriptorSet.AppendDummy();
8439 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8440
8441 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8442
8443 m_errorMonitor->VerifyNotFound();
8444}
8445
Chris Forbesa0193bc2016-04-04 19:19:47 +12008446TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
8447{
8448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8449 "is per-vertex in tessellation control shader stage "
8450 "but per-patch in tessellation evaluation shader stage");
8451
8452 ASSERT_NO_FATAL_FAILURE(InitState());
8453 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8454
Chris Forbesc1e852d2016-04-04 19:26:42 +12008455 if (!m_device->phy().features().tessellationShader) {
8456 printf("Device does not support tessellation shaders; skipped.\n");
8457 return;
8458 }
8459
Chris Forbesa0193bc2016-04-04 19:19:47 +12008460 char const *vsSource =
8461 "#version 450\n"
8462 "void main(){}\n";
8463 char const *tcsSource =
8464 "#version 450\n"
8465 "layout(location=0) out int x[];\n"
8466 "layout(vertices=3) out;\n"
8467 "void main(){\n"
8468 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
8469 " gl_TessLevelInner[0] = 1;\n"
8470 " x[gl_InvocationID] = gl_InvocationID;\n"
8471 "}\n";
8472 char const *tesSource =
8473 "#version 450\n"
8474 "layout(triangles, equal_spacing, cw) in;\n"
8475 "layout(location=0) patch in int x;\n"
8476 "out gl_PerVertex { vec4 gl_Position; };\n"
8477 "void main(){\n"
8478 " gl_Position.xyz = gl_TessCoord;\n"
8479 " gl_Position.w = x;\n"
8480 "}\n";
8481 char const *fsSource =
8482 "#version 450\n"
8483 "layout(location=0) out vec4 color;\n"
8484 "void main(){\n"
8485 " color = vec4(1);\n"
8486 "}\n";
8487
8488 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8489 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
8490 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
8491 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8492
8493 VkPipelineInputAssemblyStateCreateInfo iasci{
8494 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
8495 nullptr,
8496 0,
8497 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
8498 VK_FALSE};
8499
8500 VkPipelineTessellationStateCreateInfo tsci{
8501 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
8502 nullptr,
8503 0,
8504 3};
8505
8506 VkPipelineObj pipe(m_device);
8507 pipe.SetInputAssembly(&iasci);
8508 pipe.SetTessellation(&tsci);
8509 pipe.AddColorAttachment();
8510 pipe.AddShader(&vs);
8511 pipe.AddShader(&tcs);
8512 pipe.AddShader(&tes);
8513 pipe.AddShader(&fs);
8514
8515 VkDescriptorSetObj descriptorSet(m_device);
8516 descriptorSet.AppendDummy();
8517 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8518
8519 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8520
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008521 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12008522}
8523
Karl Schultz6addd812016-02-02 17:17:23 -07008524TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
8525 m_errorMonitor->SetDesiredFailureMsg(
8526 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008527 "Duplicate vertex input binding descriptions for binding 0");
8528
Chris Forbes280ba2c2015-06-12 11:16:41 +12008529 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008530 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12008531
8532 /* Two binding descriptions for binding 0 */
8533 VkVertexInputBindingDescription input_bindings[2];
8534 memset(input_bindings, 0, sizeof(input_bindings));
8535
8536 VkVertexInputAttributeDescription input_attrib;
8537 memset(&input_attrib, 0, sizeof(input_attrib));
8538 input_attrib.format = VK_FORMAT_R32_SFLOAT;
8539
8540 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008541 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12008542 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008543 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07008544 "out gl_PerVertex {\n"
8545 " vec4 gl_Position;\n"
8546 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12008547 "void main(){\n"
8548 " gl_Position = vec4(x);\n"
8549 "}\n";
8550 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008551 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12008552 "\n"
8553 "layout(location=0) out vec4 color;\n"
8554 "void main(){\n"
8555 " color = vec4(1);\n"
8556 "}\n";
8557
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008558 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8559 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12008560
8561 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008562 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12008563 pipe.AddShader(&vs);
8564 pipe.AddShader(&fs);
8565
8566 pipe.AddVertexInputBindings(input_bindings, 2);
8567 pipe.AddVertexInputAttribs(&input_attrib, 1);
8568
Chris Forbes280ba2c2015-06-12 11:16:41 +12008569 VkDescriptorSetObj descriptorSet(m_device);
8570 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008571 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12008572
Tony Barbour5781e8f2015-08-04 16:23:11 -06008573 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12008574
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008575 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12008576}
Chris Forbes8f68b562015-05-25 11:13:32 +12008577
Chris Forbes35efec72016-04-21 14:32:08 +12008578TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
8579 m_errorMonitor->ExpectSuccess();
8580
8581 ASSERT_NO_FATAL_FAILURE(InitState());
8582 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8583
8584 if (!m_device->phy().features().tessellationShader) {
8585 printf("Device does not support 64bit vertex attributes; skipped.\n");
8586 return;
8587 }
8588
8589 VkVertexInputBindingDescription input_bindings[1];
8590 memset(input_bindings, 0, sizeof(input_bindings));
8591
8592 VkVertexInputAttributeDescription input_attribs[4];
8593 memset(input_attribs, 0, sizeof(input_attribs));
8594 input_attribs[0].location = 0;
8595 input_attribs[0].offset = 0;
8596 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8597 input_attribs[1].location = 2;
8598 input_attribs[1].offset = 32;
8599 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8600 input_attribs[2].location = 4;
8601 input_attribs[2].offset = 64;
8602 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8603 input_attribs[3].location = 6;
8604 input_attribs[3].offset = 96;
8605 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8606
8607 char const *vsSource =
8608 "#version 450\n"
8609 "\n"
8610 "layout(location=0) in dmat4 x;\n"
8611 "out gl_PerVertex {\n"
8612 " vec4 gl_Position;\n"
8613 "};\n"
8614 "void main(){\n"
8615 " gl_Position = vec4(x[0][0]);\n"
8616 "}\n";
8617 char const *fsSource =
8618 "#version 450\n"
8619 "\n"
8620 "layout(location=0) out vec4 color;\n"
8621 "void main(){\n"
8622 " color = vec4(1);\n"
8623 "}\n";
8624
8625 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8626 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8627
8628 VkPipelineObj pipe(m_device);
8629 pipe.AddColorAttachment();
8630 pipe.AddShader(&vs);
8631 pipe.AddShader(&fs);
8632
8633 pipe.AddVertexInputBindings(input_bindings, 1);
8634 pipe.AddVertexInputAttribs(input_attribs, 4);
8635
8636 VkDescriptorSetObj descriptorSet(m_device);
8637 descriptorSet.AppendDummy();
8638 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8639
8640 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8641
8642 m_errorMonitor->VerifyNotFound();
8643}
8644
Karl Schultz6addd812016-02-02 17:17:23 -07008645TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008647 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008648
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008649 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008650
8651 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008652 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008653 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008654 "out gl_PerVertex {\n"
8655 " vec4 gl_Position;\n"
8656 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008657 "void main(){\n"
8658 " gl_Position = vec4(1);\n"
8659 "}\n";
8660 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008661 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008662 "\n"
8663 "void main(){\n"
8664 "}\n";
8665
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008666 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8667 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008668
8669 VkPipelineObj pipe(m_device);
8670 pipe.AddShader(&vs);
8671 pipe.AddShader(&fs);
8672
Chia-I Wu08accc62015-07-07 11:50:03 +08008673 /* set up CB 0, not written */
8674 pipe.AddColorAttachment();
8675 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008676
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008677 VkDescriptorSetObj descriptorSet(m_device);
8678 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008679 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008680
Tony Barbour5781e8f2015-08-04 16:23:11 -06008681 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008682
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008683 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008684}
8685
Karl Schultz6addd812016-02-02 17:17:23 -07008686TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07008687 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008688 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008689 "FS writes to output location 1 with no matching attachment");
8690
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008691 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008692
8693 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008694 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008695 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008696 "out gl_PerVertex {\n"
8697 " vec4 gl_Position;\n"
8698 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008699 "void main(){\n"
8700 " gl_Position = vec4(1);\n"
8701 "}\n";
8702 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008703 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008704 "\n"
8705 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008706 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008707 "void main(){\n"
8708 " x = vec4(1);\n"
8709 " y = vec4(1);\n"
8710 "}\n";
8711
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008712 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8713 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008714
8715 VkPipelineObj pipe(m_device);
8716 pipe.AddShader(&vs);
8717 pipe.AddShader(&fs);
8718
Chia-I Wu08accc62015-07-07 11:50:03 +08008719 /* set up CB 0, not written */
8720 pipe.AddColorAttachment();
8721 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008722 /* FS writes CB 1, but we don't configure it */
8723
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008724 VkDescriptorSetObj descriptorSet(m_device);
8725 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008726 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008727
Tony Barbour5781e8f2015-08-04 16:23:11 -06008728 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008729
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008730 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008731}
8732
Karl Schultz6addd812016-02-02 17:17:23 -07008733TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008734 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008735 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008736
Chris Forbesa36d69e2015-05-25 11:13:44 +12008737 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008738
8739 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008740 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008741 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008742 "out gl_PerVertex {\n"
8743 " vec4 gl_Position;\n"
8744 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008745 "void main(){\n"
8746 " gl_Position = vec4(1);\n"
8747 "}\n";
8748 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008749 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008750 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008751 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12008752 "void main(){\n"
8753 " x = ivec4(1);\n"
8754 "}\n";
8755
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008756 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8757 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12008758
8759 VkPipelineObj pipe(m_device);
8760 pipe.AddShader(&vs);
8761 pipe.AddShader(&fs);
8762
Chia-I Wu08accc62015-07-07 11:50:03 +08008763 /* set up CB 0; type is UNORM by default */
8764 pipe.AddColorAttachment();
8765 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008766
Chris Forbesa36d69e2015-05-25 11:13:44 +12008767 VkDescriptorSetObj descriptorSet(m_device);
8768 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008769 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12008770
Tony Barbour5781e8f2015-08-04 16:23:11 -06008771 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008772
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008773 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12008774}
Chris Forbes7b1b8932015-06-05 14:43:36 +12008775
Karl Schultz6addd812016-02-02 17:17:23 -07008776TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008778 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008779
Chris Forbes556c76c2015-08-14 12:04:59 +12008780 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12008781
8782 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008783 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008784 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008785 "out gl_PerVertex {\n"
8786 " vec4 gl_Position;\n"
8787 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008788 "void main(){\n"
8789 " gl_Position = vec4(1);\n"
8790 "}\n";
8791 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008792 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008793 "\n"
8794 "layout(location=0) out vec4 x;\n"
8795 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
8796 "void main(){\n"
8797 " x = vec4(bar.y);\n"
8798 "}\n";
8799
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008800 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8801 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12008802
Chris Forbes556c76c2015-08-14 12:04:59 +12008803 VkPipelineObj pipe(m_device);
8804 pipe.AddShader(&vs);
8805 pipe.AddShader(&fs);
8806
8807 /* set up CB 0; type is UNORM by default */
8808 pipe.AddColorAttachment();
8809 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8810
8811 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008812 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12008813
8814 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8815
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008816 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12008817}
8818
Chris Forbes5c59e902016-02-26 16:56:09 +13008819TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
8820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8821 "not declared in layout");
8822
8823 ASSERT_NO_FATAL_FAILURE(InitState());
8824
8825 char const *vsSource =
8826 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13008827 "\n"
8828 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
8829 "out gl_PerVertex {\n"
8830 " vec4 gl_Position;\n"
8831 "};\n"
8832 "void main(){\n"
8833 " gl_Position = vec4(consts.x);\n"
8834 "}\n";
8835 char const *fsSource =
8836 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13008837 "\n"
8838 "layout(location=0) out vec4 x;\n"
8839 "void main(){\n"
8840 " x = vec4(1);\n"
8841 "}\n";
8842
8843 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8844 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8845
8846 VkPipelineObj pipe(m_device);
8847 pipe.AddShader(&vs);
8848 pipe.AddShader(&fs);
8849
8850 /* set up CB 0; type is UNORM by default */
8851 pipe.AddColorAttachment();
8852 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8853
8854 VkDescriptorSetObj descriptorSet(m_device);
8855 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8856
8857 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8858
8859 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008860 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13008861}
8862
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008863#endif // SHADER_CHECKER_TESTS
8864
8865#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06008866TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07008867 m_errorMonitor->SetDesiredFailureMsg(
8868 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008869 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008870
8871 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008872
8873 // Create an image
8874 VkImage image;
8875
Karl Schultz6addd812016-02-02 17:17:23 -07008876 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8877 const int32_t tex_width = 32;
8878 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008879
8880 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008881 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8882 image_create_info.pNext = NULL;
8883 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8884 image_create_info.format = tex_format;
8885 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008886 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07008887 image_create_info.extent.depth = 1;
8888 image_create_info.mipLevels = 1;
8889 image_create_info.arrayLayers = 1;
8890 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8891 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8892 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8893 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008894
8895 // Introduce error by sending down a bogus width extent
8896 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008897 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008898
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008899 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008900}
8901
Mark Youngc48c4c12016-04-11 14:26:49 -06008902TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
8903 m_errorMonitor->SetDesiredFailureMsg(
8904 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8905 "CreateImage extents is 0 for at least one required dimension");
8906
8907 ASSERT_NO_FATAL_FAILURE(InitState());
8908
8909 // Create an image
8910 VkImage image;
8911
8912 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8913 const int32_t tex_width = 32;
8914 const int32_t tex_height = 32;
8915
8916 VkImageCreateInfo image_create_info = {};
8917 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8918 image_create_info.pNext = NULL;
8919 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8920 image_create_info.format = tex_format;
8921 image_create_info.extent.width = tex_width;
8922 image_create_info.extent.height = tex_height;
8923 image_create_info.extent.depth = 1;
8924 image_create_info.mipLevels = 1;
8925 image_create_info.arrayLayers = 1;
8926 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8927 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8928 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8929 image_create_info.flags = 0;
8930
8931 // Introduce error by sending down a bogus width extent
8932 image_create_info.extent.width = 0;
8933 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8934
8935 m_errorMonitor->VerifyFound();
8936}
8937
Karl Schultz6addd812016-02-02 17:17:23 -07008938TEST_F(VkLayerTest, UpdateBufferAlignment) {
8939 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06008940
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008942 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008943
Mike Stroyana3082432015-09-25 13:39:21 -06008944 ASSERT_NO_FATAL_FAILURE(InitState());
8945
8946 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8947 vk_testing::Buffer buffer;
8948 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8949
8950 BeginCommandBuffer();
8951 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008952 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008953 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008954
Mike Stroyana3082432015-09-25 13:39:21 -06008955 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008957 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008958
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008959 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008960 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008961 EndCommandBuffer();
8962}
8963
Karl Schultz6addd812016-02-02 17:17:23 -07008964TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008966 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06008967
8968 ASSERT_NO_FATAL_FAILURE(InitState());
8969
8970 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8971 vk_testing::Buffer buffer;
8972 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8973
8974 BeginCommandBuffer();
8975 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008976 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008977 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008978
Mike Stroyana3082432015-09-25 13:39:21 -06008979 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008981 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008982
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008983 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008984
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008985 m_errorMonitor->VerifyFound();
8986
Mike Stroyana3082432015-09-25 13:39:21 -06008987 EndCommandBuffer();
8988}
8989
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008990#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12008991
Tobin Ehliscde08892015-09-22 10:11:37 -06008992#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07008993TEST_F(VkLayerTest, InvalidImageView) {
8994 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06008995
Karl Schultz6addd812016-02-02 17:17:23 -07008996 m_errorMonitor->SetDesiredFailureMsg(
8997 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008998 "vkCreateImageView called with baseMipLevel 10 ");
8999
Tobin Ehliscde08892015-09-22 10:11:37 -06009000 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06009001
Mike Stroyana3082432015-09-25 13:39:21 -06009002 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07009003 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06009004
Karl Schultz6addd812016-02-02 17:17:23 -07009005 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9006 const int32_t tex_width = 32;
9007 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06009008
9009 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009010 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9011 image_create_info.pNext = NULL;
9012 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9013 image_create_info.format = tex_format;
9014 image_create_info.extent.width = tex_width;
9015 image_create_info.extent.height = tex_height;
9016 image_create_info.extent.depth = 1;
9017 image_create_info.mipLevels = 1;
9018 image_create_info.arrayLayers = 1;
9019 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9020 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9021 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9022 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06009023
Chia-I Wuf7458c52015-10-26 21:10:41 +08009024 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06009025 ASSERT_VK_SUCCESS(err);
9026
9027 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009028 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9029 image_view_create_info.image = image;
9030 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
9031 image_view_create_info.format = tex_format;
9032 image_view_create_info.subresourceRange.layerCount = 1;
9033 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
9034 image_view_create_info.subresourceRange.levelCount = 1;
9035 image_view_create_info.subresourceRange.aspectMask =
9036 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06009037
9038 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07009039 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
9040 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06009041
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009042 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06009043}
Mike Stroyana3082432015-09-25 13:39:21 -06009044
Karl Schultz6addd812016-02-02 17:17:23 -07009045TEST_F(VkLayerTest, InvalidImageViewAspect) {
9046 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009047
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009049 "vkCreateImageView: Color image "
9050 "formats must have ONLY the "
9051 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009052
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009053 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009054
9055 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07009056 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009057
Karl Schultz6addd812016-02-02 17:17:23 -07009058 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9059 const int32_t tex_width = 32;
9060 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009061
9062 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009063 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9064 image_create_info.pNext = NULL;
9065 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9066 image_create_info.format = tex_format;
9067 image_create_info.extent.width = tex_width;
9068 image_create_info.extent.height = tex_height;
9069 image_create_info.extent.depth = 1;
9070 image_create_info.mipLevels = 1;
9071 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9072 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9073 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9074 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009075
Chia-I Wuf7458c52015-10-26 21:10:41 +08009076 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009077 ASSERT_VK_SUCCESS(err);
9078
9079 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009080 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9081 image_view_create_info.image = image;
9082 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
9083 image_view_create_info.format = tex_format;
9084 image_view_create_info.subresourceRange.baseMipLevel = 0;
9085 image_view_create_info.subresourceRange.levelCount = 1;
9086 // Cause an error by setting an invalid image aspect
9087 image_view_create_info.subresourceRange.aspectMask =
9088 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009089
9090 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07009091 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
9092 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009093
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009094 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009095}
9096
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009097TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07009098 VkResult err;
9099 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009100
Karl Schultz6addd812016-02-02 17:17:23 -07009101 m_errorMonitor->SetDesiredFailureMsg(
9102 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009103 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009104
Mike Stroyana3082432015-09-25 13:39:21 -06009105 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009106
9107 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009108 VkImage srcImage;
9109 VkImage dstImage;
9110 VkDeviceMemory srcMem;
9111 VkDeviceMemory destMem;
9112 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009113
9114 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009115 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9116 image_create_info.pNext = NULL;
9117 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9118 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9119 image_create_info.extent.width = 32;
9120 image_create_info.extent.height = 32;
9121 image_create_info.extent.depth = 1;
9122 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009123 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07009124 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9125 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9126 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9127 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009128
Karl Schultz6addd812016-02-02 17:17:23 -07009129 err =
9130 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009131 ASSERT_VK_SUCCESS(err);
9132
Karl Schultz6addd812016-02-02 17:17:23 -07009133 err =
9134 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009135 ASSERT_VK_SUCCESS(err);
9136
9137 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009138 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009139 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9140 memAlloc.pNext = NULL;
9141 memAlloc.allocationSize = 0;
9142 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009143
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009144 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009145 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009146 pass =
9147 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009148 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009149 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009150 ASSERT_VK_SUCCESS(err);
9151
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009152 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009153 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009154 pass =
9155 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009156 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009157 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009158 ASSERT_VK_SUCCESS(err);
9159
9160 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9161 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009162 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009163 ASSERT_VK_SUCCESS(err);
9164
9165 BeginCommandBuffer();
9166 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009167 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009168 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009169 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009170 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06009171 copyRegion.srcOffset.x = 0;
9172 copyRegion.srcOffset.y = 0;
9173 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009174 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009175 copyRegion.dstSubresource.mipLevel = 0;
9176 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009177 // Introduce failure by forcing the dst layerCount to differ from src
9178 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009179 copyRegion.dstOffset.x = 0;
9180 copyRegion.dstOffset.y = 0;
9181 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009182 copyRegion.extent.width = 1;
9183 copyRegion.extent.height = 1;
9184 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009185 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9186 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009187 EndCommandBuffer();
9188
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009189 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009190
Chia-I Wuf7458c52015-10-26 21:10:41 +08009191 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009192 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009193 vkFreeMemory(m_device->device(), srcMem, NULL);
9194 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009195}
9196
Tony Barbourd6673642016-05-05 14:46:39 -06009197TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
9198
9199 TEST_DESCRIPTION("Creating images with unsuported formats ");
9200
9201 ASSERT_NO_FATAL_FAILURE(InitState());
9202 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9203 VkImageObj image(m_device);
9204 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9205 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
9206 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
9207 VK_IMAGE_TILING_OPTIMAL, 0);
9208 ASSERT_TRUE(image.initialized());
9209
9210 VkFormat unsupported = VK_FORMAT_UNDEFINED;
9211 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9212 VkFormat format = static_cast<VkFormat>(f);
9213 VkFormatProperties fProps = m_device->format_properties(format);
9214 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
9215 fProps.optimalTilingFeatures == 0) {
9216 unsupported = format;
9217 break;
9218 }
9219 }
9220 if (unsupported != VK_FORMAT_UNDEFINED) {
9221 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9222 "vkCreateImage parameter, "
9223 "VkFormat pCreateInfo->format, "
9224 "contains unsupported format");
9225 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
9226 VkImageCreateInfo image_create_info;
9227 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9228 image_create_info.pNext = NULL;
9229 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9230 image_create_info.format = unsupported;
9231 image_create_info.extent.width = 32;
9232 image_create_info.extent.height = 32;
9233 image_create_info.extent.depth = 1;
9234 image_create_info.mipLevels = 1;
9235 image_create_info.arrayLayers = 1;
9236 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9237 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9238 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9239 image_create_info.flags = 0;
9240
9241 VkImage localImage;
9242 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
9243 m_errorMonitor->VerifyFound();
9244
9245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9246 "vkCreateRenderPass parameter, "
9247 "VkFormat in "
9248 "pCreateInfo->pAttachments");
9249 // Create renderpass with unsupported format - Expect FORMAT_UNSUPPORTED
9250 VkAttachmentDescription att;
9251 att.format = unsupported;
9252 att.samples = VK_SAMPLE_COUNT_1_BIT;
9253 att.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
9254 att.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
9255 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
9256 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
9257 att.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9258 att.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9259
9260 VkRenderPassCreateInfo rp_info = {};
9261 VkRenderPass rp;
9262 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9263 rp_info.attachmentCount = 1;
9264 rp_info.pAttachments = &att;
9265 rp_info.subpassCount = 0;
9266 rp_info.pSubpasses = NULL;
9267 vkCreateRenderPass(m_device->handle(), &rp_info, NULL, &rp);
9268 m_errorMonitor->VerifyFound();
9269 }
9270}
9271
9272TEST_F(VkLayerTest, ImageLayerViewTests) {
9273 VkResult ret;
9274 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
9275
9276 ASSERT_NO_FATAL_FAILURE(InitState());
9277
9278 VkImageObj image(m_device);
9279 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9280 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
9281 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
9282 VK_IMAGE_TILING_OPTIMAL, 0);
9283 ASSERT_TRUE(image.initialized());
9284
9285 VkImageView imgView;
9286 VkImageViewCreateInfo imgViewInfo = {};
9287 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9288 imgViewInfo.image = image.handle();
9289 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
9290 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9291 imgViewInfo.subresourceRange.layerCount = 1;
9292 imgViewInfo.subresourceRange.baseMipLevel = 0;
9293 imgViewInfo.subresourceRange.levelCount = 1;
9294 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9295
9296 m_errorMonitor->SetDesiredFailureMsg(
9297 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9298 "vkCreateImageView called with baseMipLevel");
9299 // View can't have baseMipLevel >= image's mipLevels - Expect
9300 // VIEW_CREATE_ERROR
9301 imgViewInfo.subresourceRange.baseMipLevel = 1;
9302 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9303 m_errorMonitor->VerifyFound();
9304 imgViewInfo.subresourceRange.baseMipLevel = 0;
9305
9306 m_errorMonitor->SetDesiredFailureMsg(
9307 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9308 "vkCreateImageView called with baseArrayLayer");
9309 // View can't have baseArrayLayer >= image's arraySize - Expect
9310 // VIEW_CREATE_ERROR
9311 imgViewInfo.subresourceRange.baseArrayLayer = 1;
9312 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9313 m_errorMonitor->VerifyFound();
9314 imgViewInfo.subresourceRange.baseArrayLayer = 0;
9315
9316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9317 "vkCreateImageView called with 0 in "
9318 "pCreateInfo->subresourceRange."
9319 "levelCount");
9320 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
9321 imgViewInfo.subresourceRange.levelCount = 0;
9322 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9323 m_errorMonitor->VerifyFound();
9324 imgViewInfo.subresourceRange.levelCount = 1;
9325
9326 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9327 "vkCreateImageView called with 0 in "
9328 "pCreateInfo->subresourceRange."
9329 "layerCount");
9330 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
9331 imgViewInfo.subresourceRange.layerCount = 0;
9332 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9333 m_errorMonitor->VerifyFound();
9334 imgViewInfo.subresourceRange.layerCount = 1;
9335
9336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9337 "but both must be color formats");
9338 // Can't use depth format for view into color image - Expect INVALID_FORMAT
9339 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
9340 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9341 m_errorMonitor->VerifyFound();
9342 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9343
9344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9345 "Formats MUST be IDENTICAL unless "
9346 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
9347 "was set on image creation.");
9348 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
9349 // VIEW_CREATE_ERROR
9350 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
9351 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9352 m_errorMonitor->VerifyFound();
9353 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9354
9355 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9356 "can support ImageViews with "
9357 "differing formats but they must be "
9358 "in the same compatibility class.");
9359 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
9360 // VIEW_CREATE_ERROR
9361 VkImageCreateInfo mutImgInfo = image.create_info();
9362 VkImage mutImage;
9363 mutImgInfo.format = VK_FORMAT_R8_UINT;
9364 assert(
9365 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
9366 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
9367 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
9368 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9369 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
9370 ASSERT_VK_SUCCESS(ret);
9371 imgViewInfo.image = mutImage;
9372 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9373 m_errorMonitor->VerifyFound();
9374 imgViewInfo.image = image.handle();
9375 vkDestroyImage(m_device->handle(), mutImage, NULL);
9376}
9377
9378TEST_F(VkLayerTest, MiscImageLayerTests) {
9379
9380 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
9381
9382 ASSERT_NO_FATAL_FAILURE(InitState());
9383
9384 VkImageObj image(m_device);
9385 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9386 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
9387 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
9388 VK_IMAGE_TILING_OPTIMAL, 0);
9389 ASSERT_TRUE(image.initialized());
9390
9391 m_errorMonitor->SetDesiredFailureMsg(
9392 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9393 "number of layers in image subresource is zero");
9394 vk_testing::Buffer buffer;
9395 VkMemoryPropertyFlags reqs = 0;
9396 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
9397 VkBufferImageCopy region = {};
9398 region.bufferRowLength = 128;
9399 region.bufferImageHeight = 128;
9400 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9401 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
9402 region.imageSubresource.layerCount = 0;
9403 region.imageExtent.height = 4;
9404 region.imageExtent.width = 4;
9405 region.imageExtent.depth = 1;
9406 m_commandBuffer->BeginCommandBuffer();
9407 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
9408 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
9409 1, &region);
9410 m_errorMonitor->VerifyFound();
9411 region.imageSubresource.layerCount = 1;
9412
9413 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9414 "aspectMasks for each region must "
9415 "specify only COLOR or DEPTH or "
9416 "STENCIL");
9417 // Expect MISMATCHED_IMAGE_ASPECT
9418 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
9419 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
9420 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
9421 1, &region);
9422 m_errorMonitor->VerifyFound();
9423 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9424
9425 m_errorMonitor->SetDesiredFailureMsg(
9426 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9427 "If the format of srcImage is a depth, stencil, depth stencil or "
9428 "integer-based format then filter must be VK_FILTER_NEAREST");
9429 // Expect INVALID_FILTER
9430 VkImageObj intImage1(m_device);
9431 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
9432 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
9433 0);
9434 VkImageObj intImage2(m_device);
9435 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
9436 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
9437 0);
9438 VkImageBlit blitRegion = {};
9439 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9440 blitRegion.srcSubresource.baseArrayLayer = 0;
9441 blitRegion.srcSubresource.layerCount = 1;
9442 blitRegion.srcSubresource.mipLevel = 0;
9443 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9444 blitRegion.dstSubresource.baseArrayLayer = 0;
9445 blitRegion.dstSubresource.layerCount = 1;
9446 blitRegion.dstSubresource.mipLevel = 0;
9447
9448 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
9449 intImage1.layout(), intImage2.handle(), intImage2.layout(),
9450 16, &blitRegion, VK_FILTER_LINEAR);
9451 m_errorMonitor->VerifyFound();
9452
9453 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9454 "called with 0 in ppMemoryBarriers");
9455 VkImageMemoryBarrier img_barrier;
9456 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9457 img_barrier.pNext = NULL;
9458 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9459 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9460 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9461 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9462 img_barrier.image = image.handle();
9463 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9464 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9465 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9466 img_barrier.subresourceRange.baseArrayLayer = 0;
9467 img_barrier.subresourceRange.baseMipLevel = 0;
9468 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
9469 img_barrier.subresourceRange.layerCount = 0;
9470 img_barrier.subresourceRange.levelCount = 1;
9471 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9472 VK_PIPELINE_STAGE_HOST_BIT,
9473 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9474 nullptr, 1, &img_barrier);
9475 m_errorMonitor->VerifyFound();
9476 img_barrier.subresourceRange.layerCount = 1;
9477}
9478
9479TEST_F(VkLayerTest, ImageFormatLimits) {
9480
9481 TEST_DESCRIPTION("Exceed the limits of image format ");
9482
9483 m_errorMonitor->SetDesiredFailureMsg(
9484 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9485 "CreateImage extents exceed allowable limits for format");
9486 VkImageCreateInfo image_create_info = {};
9487 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9488 image_create_info.pNext = NULL;
9489 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9490 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9491 image_create_info.extent.width = 32;
9492 image_create_info.extent.height = 32;
9493 image_create_info.extent.depth = 1;
9494 image_create_info.mipLevels = 1;
9495 image_create_info.arrayLayers = 1;
9496 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9497 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9498 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9499 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9500 image_create_info.flags = 0;
9501
9502 VkImage nullImg;
9503 VkImageFormatProperties imgFmtProps;
9504 vkGetPhysicalDeviceImageFormatProperties(
9505 gpu(), image_create_info.format, image_create_info.imageType,
9506 image_create_info.tiling, image_create_info.usage,
9507 image_create_info.flags, &imgFmtProps);
9508 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
9509 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9510 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9511 m_errorMonitor->VerifyFound();
9512 image_create_info.extent.depth = 1;
9513
9514 m_errorMonitor->SetDesiredFailureMsg(
9515 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9516 "exceeds allowable maximum supported by format of");
9517 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
9518 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9519 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9520 m_errorMonitor->VerifyFound();
9521 image_create_info.mipLevels = 1;
9522
9523 m_errorMonitor->SetDesiredFailureMsg(
9524 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9525 "exceeds allowable maximum supported by format of");
9526 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
9527 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9528 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9529 m_errorMonitor->VerifyFound();
9530 image_create_info.arrayLayers = 1;
9531
9532 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9533 "is not supported by format");
9534 int samples = imgFmtProps.sampleCounts >> 1;
9535 image_create_info.samples = (VkSampleCountFlagBits)samples;
9536 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9537 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9538 m_errorMonitor->VerifyFound();
9539 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9540
9541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9542 "pCreateInfo->initialLayout, must be "
9543 "VK_IMAGE_LAYOUT_UNDEFINED or "
9544 "VK_IMAGE_LAYOUT_PREINITIALIZED");
9545 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9546 // Expect INVALID_LAYOUT
9547 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9548 m_errorMonitor->VerifyFound();
9549 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9550}
9551
Karl Schultz6addd812016-02-02 17:17:23 -07009552TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06009553 VkResult err;
9554 bool pass;
9555
9556 // Create color images with different format sizes and try to copy between them
9557 m_errorMonitor->SetDesiredFailureMsg(
9558 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9559 "vkCmdCopyImage called with unmatched source and dest image format sizes");
9560
9561 ASSERT_NO_FATAL_FAILURE(InitState());
9562
9563 // Create two images of different types and try to copy between them
9564 VkImage srcImage;
9565 VkImage dstImage;
9566 VkDeviceMemory srcMem;
9567 VkDeviceMemory destMem;
9568 VkMemoryRequirements memReqs;
9569
9570 VkImageCreateInfo image_create_info = {};
9571 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9572 image_create_info.pNext = NULL;
9573 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9574 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9575 image_create_info.extent.width = 32;
9576 image_create_info.extent.height = 32;
9577 image_create_info.extent.depth = 1;
9578 image_create_info.mipLevels = 1;
9579 image_create_info.arrayLayers = 1;
9580 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9581 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9582 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9583 image_create_info.flags = 0;
9584
9585 err =
9586 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
9587 ASSERT_VK_SUCCESS(err);
9588
9589 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
9590 // Introduce failure by creating second image with a different-sized format.
9591 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
9592
9593 err =
9594 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
9595 ASSERT_VK_SUCCESS(err);
9596
9597 // Allocate memory
9598 VkMemoryAllocateInfo memAlloc = {};
9599 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9600 memAlloc.pNext = NULL;
9601 memAlloc.allocationSize = 0;
9602 memAlloc.memoryTypeIndex = 0;
9603
9604 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
9605 memAlloc.allocationSize = memReqs.size;
9606 pass =
9607 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
9608 ASSERT_TRUE(pass);
9609 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
9610 ASSERT_VK_SUCCESS(err);
9611
9612 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
9613 memAlloc.allocationSize = memReqs.size;
9614 pass =
9615 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
9616 ASSERT_TRUE(pass);
9617 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
9618 ASSERT_VK_SUCCESS(err);
9619
9620 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9621 ASSERT_VK_SUCCESS(err);
9622 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
9623 ASSERT_VK_SUCCESS(err);
9624
9625 BeginCommandBuffer();
9626 VkImageCopy copyRegion;
9627 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9628 copyRegion.srcSubresource.mipLevel = 0;
9629 copyRegion.srcSubresource.baseArrayLayer = 0;
9630 copyRegion.srcSubresource.layerCount = 0;
9631 copyRegion.srcOffset.x = 0;
9632 copyRegion.srcOffset.y = 0;
9633 copyRegion.srcOffset.z = 0;
9634 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9635 copyRegion.dstSubresource.mipLevel = 0;
9636 copyRegion.dstSubresource.baseArrayLayer = 0;
9637 copyRegion.dstSubresource.layerCount = 0;
9638 copyRegion.dstOffset.x = 0;
9639 copyRegion.dstOffset.y = 0;
9640 copyRegion.dstOffset.z = 0;
9641 copyRegion.extent.width = 1;
9642 copyRegion.extent.height = 1;
9643 copyRegion.extent.depth = 1;
9644 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9645 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
9646 EndCommandBuffer();
9647
9648 m_errorMonitor->VerifyFound();
9649
9650 vkDestroyImage(m_device->device(), srcImage, NULL);
9651 vkDestroyImage(m_device->device(), dstImage, NULL);
9652 vkFreeMemory(m_device->device(), srcMem, NULL);
9653 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009654}
9655
Karl Schultz6addd812016-02-02 17:17:23 -07009656TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
9657 VkResult err;
9658 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009659
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009660 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009661 m_errorMonitor->SetDesiredFailureMsg(
9662 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009663 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009664
Mike Stroyana3082432015-09-25 13:39:21 -06009665 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009666
9667 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009668 VkImage srcImage;
9669 VkImage dstImage;
9670 VkDeviceMemory srcMem;
9671 VkDeviceMemory destMem;
9672 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009673
9674 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009675 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9676 image_create_info.pNext = NULL;
9677 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9678 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9679 image_create_info.extent.width = 32;
9680 image_create_info.extent.height = 32;
9681 image_create_info.extent.depth = 1;
9682 image_create_info.mipLevels = 1;
9683 image_create_info.arrayLayers = 1;
9684 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9685 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9686 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9687 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009688
Karl Schultz6addd812016-02-02 17:17:23 -07009689 err =
9690 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009691 ASSERT_VK_SUCCESS(err);
9692
Karl Schultzbdb75952016-04-19 11:36:49 -06009693 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
9694
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009695 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07009696 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009697 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
9698 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009699
Karl Schultz6addd812016-02-02 17:17:23 -07009700 err =
9701 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009702 ASSERT_VK_SUCCESS(err);
9703
9704 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009705 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009706 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9707 memAlloc.pNext = NULL;
9708 memAlloc.allocationSize = 0;
9709 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009710
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009711 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009712 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009713 pass =
9714 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009715 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009716 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009717 ASSERT_VK_SUCCESS(err);
9718
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009719 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009720 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009721 pass =
9722 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009723 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009724 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009725 ASSERT_VK_SUCCESS(err);
9726
9727 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9728 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009729 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009730 ASSERT_VK_SUCCESS(err);
9731
9732 BeginCommandBuffer();
9733 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009734 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009735 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009736 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009737 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009738 copyRegion.srcOffset.x = 0;
9739 copyRegion.srcOffset.y = 0;
9740 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009741 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009742 copyRegion.dstSubresource.mipLevel = 0;
9743 copyRegion.dstSubresource.baseArrayLayer = 0;
9744 copyRegion.dstSubresource.layerCount = 0;
9745 copyRegion.dstOffset.x = 0;
9746 copyRegion.dstOffset.y = 0;
9747 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009748 copyRegion.extent.width = 1;
9749 copyRegion.extent.height = 1;
9750 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009751 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9752 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009753 EndCommandBuffer();
9754
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009755 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009756
Chia-I Wuf7458c52015-10-26 21:10:41 +08009757 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009758 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009759 vkFreeMemory(m_device->device(), srcMem, NULL);
9760 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009761}
9762
Karl Schultz6addd812016-02-02 17:17:23 -07009763TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
9764 VkResult err;
9765 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009766
Karl Schultz6addd812016-02-02 17:17:23 -07009767 m_errorMonitor->SetDesiredFailureMsg(
9768 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009769 "vkCmdResolveImage called with source sample count less than 2.");
9770
Mike Stroyana3082432015-09-25 13:39:21 -06009771 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009772
9773 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07009774 VkImage srcImage;
9775 VkImage dstImage;
9776 VkDeviceMemory srcMem;
9777 VkDeviceMemory destMem;
9778 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009779
9780 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009781 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9782 image_create_info.pNext = NULL;
9783 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9784 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9785 image_create_info.extent.width = 32;
9786 image_create_info.extent.height = 1;
9787 image_create_info.extent.depth = 1;
9788 image_create_info.mipLevels = 1;
9789 image_create_info.arrayLayers = 1;
9790 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9791 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9792 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9793 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009794
Karl Schultz6addd812016-02-02 17:17:23 -07009795 err =
9796 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009797 ASSERT_VK_SUCCESS(err);
9798
Karl Schultz6addd812016-02-02 17:17:23 -07009799 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009800
Karl Schultz6addd812016-02-02 17:17:23 -07009801 err =
9802 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009803 ASSERT_VK_SUCCESS(err);
9804
9805 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009806 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009807 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9808 memAlloc.pNext = NULL;
9809 memAlloc.allocationSize = 0;
9810 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009811
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009812 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009813 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009814 pass =
9815 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009816 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009817 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009818 ASSERT_VK_SUCCESS(err);
9819
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009820 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009821 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009822 pass =
9823 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009824 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009825 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009826 ASSERT_VK_SUCCESS(err);
9827
9828 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9829 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009830 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009831 ASSERT_VK_SUCCESS(err);
9832
9833 BeginCommandBuffer();
9834 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009835 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9836 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009837 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009838 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009839 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009840 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009841 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009842 resolveRegion.srcOffset.x = 0;
9843 resolveRegion.srcOffset.y = 0;
9844 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009845 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009846 resolveRegion.dstSubresource.mipLevel = 0;
9847 resolveRegion.dstSubresource.baseArrayLayer = 0;
9848 resolveRegion.dstSubresource.layerCount = 0;
9849 resolveRegion.dstOffset.x = 0;
9850 resolveRegion.dstOffset.y = 0;
9851 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009852 resolveRegion.extent.width = 1;
9853 resolveRegion.extent.height = 1;
9854 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009855 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9856 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009857 EndCommandBuffer();
9858
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009859 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009860
Chia-I Wuf7458c52015-10-26 21:10:41 +08009861 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009862 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009863 vkFreeMemory(m_device->device(), srcMem, NULL);
9864 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009865}
9866
Karl Schultz6addd812016-02-02 17:17:23 -07009867TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
9868 VkResult err;
9869 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009870
Karl Schultz6addd812016-02-02 17:17:23 -07009871 m_errorMonitor->SetDesiredFailureMsg(
9872 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009873 "vkCmdResolveImage called with dest sample count greater than 1.");
9874
Mike Stroyana3082432015-09-25 13:39:21 -06009875 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009876
Chris Forbesa7530692016-05-08 12:35:39 +12009877 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07009878 VkImage srcImage;
9879 VkImage dstImage;
9880 VkDeviceMemory srcMem;
9881 VkDeviceMemory destMem;
9882 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009883
9884 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009885 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9886 image_create_info.pNext = NULL;
9887 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9888 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9889 image_create_info.extent.width = 32;
9890 image_create_info.extent.height = 1;
9891 image_create_info.extent.depth = 1;
9892 image_create_info.mipLevels = 1;
9893 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +12009894 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07009895 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9896 // Note: Some implementations expect color attachment usage for any
9897 // multisample surface
9898 image_create_info.usage =
9899 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9900 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009901
Karl Schultz6addd812016-02-02 17:17:23 -07009902 err =
9903 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009904 ASSERT_VK_SUCCESS(err);
9905
Karl Schultz6addd812016-02-02 17:17:23 -07009906 // Note: Some implementations expect color attachment usage for any
9907 // multisample surface
9908 image_create_info.usage =
9909 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009910
Karl Schultz6addd812016-02-02 17:17:23 -07009911 err =
9912 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009913 ASSERT_VK_SUCCESS(err);
9914
9915 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009916 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009917 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9918 memAlloc.pNext = NULL;
9919 memAlloc.allocationSize = 0;
9920 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009921
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009922 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009923 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009924 pass =
9925 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009926 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009927 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009928 ASSERT_VK_SUCCESS(err);
9929
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009930 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009931 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009932 pass =
9933 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009934 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009935 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009936 ASSERT_VK_SUCCESS(err);
9937
9938 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9939 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009940 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009941 ASSERT_VK_SUCCESS(err);
9942
9943 BeginCommandBuffer();
9944 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009945 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9946 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009947 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009948 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009949 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009950 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009951 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009952 resolveRegion.srcOffset.x = 0;
9953 resolveRegion.srcOffset.y = 0;
9954 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009955 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009956 resolveRegion.dstSubresource.mipLevel = 0;
9957 resolveRegion.dstSubresource.baseArrayLayer = 0;
9958 resolveRegion.dstSubresource.layerCount = 0;
9959 resolveRegion.dstOffset.x = 0;
9960 resolveRegion.dstOffset.y = 0;
9961 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009962 resolveRegion.extent.width = 1;
9963 resolveRegion.extent.height = 1;
9964 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009965 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9966 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009967 EndCommandBuffer();
9968
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009969 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009970
Chia-I Wuf7458c52015-10-26 21:10:41 +08009971 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009972 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009973 vkFreeMemory(m_device->device(), srcMem, NULL);
9974 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009975}
9976
Karl Schultz6addd812016-02-02 17:17:23 -07009977TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
9978 VkResult err;
9979 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009980
Karl Schultz6addd812016-02-02 17:17:23 -07009981 m_errorMonitor->SetDesiredFailureMsg(
9982 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009983 "vkCmdResolveImage called with unmatched source and dest formats.");
9984
Mike Stroyana3082432015-09-25 13:39:21 -06009985 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009986
9987 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009988 VkImage srcImage;
9989 VkImage dstImage;
9990 VkDeviceMemory srcMem;
9991 VkDeviceMemory destMem;
9992 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009993
9994 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009995 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9996 image_create_info.pNext = NULL;
9997 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9998 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9999 image_create_info.extent.width = 32;
10000 image_create_info.extent.height = 1;
10001 image_create_info.extent.depth = 1;
10002 image_create_info.mipLevels = 1;
10003 image_create_info.arrayLayers = 1;
10004 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
10005 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10006 // Note: Some implementations expect color attachment usage for any
10007 // multisample surface
10008 image_create_info.usage =
10009 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10010 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010011
Karl Schultz6addd812016-02-02 17:17:23 -070010012 err =
10013 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010014 ASSERT_VK_SUCCESS(err);
10015
Karl Schultz6addd812016-02-02 17:17:23 -070010016 // Set format to something other than source image
10017 image_create_info.format = VK_FORMAT_R32_SFLOAT;
10018 // Note: Some implementations expect color attachment usage for any
10019 // multisample surface
10020 image_create_info.usage =
10021 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10022 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010023
Karl Schultz6addd812016-02-02 17:17:23 -070010024 err =
10025 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010026 ASSERT_VK_SUCCESS(err);
10027
10028 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010029 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010030 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10031 memAlloc.pNext = NULL;
10032 memAlloc.allocationSize = 0;
10033 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010034
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060010035 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010036 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010037 pass =
10038 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010039 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010040 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010041 ASSERT_VK_SUCCESS(err);
10042
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010043 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010044 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010045 pass =
10046 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010047 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010048 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010049 ASSERT_VK_SUCCESS(err);
10050
10051 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10052 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010053 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060010054 ASSERT_VK_SUCCESS(err);
10055
10056 BeginCommandBuffer();
10057 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070010058 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
10059 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060010060 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010061 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010062 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060010063 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010064 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010065 resolveRegion.srcOffset.x = 0;
10066 resolveRegion.srcOffset.y = 0;
10067 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010068 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010069 resolveRegion.dstSubresource.mipLevel = 0;
10070 resolveRegion.dstSubresource.baseArrayLayer = 0;
10071 resolveRegion.dstSubresource.layerCount = 0;
10072 resolveRegion.dstOffset.x = 0;
10073 resolveRegion.dstOffset.y = 0;
10074 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010075 resolveRegion.extent.width = 1;
10076 resolveRegion.extent.height = 1;
10077 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070010078 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10079 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060010080 EndCommandBuffer();
10081
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010082 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060010083
Chia-I Wuf7458c52015-10-26 21:10:41 +080010084 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010085 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010086 vkFreeMemory(m_device->device(), srcMem, NULL);
10087 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010088}
10089
Karl Schultz6addd812016-02-02 17:17:23 -070010090TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
10091 VkResult err;
10092 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060010093
Karl Schultz6addd812016-02-02 17:17:23 -070010094 m_errorMonitor->SetDesiredFailureMsg(
10095 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010096 "vkCmdResolveImage called with unmatched source and dest image types.");
10097
Mike Stroyana3082432015-09-25 13:39:21 -060010098 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060010099
10100 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070010101 VkImage srcImage;
10102 VkImage dstImage;
10103 VkDeviceMemory srcMem;
10104 VkDeviceMemory destMem;
10105 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060010106
10107 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010108 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10109 image_create_info.pNext = NULL;
10110 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10111 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10112 image_create_info.extent.width = 32;
10113 image_create_info.extent.height = 1;
10114 image_create_info.extent.depth = 1;
10115 image_create_info.mipLevels = 1;
10116 image_create_info.arrayLayers = 1;
10117 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
10118 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10119 // Note: Some implementations expect color attachment usage for any
10120 // multisample surface
10121 image_create_info.usage =
10122 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10123 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010124
Karl Schultz6addd812016-02-02 17:17:23 -070010125 err =
10126 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010127 ASSERT_VK_SUCCESS(err);
10128
Karl Schultz6addd812016-02-02 17:17:23 -070010129 image_create_info.imageType = VK_IMAGE_TYPE_1D;
10130 // Note: Some implementations expect color attachment usage for any
10131 // multisample surface
10132 image_create_info.usage =
10133 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10134 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010135
Karl Schultz6addd812016-02-02 17:17:23 -070010136 err =
10137 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010138 ASSERT_VK_SUCCESS(err);
10139
10140 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010141 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010142 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10143 memAlloc.pNext = NULL;
10144 memAlloc.allocationSize = 0;
10145 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010146
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060010147 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010148 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010149 pass =
10150 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010151 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010152 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010153 ASSERT_VK_SUCCESS(err);
10154
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010155 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010156 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010157 pass =
10158 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010159 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010160 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010161 ASSERT_VK_SUCCESS(err);
10162
10163 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10164 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010165 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060010166 ASSERT_VK_SUCCESS(err);
10167
10168 BeginCommandBuffer();
10169 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070010170 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
10171 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060010172 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010173 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010174 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060010175 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010176 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010177 resolveRegion.srcOffset.x = 0;
10178 resolveRegion.srcOffset.y = 0;
10179 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010180 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010181 resolveRegion.dstSubresource.mipLevel = 0;
10182 resolveRegion.dstSubresource.baseArrayLayer = 0;
10183 resolveRegion.dstSubresource.layerCount = 0;
10184 resolveRegion.dstOffset.x = 0;
10185 resolveRegion.dstOffset.y = 0;
10186 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010187 resolveRegion.extent.width = 1;
10188 resolveRegion.extent.height = 1;
10189 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070010190 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10191 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060010192 EndCommandBuffer();
10193
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010194 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060010195
Chia-I Wuf7458c52015-10-26 21:10:41 +080010196 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010197 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010198 vkFreeMemory(m_device->device(), srcMem, NULL);
10199 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010200}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010201
Karl Schultz6addd812016-02-02 17:17:23 -070010202TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010203 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070010204 // to using a DS format, then cause it to hit error due to COLOR_BIT not
10205 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010206 // The image format check comes 2nd in validation so we trigger it first,
10207 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070010208 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010209
Karl Schultz6addd812016-02-02 17:17:23 -070010210 m_errorMonitor->SetDesiredFailureMsg(
10211 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010212 "Combination depth/stencil image formats can have only the ");
10213
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010214 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010215
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010216 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010217 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
10218 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010219
10220 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010221 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10222 ds_pool_ci.pNext = NULL;
10223 ds_pool_ci.maxSets = 1;
10224 ds_pool_ci.poolSizeCount = 1;
10225 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010226
10227 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010228 err =
10229 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010230 ASSERT_VK_SUCCESS(err);
10231
10232 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010233 dsl_binding.binding = 0;
10234 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
10235 dsl_binding.descriptorCount = 1;
10236 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10237 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010238
10239 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010240 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10241 ds_layout_ci.pNext = NULL;
10242 ds_layout_ci.bindingCount = 1;
10243 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010244 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010245 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10246 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010247 ASSERT_VK_SUCCESS(err);
10248
10249 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010250 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010251 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010252 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010253 alloc_info.descriptorPool = ds_pool;
10254 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010255 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10256 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010257 ASSERT_VK_SUCCESS(err);
10258
Karl Schultz6addd812016-02-02 17:17:23 -070010259 VkImage image_bad;
10260 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010261 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -070010262 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010263 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070010264 const int32_t tex_width = 32;
10265 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010266
10267 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010268 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10269 image_create_info.pNext = NULL;
10270 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10271 image_create_info.format = tex_format_bad;
10272 image_create_info.extent.width = tex_width;
10273 image_create_info.extent.height = tex_height;
10274 image_create_info.extent.depth = 1;
10275 image_create_info.mipLevels = 1;
10276 image_create_info.arrayLayers = 1;
10277 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10278 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10279 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
10280 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
10281 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010282
Karl Schultz6addd812016-02-02 17:17:23 -070010283 err =
10284 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010285 ASSERT_VK_SUCCESS(err);
10286 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070010287 image_create_info.usage =
10288 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10289 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
10290 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010291 ASSERT_VK_SUCCESS(err);
10292
10293 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010294 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10295 image_view_create_info.image = image_bad;
10296 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
10297 image_view_create_info.format = tex_format_bad;
10298 image_view_create_info.subresourceRange.baseArrayLayer = 0;
10299 image_view_create_info.subresourceRange.baseMipLevel = 0;
10300 image_view_create_info.subresourceRange.layerCount = 1;
10301 image_view_create_info.subresourceRange.levelCount = 1;
10302 image_view_create_info.subresourceRange.aspectMask =
10303 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010304
10305 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070010306 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
10307 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010308
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010309 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010310
Chia-I Wuf7458c52015-10-26 21:10:41 +080010311 vkDestroyImage(m_device->device(), image_bad, NULL);
10312 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010313 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10314 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010315}
Tobin Ehliscde08892015-09-22 10:11:37 -060010316#endif // IMAGE_TESTS
10317
Tony Barbour300a6082015-04-07 13:44:53 -060010318int main(int argc, char **argv) {
10319 int result;
10320
Cody Northrop8e54a402016-03-08 22:25:52 -070010321#ifdef ANDROID
10322 int vulkanSupport = InitVulkan();
10323 if (vulkanSupport == 0)
10324 return 1;
10325#endif
10326
Tony Barbour300a6082015-04-07 13:44:53 -060010327 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060010328 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060010329
10330 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
10331
10332 result = RUN_ALL_TESTS();
10333
Tony Barbour6918cd52015-04-09 12:58:51 -060010334 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060010335 return result;
10336}