blob: 9e8647f7c4876edb9cad07f5a281e14afb5dc664 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
20 */
Tony Barbour65c48b32015-11-17 10:02:56 -070021
Cody Northrop8e54a402016-03-08 22:25:52 -070022#ifdef ANDROID
23#include "vulkan_wrapper.h"
24#else
David Pinedo9316d3b2015-11-06 12:54:48 -070025#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070026#endif
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060027#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060028#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060029#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070030#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060031
Mark Lobodzinski3780e142015-05-14 15:08:13 -050032#define GLM_FORCE_RADIANS
33#include "glm/glm.hpp"
34#include <glm/gtc/matrix_transform.hpp>
35
Dustin Gravesffa90fa2016-05-06 11:20:38 -060036#define PARAMETER_VALIDATION_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060037#define MEM_TRACKER_TESTS 1
38#define OBJ_TRACKER_TESTS 1
39#define DRAW_STATE_TESTS 1
40#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120041#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060042#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060043#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060044
Mark Lobodzinski3780e142015-05-14 15:08:13 -050045//--------------------------------------------------------------------------------------
46// Mesh and VertexFormat Data
47//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070048struct Vertex {
49 float posX, posY, posZ, posW; // Position data
50 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050051};
52
Karl Schultz6addd812016-02-02 17:17:23 -070053#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050054
55typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070056 BsoFailNone = 0x00000000,
57 BsoFailLineWidth = 0x00000001,
58 BsoFailDepthBias = 0x00000002,
59 BsoFailViewport = 0x00000004,
60 BsoFailScissor = 0x00000008,
61 BsoFailBlend = 0x00000010,
62 BsoFailDepthBounds = 0x00000020,
63 BsoFailStencilReadMask = 0x00000040,
64 BsoFailStencilWriteMask = 0x00000080,
65 BsoFailStencilReference = 0x00000100,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050066} BsoFailSelect;
67
68struct vktriangle_vs_uniform {
69 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070070 float mvp[4][4];
71 float position[3][4];
72 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050073};
74
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050075static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120076 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070077 "vec2 vertices[3];\n"
78 "out gl_PerVertex {\n"
79 " vec4 gl_Position;\n"
80 "};\n"
81 "void main() {\n"
82 " vertices[0] = vec2(-1.0, -1.0);\n"
83 " vertices[1] = vec2( 1.0, -1.0);\n"
84 " vertices[2] = vec2( 0.0, 1.0);\n"
85 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
86 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050087
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050088static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120089 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070090 "\n"
91 "layout(location = 0) out vec4 uFragColor;\n"
92 "void main(){\n"
93 " uFragColor = vec4(0,1,0,1);\n"
94 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050095
Karl Schultz6addd812016-02-02 17:17:23 -070096static VKAPI_ATTR VkBool32 VKAPI_CALL
97myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
98 uint64_t srcObject, size_t location, int32_t msgCode,
99 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -0600100
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600101// ********************************************************
102// ErrorMonitor Usage:
103//
104// Call SetDesiredFailureMsg with a string to be compared against all
105// encountered log messages. Passing NULL will match all log messages.
106// logMsg will return true for skipCall only if msg is matched or NULL.
107//
108// Call DesiredMsgFound to determine if the desired failure message
109// was encountered.
110
Tony Barbour300a6082015-04-07 13:44:53 -0600111class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700112 public:
113 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600114 test_platform_thread_create_mutex(&m_mutex);
115 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700116 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700117 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600118 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600119 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600120
Dustin Graves48458142016-04-29 16:11:55 -0600121 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
122
Karl Schultz6addd812016-02-02 17:17:23 -0700123 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200124 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600125 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600126 m_failureMsg.clear();
127 m_otherMsgs.clear();
128 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700129 m_msgFound = VK_FALSE;
130 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600131 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600132 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600133
Karl Schultz6addd812016-02-02 17:17:23 -0700134 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600135 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600136 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600137 if (m_bailout != NULL) {
138 *m_bailout = true;
139 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600140 string errorString(msgString);
141 if (msgFlags & m_msgFlags) {
142 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200143 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
144 m_otherMsgs.push_back(m_failureMsg);
145 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600146 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700147 m_msgFound = VK_TRUE;
148 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600149 } else {
150 m_otherMsgs.push_back(errorString);
151 }
152 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600153 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600154 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600155 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600156
Karl Schultz6addd812016-02-02 17:17:23 -0700157 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600158
Karl Schultz6addd812016-02-02 17:17:23 -0700159 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600160
Karl Schultz6addd812016-02-02 17:17:23 -0700161 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600162
Karl Schultz6addd812016-02-02 17:17:23 -0700163 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600164
Karl Schultz6addd812016-02-02 17:17:23 -0700165 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600166 vector<string> otherMsgs = GetOtherFailureMsgs();
167 cout << "Other error messages logged for this test were:" << endl;
168 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
169 cout << " " << *iter << endl;
170 }
171 }
172
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200173 /* helpers */
174
175 void ExpectSuccess() {
176 // match anything
177 SetDesiredFailureMsg(~0u, "");
178 }
179
180 void VerifyFound() {
181 // Not seeing the desired message is a failure. /Before/ throwing, dump
182 // any other messages.
183 if (!DesiredMsgFound()) {
184 DumpFailureMsgs();
185 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
186 }
187 }
188
189 void VerifyNotFound() {
190 // ExpectSuccess() configured us to match anything. Any error is a
191 // failure.
192 if (DesiredMsgFound()) {
193 DumpFailureMsgs();
194 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
195 }
196 }
197
Karl Schultz6addd812016-02-02 17:17:23 -0700198 private:
199 VkFlags m_msgFlags;
200 string m_desiredMsg;
201 string m_failureMsg;
202 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600203 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700204 bool *m_bailout;
205 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600206};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500207
Karl Schultz6addd812016-02-02 17:17:23 -0700208static VKAPI_ATTR VkBool32 VKAPI_CALL
209myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
210 uint64_t srcObject, size_t location, int32_t msgCode,
211 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
212 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700213 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700214 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600215 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600216 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600217 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600218 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600219}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500220
Karl Schultz6addd812016-02-02 17:17:23 -0700221class VkLayerTest : public VkRenderFramework {
222 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800223 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
224 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700225 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
226 BsoFailSelect failMask);
227 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
228 VkPipelineObj &pipelineobj,
229 VkDescriptorSetObj &descriptorSet,
230 BsoFailSelect failMask);
231 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
232 VkDescriptorSetObj &descriptorSet,
233 BsoFailSelect failMask) {
234 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
235 failMask);
236 }
Tony Barbour300a6082015-04-07 13:44:53 -0600237
Tony Barbourfe3351b2015-07-28 10:17:20 -0600238 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700239 VkResult BeginCommandBuffer() {
240 return BeginCommandBuffer(*m_commandBuffer);
241 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800242 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700243 void Draw(uint32_t vertexCount, uint32_t instanceCount,
244 uint32_t firstVertex, uint32_t firstInstance) {
245 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
246 firstInstance);
247 }
248 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
249 uint32_t firstIndex, int32_t vertexOffset,
250 uint32_t firstInstance) {
251 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
252 vertexOffset, firstInstance);
253 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800254 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700255 void QueueCommandBuffer(const VkFence &fence) {
256 m_commandBuffer->QueueCommandBuffer(fence);
257 }
258 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
259 VkDeviceSize offset, uint32_t binding) {
260 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
261 }
262 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
263 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
264 }
265
266 protected:
267 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600268
269 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600270 std::vector<const char *> instance_layer_names;
271 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600272 std::vector<const char *> instance_extension_names;
273 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600274
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700275 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600276 /*
277 * Since CreateDbgMsgCallback is an instance level extension call
278 * any extension / layer that utilizes that feature also needs
279 * to be enabled at create instance time.
280 */
Karl Schultz6addd812016-02-02 17:17:23 -0700281 // Use Threading layer first to protect others from
282 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700283 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600284 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800285 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700286 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800287 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
288 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600289 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700290 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600291
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700292 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600293 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800294 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700295 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800296 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
297 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600298 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700299 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600300
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600301 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600302 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800303 this->app_info.pApplicationName = "layer_tests";
304 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600305 this->app_info.pEngineName = "unittest";
306 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600307 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600308
Tony Barbour15524c32015-04-29 17:34:29 -0600309 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600310 InitFramework(instance_layer_names, device_layer_names,
311 instance_extension_names, device_extension_names,
312 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600313 }
314
315 virtual void TearDown() {
316 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600317 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600318 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600319 }
320};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500321
Karl Schultz6addd812016-02-02 17:17:23 -0700322VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600323 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600324
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800325 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600326
327 /*
328 * For render test all drawing happens in a single render pass
329 * on a single command buffer.
330 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200331 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800332 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600333 }
334
335 return result;
336}
337
Karl Schultz6addd812016-02-02 17:17:23 -0700338VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600339 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600340
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200341 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800342 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200343 }
Tony Barbour300a6082015-04-07 13:44:53 -0600344
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800345 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600346
347 return result;
348}
349
Karl Schultz6addd812016-02-02 17:17:23 -0700350void VkLayerTest::VKTriangleTest(const char *vertShaderText,
351 const char *fragShaderText,
352 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500353 // Create identity matrix
354 int i;
355 struct vktriangle_vs_uniform data;
356
357 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700358 glm::mat4 View = glm::mat4(1.0f);
359 glm::mat4 Model = glm::mat4(1.0f);
360 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500361 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700362 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500363
364 memcpy(&data.mvp, &MVP[0][0], matrixSize);
365
Karl Schultz6addd812016-02-02 17:17:23 -0700366 static const Vertex tri_data[] = {
367 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
368 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
369 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500370 };
371
Karl Schultz6addd812016-02-02 17:17:23 -0700372 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500373 data.position[i][0] = tri_data[i].posX;
374 data.position[i][1] = tri_data[i].posY;
375 data.position[i][2] = tri_data[i].posZ;
376 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700377 data.color[i][0] = tri_data[i].r;
378 data.color[i][1] = tri_data[i].g;
379 data.color[i][2] = tri_data[i].b;
380 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500381 }
382
383 ASSERT_NO_FATAL_FAILURE(InitState());
384 ASSERT_NO_FATAL_FAILURE(InitViewport());
385
Karl Schultz6addd812016-02-02 17:17:23 -0700386 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
387 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500388
Karl Schultz6addd812016-02-02 17:17:23 -0700389 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
390 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
391 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500392
393 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800394 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500395 pipelineobj.AddShader(&vs);
396 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600397 if (failMask & BsoFailLineWidth) {
398 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600399 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
400 ia_state.sType =
401 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
402 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
403 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600404 }
405 if (failMask & BsoFailDepthBias) {
406 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600407 VkPipelineRasterizationStateCreateInfo rs_state = {};
408 rs_state.sType =
409 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
410 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600411 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600412 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600413 }
Karl Schultz6addd812016-02-02 17:17:23 -0700414 // Viewport and scissors must stay in synch or other errors will occur than
415 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600416 if (failMask & BsoFailViewport) {
417 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600418 m_viewports.clear();
419 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600420 }
421 if (failMask & BsoFailScissor) {
422 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600423 m_scissors.clear();
424 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600425 }
426 if (failMask & BsoFailBlend) {
427 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600428 VkPipelineColorBlendAttachmentState att_state = {};
429 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
430 att_state.blendEnable = VK_TRUE;
431 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600432 }
433 if (failMask & BsoFailDepthBounds) {
434 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
435 }
436 if (failMask & BsoFailStencilReadMask) {
437 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
438 }
439 if (failMask & BsoFailStencilWriteMask) {
440 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
441 }
442 if (failMask & BsoFailStencilReference) {
443 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
444 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500445
446 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700447 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
448 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500449
450 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600451 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500452
Tony Barbourfe3351b2015-07-28 10:17:20 -0600453 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500454
455 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600456 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500457
458 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600459 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500460
Tony Barbourfe3351b2015-07-28 10:17:20 -0600461 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500462}
463
Karl Schultz6addd812016-02-02 17:17:23 -0700464void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
465 VkPipelineObj &pipelineobj,
466 VkDescriptorSetObj &descriptorSet,
467 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500468 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700469 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
470 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500471 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700472 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
473 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500474 }
475
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800476 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700477 // Make sure depthWriteEnable is set so that Depth fail test will work
478 // correctly
479 // Make sure stencilTestEnable is set so that Stencil fail test will work
480 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600481 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800482 stencil.failOp = VK_STENCIL_OP_KEEP;
483 stencil.passOp = VK_STENCIL_OP_KEEP;
484 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
485 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600486
487 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
488 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600489 ds_ci.pNext = NULL;
490 ds_ci.depthTestEnable = VK_FALSE;
491 ds_ci.depthWriteEnable = VK_TRUE;
492 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
493 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600494 if (failMask & BsoFailDepthBounds) {
495 ds_ci.depthBoundsTestEnable = VK_TRUE;
496 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600497 ds_ci.stencilTestEnable = VK_TRUE;
498 ds_ci.front = stencil;
499 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600500
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600501 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600502 pipelineobj.SetViewport(m_viewports);
503 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800504 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700505 VkResult err = pipelineobj.CreateVKPipeline(
506 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600507 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800508 commandBuffer->BindPipeline(pipelineobj);
509 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500510}
511
512// ********************************************************************************************************************
513// ********************************************************************************************************************
514// ********************************************************************************************************************
515// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600516#if PARAMETER_VALIDATION_TESTS
517TEST_F(VkLayerTest, RequiredParameter) {
518 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
519 "pointer, array, and array count parameters");
520
521 ASSERT_NO_FATAL_FAILURE(InitState());
522
523 m_errorMonitor->SetDesiredFailureMsg(
524 VK_DEBUG_REPORT_ERROR_BIT_EXT,
525 "required parameter pFeatures specified as NULL");
526 // Specify NULL for a pointer to a handle
527 // Expected to trigger an error with
528 // parameter_validation::validate_required_pointer
529 vkGetPhysicalDeviceFeatures(gpu(), NULL);
530 m_errorMonitor->VerifyFound();
531
532 m_errorMonitor->SetDesiredFailureMsg(
533 VK_DEBUG_REPORT_ERROR_BIT_EXT,
534 "required parameter pPhysicalDeviceCount specified as NULL");
535 // Specify NULL for pointer to array count
536 // Expected to trigger an error with parameter_validation::validate_array
537 vkEnumeratePhysicalDevices(instance(), NULL, NULL);
538 m_errorMonitor->VerifyFound();
539
540 m_errorMonitor->SetDesiredFailureMsg(
541 VK_DEBUG_REPORT_ERROR_BIT_EXT,
542 "parameter viewportCount must be greater than 0");
543 // Specify 0 for a required array count
544 // Expected to trigger an error with parameter_validation::validate_array
545 VkViewport view_port = {};
546 m_commandBuffer->SetViewport(0, 0, &view_port);
547 m_errorMonitor->VerifyFound();
548
549 m_errorMonitor->SetDesiredFailureMsg(
550 VK_DEBUG_REPORT_ERROR_BIT_EXT,
551 "required parameter pViewports specified as NULL");
552 // Specify NULL for a required array
553 // Expected to trigger an error with parameter_validation::validate_array
554 m_commandBuffer->SetViewport(0, 1, NULL);
555 m_errorMonitor->VerifyFound();
556
557 m_errorMonitor->SetDesiredFailureMsg(
558 VK_DEBUG_REPORT_ERROR_BIT_EXT,
559 "required parameter memory specified as VK_NULL_HANDLE");
560 // Specify VK_NULL_HANDLE for a required handle
561 // Expected to trigger an error with
562 // parameter_validation::validate_required_handle
563 vkUnmapMemory(device(), VK_NULL_HANDLE);
564 m_errorMonitor->VerifyFound();
565
566 m_errorMonitor->SetDesiredFailureMsg(
567 VK_DEBUG_REPORT_ERROR_BIT_EXT,
568 "required parameter pFences[0] specified as VK_NULL_HANDLE");
569 // Specify VK_NULL_HANDLE for a required handle array entry
570 // Expected to trigger an error with
571 // parameter_validation::validate_required_handle_array
572 VkFence fence = VK_NULL_HANDLE;
573 vkResetFences(device(), 1, &fence);
574 m_errorMonitor->VerifyFound();
575
576 m_errorMonitor->SetDesiredFailureMsg(
577 VK_DEBUG_REPORT_ERROR_BIT_EXT,
578 "required parameter pAllocateInfo specified as NULL");
579 // Specify NULL for a required struct pointer
580 // Expected to trigger an error with
581 // parameter_validation::validate_struct_type
582 VkDeviceMemory memory = VK_NULL_HANDLE;
583 vkAllocateMemory(device(), NULL, NULL, &memory);
584 m_errorMonitor->VerifyFound();
585
586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
587 "value of faceMask must not be 0");
588 // Specify 0 for a required VkFlags parameter
589 // Expected to trigger an error with parameter_validation::validate_flags
590 m_commandBuffer->SetStencilReference(0, 0);
591 m_errorMonitor->VerifyFound();
592
593 m_errorMonitor->SetDesiredFailureMsg(
594 VK_DEBUG_REPORT_ERROR_BIT_EXT,
595 "value of pSubmits[i].pWaitDstStageMask[0] must not be 0");
596 // Specify 0 for a required VkFlags array entry
597 // Expected to trigger an error with
598 // parameter_validation::validate_flags_array
599 VkSemaphore semaphore = VK_NULL_HANDLE;
600 VkPipelineStageFlags stageFlags = 0;
601 VkSubmitInfo submitInfo = {};
602 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
603 submitInfo.waitSemaphoreCount = 1;
604 submitInfo.pWaitSemaphores = &semaphore;
605 submitInfo.pWaitDstStageMask = &stageFlags;
606 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
607 m_errorMonitor->VerifyFound();
608}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600609
Dustin Gravesfce74c02016-05-10 11:42:58 -0600610TEST_F(VkLayerTest, ReservedParameter) {
611 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
612
613 ASSERT_NO_FATAL_FAILURE(InitState());
614
615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
616 " must be 0");
617 // Specify 0 for a reserved VkFlags parameter
618 // Expected to trigger an error with
619 // parameter_validation::validate_reserved_flags
620 VkEvent event_handle = VK_NULL_HANDLE;
621 VkEventCreateInfo event_info = {};
622 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
623 event_info.flags = 1;
624 vkCreateEvent(device(), &event_info, NULL, &event_handle);
625 m_errorMonitor->VerifyFound();
626}
627
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600628TEST_F(VkLayerTest, InvalidStructSType) {
629 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
630 "structure's sType field");
631
632 ASSERT_NO_FATAL_FAILURE(InitState());
633
634 m_errorMonitor->SetDesiredFailureMsg(
635 VK_DEBUG_REPORT_ERROR_BIT_EXT,
636 "parameter pAllocateInfo->sType must be");
637 // Zero struct memory, effectively setting sType to
638 // VK_STRUCTURE_TYPE_APPLICATION_INFO
639 // Expected to trigger an error with
640 // parameter_validation::validate_struct_type
641 VkMemoryAllocateInfo alloc_info = {};
642 VkDeviceMemory memory = VK_NULL_HANDLE;
643 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
644 m_errorMonitor->VerifyFound();
645
646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
647 "parameter pSubmits[0].sType must be");
648 // Zero struct memory, effectively setting sType to
649 // VK_STRUCTURE_TYPE_APPLICATION_INFO
650 // Expected to trigger an error with
651 // parameter_validation::validate_struct_type_array
652 VkSubmitInfo submit_info = {};
653 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
654 m_errorMonitor->VerifyFound();
655}
656
657TEST_F(VkLayerTest, InvalidStructPNext) {
658 TEST_DESCRIPTION(
659 "Specify an invalid value for a Vulkan structure's pNext field");
660
661 ASSERT_NO_FATAL_FAILURE(InitState());
662
663 m_errorMonitor->SetDesiredFailureMsg(
664 VK_DEBUG_REPORT_ERROR_BIT_EXT,
665 "value of pAllocateInfo->pNext must be NULL");
666 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be
667 // NULL
668 // Expected to trigger an error with
669 // parameter_validation::validate_struct_pnext
670 VkDeviceMemory memory = VK_NULL_HANDLE;
671 // Zero-initialization will provide the correct sType
672 VkApplicationInfo app_info = {};
Dustin Graves47b6cba2016-05-10 17:34:38 -0600673 VkMemoryAllocateInfo memory_alloc_info = {};
674 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
675 memory_alloc_info.pNext = &app_info;
676 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600677 m_errorMonitor->VerifyFound();
678
Dustin Graves47b6cba2016-05-10 17:34:38 -0600679 m_errorMonitor->SetDesiredFailureMsg(
680 VK_DEBUG_REPORT_ERROR_BIT_EXT,
681 " chain includes a structure with unexpected VkStructureType ");
682 // Set VkGraphicsPipelineCreateInfo::VkPipelineRasterizationStateCreateInfo::pNext to an invalid structure, when pNext is allowed to be a non-NULL value
683 // Expected to trigger an error with
684 // parameter_validation::validate_struct_pnext
685 VkDescriptorPoolSize ds_type_count = {};
686 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
687 ds_type_count.descriptorCount = 1;
688
689 VkDescriptorPoolCreateInfo ds_pool_ci = {};
690 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
691 ds_pool_ci.pNext = NULL;
692 ds_pool_ci.maxSets = 1;
693 ds_pool_ci.poolSizeCount = 1;
694 ds_pool_ci.pPoolSizes = &ds_type_count;
695
696 VkDescriptorPool ds_pool;
697 VkResult err =
698 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
699 ASSERT_VK_SUCCESS(err);
700
701 VkDescriptorSetLayoutBinding dsl_binding = {};
702 dsl_binding.binding = 0;
703 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
704 dsl_binding.descriptorCount = 1;
705 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
706 dsl_binding.pImmutableSamplers = NULL;
707
708 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
709 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
710 ds_layout_ci.pNext = NULL;
711 ds_layout_ci.bindingCount = 1;
712 ds_layout_ci.pBindings = &dsl_binding;
713
714 VkDescriptorSetLayout ds_layout;
715 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
716 &ds_layout);
717 ASSERT_VK_SUCCESS(err);
718
719 VkDescriptorSet descriptorSet;
720 VkDescriptorSetAllocateInfo ds_alloc_info = {};
721 ds_alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
722 ds_alloc_info.descriptorSetCount = 1;
723 ds_alloc_info.descriptorPool = ds_pool;
724 ds_alloc_info.pSetLayouts = &ds_layout;
725 err = vkAllocateDescriptorSets(m_device->device(), &ds_alloc_info,
726 &descriptorSet);
727 ASSERT_VK_SUCCESS(err);
728
729 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
730 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
731 pipeline_layout_ci.setLayoutCount = 1;
732 pipeline_layout_ci.pSetLayouts = &ds_layout;
733
734 VkPipelineLayout pipeline_layout;
735 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
736 &pipeline_layout);
737 ASSERT_VK_SUCCESS(err);
738
739 VkViewport vp = {}; // Just need dummy vp to point to
740 VkRect2D sc = {}; // dummy scissor to point to
741
742 VkPipelineViewportStateCreateInfo vp_state_ci = {};
743 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
744 vp_state_ci.scissorCount = 1;
745 vp_state_ci.pScissors = &sc;
746 vp_state_ci.viewportCount = 1;
747 vp_state_ci.pViewports = &vp;
748
749 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
750 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
751 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
752 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
753 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
754 rs_state_ci.depthClampEnable = VK_FALSE;
755 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
756 rs_state_ci.depthBiasEnable = VK_FALSE;
757
758 VkGraphicsPipelineCreateInfo gp_ci = {};
759 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
760 gp_ci.pViewportState = &vp_state_ci;
761 gp_ci.pRasterizationState = &rs_state_ci;
762 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
763 gp_ci.layout = pipeline_layout;
764 gp_ci.renderPass = renderPass();
765
766 VkPipelineCacheCreateInfo pc_ci = {};
767 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
768 pc_ci.initialDataSize = 0;
769 pc_ci.pInitialData = 0;
770
771 VkPipeline pipeline;
772 VkPipelineCache pipelineCache;
773
774 err =
775 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
776 ASSERT_VK_SUCCESS(err);
777
778 // Set VkPipelineRasterizationStateCreateInfo::pNext to an invalid value
779 VkApplicationInfo invalid_pnext_struct = {};
780 rs_state_ci.pNext = &invalid_pnext_struct;
781
782 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
783 &gp_ci, NULL, &pipeline);
784 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600785}
Dustin Graves5d33d532016-05-09 16:21:12 -0600786
787TEST_F(VkLayerTest, UnrecognizedValue) {
788 TEST_DESCRIPTION(
789 "Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
790
791 ASSERT_NO_FATAL_FAILURE(InitState());
792
793 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
794 "does not fall within the begin..end "
795 "range of the core VkFormat "
796 "enumeration tokens");
797 // Specify an invalid VkFormat value
798 // Expected to trigger an error with
799 // parameter_validation::validate_ranged_enum
800 VkFormatProperties format_properties;
801 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000),
802 &format_properties);
803 m_errorMonitor->VerifyFound();
804
805 m_errorMonitor->SetDesiredFailureMsg(
806 VK_DEBUG_REPORT_ERROR_BIT_EXT,
807 "contains flag bits that are not recognized members of");
808 // Specify an invalid VkFlags bitmask value
809 // Expected to trigger an error with parameter_validation::validate_flags
810 VkImageFormatProperties image_format_properties;
811 vkGetPhysicalDeviceImageFormatProperties(
812 gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D,
813 VK_IMAGE_TILING_OPTIMAL, static_cast<VkImageUsageFlags>(1 << 25), 0,
814 &image_format_properties);
815 m_errorMonitor->VerifyFound();
816
817 m_errorMonitor->SetDesiredFailureMsg(
818 VK_DEBUG_REPORT_ERROR_BIT_EXT,
819 "contains flag bits that are not recognized members of");
820 // Specify an invalid VkFlags array entry
821 // Expected to trigger an error with
822 // parameter_validation::validate_flags_array
823 VkSemaphore semaphore = VK_NULL_HANDLE;
824 VkPipelineStageFlags stage_flags =
825 static_cast<VkPipelineStageFlags>(1 << 25);
826 VkSubmitInfo submit_info = {};
827 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
828 submit_info.waitSemaphoreCount = 1;
829 submit_info.pWaitSemaphores = &semaphore;
830 submit_info.pWaitDstStageMask = &stage_flags;
831 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
832 m_errorMonitor->VerifyFound();
833
834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
835 "is neither VK_TRUE nor VK_FALSE");
836 // Specify an invalid VkBool32 value
837 // Expected to trigger a warning with
838 // parameter_validation::validate_bool32
839 VkSampler sampler = VK_NULL_HANDLE;
840 VkSamplerCreateInfo sampler_info = {};
841 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
842 sampler_info.pNext = NULL;
843 sampler_info.magFilter = VK_FILTER_NEAREST;
844 sampler_info.minFilter = VK_FILTER_NEAREST;
845 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
846 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
847 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
848 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
849 sampler_info.mipLodBias = 1.0;
850 sampler_info.maxAnisotropy = 1;
851 sampler_info.compareEnable = VK_FALSE;
852 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
853 sampler_info.minLod = 1.0;
854 sampler_info.maxLod = 1.0;
855 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
856 sampler_info.unnormalizedCoordinates = VK_FALSE;
857 // Not VK_TRUE or VK_FALSE
858 sampler_info.anisotropyEnable = 3;
859 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
860 m_errorMonitor->VerifyFound();
861}
Dustin Gravesfce74c02016-05-10 11:42:58 -0600862
863TEST_F(VkLayerTest, FailedReturnValue) {
864 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
865
866 ASSERT_NO_FATAL_FAILURE(InitState());
867
868 m_errorMonitor->SetDesiredFailureMsg(
869 VK_DEBUG_REPORT_WARNING_BIT_EXT,
870 "the requested format is not supported on this device");
871 // Specify invalid VkFormat value to generate a
872 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
873 // Expected to trigger a warning from parameter_validation::validate_result
874 VkImageFormatProperties image_format_properties;
875 VkResult err = vkGetPhysicalDeviceImageFormatProperties(
876 gpu(), static_cast<VkFormat>(0x8000), VK_IMAGE_TYPE_2D,
877 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0,
878 &image_format_properties);
879 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
880 m_errorMonitor->VerifyFound();
881}
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600882#endif // PARAMETER_VALIDATION_TESTS
883
Tobin Ehlis0788f522015-05-26 16:11:58 -0600884#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700885#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800886TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500887{
888 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500889 VkFenceCreateInfo fenceInfo = {};
890 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
891 fenceInfo.pNext = NULL;
892 fenceInfo.flags = 0;
893
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700894 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600895
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500896 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600897
898 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
899 vk_testing::Buffer buffer;
900 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500901
Tony Barbourfe3351b2015-07-28 10:17:20 -0600902 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800903 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600904 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500905
906 testFence.init(*m_device, fenceInfo);
907
908 // Bypass framework since it does the waits automatically
909 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600910 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800911 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
912 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800913 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600914 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700915 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800916 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800917 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800918 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600919 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600920
921 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500922 ASSERT_VK_SUCCESS( err );
923
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500924 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800925 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500926
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200927 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500928}
929
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800930TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500931{
932 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500933 VkFenceCreateInfo fenceInfo = {};
934 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
935 fenceInfo.pNext = NULL;
936 fenceInfo.flags = 0;
937
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600939
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500940 ASSERT_NO_FATAL_FAILURE(InitState());
941 ASSERT_NO_FATAL_FAILURE(InitViewport());
942 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
943
Tony Barbourfe3351b2015-07-28 10:17:20 -0600944 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800945 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600946 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500947
948 testFence.init(*m_device, fenceInfo);
949
950 // Bypass framework since it does the waits automatically
951 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600952 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800953 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
954 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800955 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600956 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700957 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800958 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800959 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800960 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600961 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600962
963 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500964 ASSERT_VK_SUCCESS( err );
965
Jon Ashburnf19916e2016-01-11 13:12:43 -0700966 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800967 VkCommandBufferBeginInfo info = {};
968 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
969 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600970 info.renderPass = VK_NULL_HANDLE;
971 info.subpass = 0;
972 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800973 info.occlusionQueryEnable = VK_FALSE;
974 info.queryFlags = 0;
975 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600976
977 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800978 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500979
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200980 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500981}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700982#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200983
Mark Lobodzinski152fe252016-05-03 16:49:15 -0600984// This is a positive test. No failures are expected.
985TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
986 VkResult err;
987 bool pass;
988
989 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
990 "the buffer, create an image, and bind the same memory to "
991 "it");
992
993 m_errorMonitor->ExpectSuccess();
994
995 ASSERT_NO_FATAL_FAILURE(InitState());
996
997 VkBuffer buffer;
998 VkImage image;
999 VkDeviceMemory mem;
1000 VkMemoryRequirements mem_reqs;
1001
1002 VkBufferCreateInfo buf_info = {};
1003 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1004 buf_info.pNext = NULL;
1005 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1006 buf_info.size = 256;
1007 buf_info.queueFamilyIndexCount = 0;
1008 buf_info.pQueueFamilyIndices = NULL;
1009 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1010 buf_info.flags = 0;
1011 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1012 ASSERT_VK_SUCCESS(err);
1013
1014 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1015
1016 VkMemoryAllocateInfo alloc_info = {};
1017 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1018 alloc_info.pNext = NULL;
1019 alloc_info.memoryTypeIndex = 0;
1020
1021 // Ensure memory is big enough for both bindings
1022 alloc_info.allocationSize = 0x10000;
1023
1024 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1025 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1026 if (!pass) {
1027 vkDestroyBuffer(m_device->device(), buffer, NULL);
1028 return;
1029 }
1030
1031 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1032 ASSERT_VK_SUCCESS(err);
1033
1034 uint8_t *pData;
1035 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1036 (void **)&pData);
1037 ASSERT_VK_SUCCESS(err);
1038
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001039 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001040
1041 vkUnmapMemory(m_device->device(), mem);
1042
1043 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1044 ASSERT_VK_SUCCESS(err);
1045
1046 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1047 // memory. In fact, it was never used by the GPU.
1048 // Just be be sure, wait for idle.
1049 vkDestroyBuffer(m_device->device(), buffer, NULL);
1050 vkDeviceWaitIdle(m_device->device());
1051
1052 VkImageCreateInfo image_create_info = {};
1053 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1054 image_create_info.pNext = NULL;
1055 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1056 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1057 image_create_info.extent.width = 64;
1058 image_create_info.extent.height = 64;
1059 image_create_info.extent.depth = 1;
1060 image_create_info.mipLevels = 1;
1061 image_create_info.arrayLayers = 1;
1062 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1063 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1064 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1065 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1066 image_create_info.queueFamilyIndexCount = 0;
1067 image_create_info.pQueueFamilyIndices = NULL;
1068 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1069 image_create_info.flags = 0;
1070
1071 VkMemoryAllocateInfo mem_alloc = {};
1072 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1073 mem_alloc.pNext = NULL;
1074 mem_alloc.allocationSize = 0;
1075 mem_alloc.memoryTypeIndex = 0;
1076
1077 /* Create a mappable image. It will be the texture if linear images are ok
1078 * to be textures or it will be the staging image if they are not.
1079 */
1080 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1081 ASSERT_VK_SUCCESS(err);
1082
1083 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1084
1085 mem_alloc.allocationSize = mem_reqs.size;
1086
1087 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
1088 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1089 if (!pass) {
1090 vkDestroyImage(m_device->device(), image, NULL);
1091 return;
1092 }
1093
1094 // VALDIATION FAILURE:
1095 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1096 ASSERT_VK_SUCCESS(err);
1097
1098 m_errorMonitor->VerifyNotFound();
1099
1100 vkDestroyBuffer(m_device->device(), buffer, NULL);
1101 vkDestroyImage(m_device->device(), image, NULL);
1102}
1103
Ian Elliott1c32c772016-04-28 14:47:13 -06001104TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1105 VkResult err;
1106 bool pass;
1107
Ian Elliott489eec02016-05-05 14:12:44 -06001108// FIXME: After we turn on this code for non-Linux platforms, uncomment the
1109// following declaration (which is temporarily being moved below):
1110// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001111 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
1112 VkSwapchainCreateInfoKHR swapchain_create_info = {};
1113 uint32_t swapchain_image_count = 0;
1114// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
1115 uint32_t image_index = 0;
1116// VkPresentInfoKHR present_info = {};
1117
1118 ASSERT_NO_FATAL_FAILURE(InitState());
1119
Ian Elliott3f06ce52016-04-29 14:46:21 -06001120#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1121#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1122 // Use the functions from the VK_KHR_android_surface extension without
1123 // enabling that extension:
1124
1125 // Create a surface:
1126 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
1127#if 0
1128#endif
1129 m_errorMonitor->SetDesiredFailureMsg(
1130 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1131 "extension was not enabled for this");
1132 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
1133 &surface);
1134 pass = (err != VK_SUCCESS);
1135 ASSERT_TRUE(pass);
1136 m_errorMonitor->VerifyFound();
1137#endif // VK_USE_PLATFORM_ANDROID_KHR
1138
1139
1140#if defined(VK_USE_PLATFORM_MIR_KHR)
1141 // Use the functions from the VK_KHR_mir_surface extension without enabling
1142 // that extension:
1143
1144 // Create a surface:
1145 VkMirSurfaceCreateInfoKHR mir_create_info = {};
1146#if 0
1147#endif
1148 m_errorMonitor->SetDesiredFailureMsg(
1149 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1150 "extension was not enabled for this");
1151 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1152 pass = (err != VK_SUCCESS);
1153 ASSERT_TRUE(pass);
1154 m_errorMonitor->VerifyFound();
1155
1156 // Tell whether an mir_connection supports presentation:
1157 MirConnection *mir_connection = NULL;
1158 m_errorMonitor->SetDesiredFailureMsg(
1159 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1160 "extension was not enabled for this");
1161 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
1162 visual_id);
1163 m_errorMonitor->VerifyFound();
1164#endif // VK_USE_PLATFORM_MIR_KHR
1165
1166
1167#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1168 // Use the functions from the VK_KHR_wayland_surface extension without
1169 // enabling that extension:
1170
1171 // Create a surface:
1172 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
1173#if 0
1174#endif
1175 m_errorMonitor->SetDesiredFailureMsg(
1176 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1177 "extension was not enabled for this");
1178 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
1179 &surface);
1180 pass = (err != VK_SUCCESS);
1181 ASSERT_TRUE(pass);
1182 m_errorMonitor->VerifyFound();
1183
1184 // Tell whether an wayland_display supports presentation:
1185 struct wl_display wayland_display = {};
1186 m_errorMonitor->SetDesiredFailureMsg(
1187 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1188 "extension was not enabled for this");
1189 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
1190 &wayland_display);
1191 m_errorMonitor->VerifyFound();
1192#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06001193#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001194
1195
1196#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06001197// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1198// TO NON-LINUX PLATFORMS:
1199VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001200 // Use the functions from the VK_KHR_win32_surface extension without
1201 // enabling that extension:
1202
1203 // Create a surface:
1204 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
1205#if 0
1206#endif
1207 m_errorMonitor->SetDesiredFailureMsg(
1208 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1209 "extension was not enabled for this");
1210 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
1211 &surface);
1212 pass = (err != VK_SUCCESS);
1213 ASSERT_TRUE(pass);
1214 m_errorMonitor->VerifyFound();
1215
1216 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001217 m_errorMonitor->SetDesiredFailureMsg(
1218 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1219 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001220 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001221 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001222// Set this (for now, until all platforms are supported and tested):
1223#define NEED_TO_TEST_THIS_ON_PLATFORM
1224#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001225
1226
Ian Elliott1c32c772016-04-28 14:47:13 -06001227#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06001228// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1229// TO NON-LINUX PLATFORMS:
1230VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001231 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1232 // that extension:
1233
1234 // Create a surface:
1235 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
1236#if 0
1237#endif
1238 m_errorMonitor->SetDesiredFailureMsg(
1239 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1240 "extension was not enabled for this");
1241 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1242 pass = (err != VK_SUCCESS);
1243 ASSERT_TRUE(pass);
1244 m_errorMonitor->VerifyFound();
1245
1246 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001247 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001248 xcb_visualid_t visual_id = 0;
1249 m_errorMonitor->SetDesiredFailureMsg(
1250 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1251 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001252 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06001253 visual_id);
1254 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001255// Set this (for now, until all platforms are supported and tested):
1256#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001257#endif // VK_USE_PLATFORM_XCB_KHR
1258
1259
Ian Elliott12630812016-04-29 14:35:43 -06001260#if defined(VK_USE_PLATFORM_XLIB_KHR)
1261 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1262 // that extension:
1263
1264 // Create a surface:
1265 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
1266#if 0
1267#endif
1268 m_errorMonitor->SetDesiredFailureMsg(
1269 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1270 "extension was not enabled for this");
1271 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1272 pass = (err != VK_SUCCESS);
1273 ASSERT_TRUE(pass);
1274 m_errorMonitor->VerifyFound();
1275
1276 // Tell whether an Xlib VisualID supports presentation:
1277 Display *dpy = NULL;
1278 VisualID visual = 0;
1279 m_errorMonitor->SetDesiredFailureMsg(
1280 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1281 "extension was not enabled for this");
1282 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1283 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001284// Set this (for now, until all platforms are supported and tested):
1285#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06001286#endif // VK_USE_PLATFORM_XLIB_KHR
1287
1288
Ian Elliott1c32c772016-04-28 14:47:13 -06001289 // Use the functions from the VK_KHR_surface extension without enabling
1290 // that extension:
1291
Ian Elliott489eec02016-05-05 14:12:44 -06001292#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001293 // Destroy a surface:
1294 m_errorMonitor->SetDesiredFailureMsg(
1295 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1296 "extension was not enabled for this");
1297 vkDestroySurfaceKHR(instance(), surface, NULL);
1298 m_errorMonitor->VerifyFound();
1299
1300 // Check if surface supports presentation:
1301 VkBool32 supported = false;
1302 m_errorMonitor->SetDesiredFailureMsg(
1303 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1304 "extension was not enabled for this");
1305 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1306 pass = (err != VK_SUCCESS);
1307 ASSERT_TRUE(pass);
1308 m_errorMonitor->VerifyFound();
1309
1310 // Check surface capabilities:
1311 VkSurfaceCapabilitiesKHR capabilities = {};
1312 m_errorMonitor->SetDesiredFailureMsg(
1313 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1314 "extension was not enabled for this");
1315 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
1316 &capabilities);
1317 pass = (err != VK_SUCCESS);
1318 ASSERT_TRUE(pass);
1319 m_errorMonitor->VerifyFound();
1320
1321 // Check surface formats:
1322 uint32_t format_count = 0;
1323 VkSurfaceFormatKHR *formats = NULL;
1324 m_errorMonitor->SetDesiredFailureMsg(
1325 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1326 "extension was not enabled for this");
1327 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1328 &format_count, formats);
1329 pass = (err != VK_SUCCESS);
1330 ASSERT_TRUE(pass);
1331 m_errorMonitor->VerifyFound();
1332
1333 // Check surface present modes:
1334 uint32_t present_mode_count = 0;
1335 VkSurfaceFormatKHR *present_modes = NULL;
1336 m_errorMonitor->SetDesiredFailureMsg(
1337 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1338 "extension was not enabled for this");
1339 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1340 &present_mode_count, present_modes);
1341 pass = (err != VK_SUCCESS);
1342 ASSERT_TRUE(pass);
1343 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001344#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001345
1346
1347 // Use the functions from the VK_KHR_swapchain extension without enabling
1348 // that extension:
1349
1350 // Create a swapchain:
1351 m_errorMonitor->SetDesiredFailureMsg(
1352 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1353 "extension was not enabled for this");
1354 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1355 swapchain_create_info.pNext = NULL;
1356#if 0
1357 swapchain_create_info.flags = 0;
1358 swapchain_create_info.surface = 0;
1359 swapchain_create_info.minImageCount = 0;
1360 swapchain_create_info.imageFormat = 0;
1361 swapchain_create_info.imageColorSpace = 0;
1362 swapchain_create_info.imageExtent.width = 0;
1363 swapchain_create_info.imageExtent.height = 0;
1364 swapchain_create_info.imageArrayLayers = 0;
1365 swapchain_create_info.imageUsage = 0;
1366 swapchain_create_info.imageSharingMode = 0;
1367 swapchain_create_info.queueFamilyIndexCount = 0;
1368 swapchain_create_info.preTransform = 0;
1369 swapchain_create_info.compositeAlpha = 0;
1370 swapchain_create_info.presentMode = 0;
1371 swapchain_create_info.clipped = 0;
1372 swapchain_create_info.oldSwapchain = NULL;
1373#endif
1374 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1375 NULL, &swapchain);
1376 pass = (err != VK_SUCCESS);
1377 ASSERT_TRUE(pass);
1378 m_errorMonitor->VerifyFound();
1379
1380 // Get the images from the swapchain:
1381 m_errorMonitor->SetDesiredFailureMsg(
1382 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1383 "extension was not enabled for this");
1384 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
1385 &swapchain_image_count, NULL);
1386 pass = (err != VK_SUCCESS);
1387 ASSERT_TRUE(pass);
1388 m_errorMonitor->VerifyFound();
1389
1390 // Try to acquire an image:
1391 m_errorMonitor->SetDesiredFailureMsg(
1392 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1393 "extension was not enabled for this");
1394 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
1395 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
1396 pass = (err != VK_SUCCESS);
1397 ASSERT_TRUE(pass);
1398 m_errorMonitor->VerifyFound();
1399
1400 // Try to present an image:
1401#if 0 // NOTE: Currently can't test this because a real swapchain is needed
1402 // (as opposed to the fake one we created) in order for the layer to
1403 // lookup the VkDevice used to enable the extension:
1404 m_errorMonitor->SetDesiredFailureMsg(
1405 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1406 "extension was not enabled for this");
1407 present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
1408 present_info.pNext = NULL;
1409#if 0
1410#endif
1411 err = vkQueuePresentKHR(m_device->m_queue, &present_info);
1412 pass = (err != VK_SUCCESS);
1413 ASSERT_TRUE(pass);
1414 m_errorMonitor->VerifyFound();
1415#endif
1416
1417 // Destroy the swapchain:
1418 m_errorMonitor->SetDesiredFailureMsg(
1419 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1420 "extension was not enabled for this");
1421 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1422 m_errorMonitor->VerifyFound();
1423}
1424
Karl Schultz6addd812016-02-02 17:17:23 -07001425TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1426 VkResult err;
1427 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001428
Karl Schultz6addd812016-02-02 17:17:23 -07001429 m_errorMonitor->SetDesiredFailureMsg(
1430 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001431 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
1432
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001433 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001434
1435 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001436 VkImage image;
1437 VkDeviceMemory mem;
1438 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001439
Karl Schultz6addd812016-02-02 17:17:23 -07001440 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1441 const int32_t tex_width = 32;
1442 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001443
Tony Barboureb254902015-07-15 12:50:33 -06001444 VkImageCreateInfo image_create_info = {};
1445 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001446 image_create_info.pNext = NULL;
1447 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1448 image_create_info.format = tex_format;
1449 image_create_info.extent.width = tex_width;
1450 image_create_info.extent.height = tex_height;
1451 image_create_info.extent.depth = 1;
1452 image_create_info.mipLevels = 1;
1453 image_create_info.arrayLayers = 1;
1454 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1455 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1456 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1457 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001458
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001459 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001460 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001461 mem_alloc.pNext = NULL;
1462 mem_alloc.allocationSize = 0;
1463 // Introduce failure, do NOT set memProps to
1464 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
1465 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001466
Chia-I Wuf7458c52015-10-26 21:10:41 +08001467 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001468 ASSERT_VK_SUCCESS(err);
1469
Karl Schultz6addd812016-02-02 17:17:23 -07001470 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001471
Mark Lobodzinski23065352015-05-29 09:32:35 -05001472 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001473
Karl Schultz6addd812016-02-02 17:17:23 -07001474 pass =
1475 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
1476 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1477 if (!pass) { // If we can't find any unmappable memory this test doesn't
1478 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08001479 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06001480 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06001481 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06001482
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001483 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001484 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001485 ASSERT_VK_SUCCESS(err);
1486
1487 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06001488 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001489 ASSERT_VK_SUCCESS(err);
1490
1491 // Map memory as if to initialize the image
1492 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07001493 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
1494 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001495
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001496 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001497
Chia-I Wuf7458c52015-10-26 21:10:41 +08001498 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001499}
1500
Karl Schultz6addd812016-02-02 17:17:23 -07001501TEST_F(VkLayerTest, RebindMemory) {
1502 VkResult err;
1503 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001504
Karl Schultz6addd812016-02-02 17:17:23 -07001505 m_errorMonitor->SetDesiredFailureMsg(
1506 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001507 "which has already been bound to mem object");
1508
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001509 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001510
1511 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001512 VkImage image;
1513 VkDeviceMemory mem1;
1514 VkDeviceMemory mem2;
1515 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001516
Karl Schultz6addd812016-02-02 17:17:23 -07001517 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1518 const int32_t tex_width = 32;
1519 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001520
Tony Barboureb254902015-07-15 12:50:33 -06001521 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001522 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1523 image_create_info.pNext = NULL;
1524 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1525 image_create_info.format = tex_format;
1526 image_create_info.extent.width = tex_width;
1527 image_create_info.extent.height = tex_height;
1528 image_create_info.extent.depth = 1;
1529 image_create_info.mipLevels = 1;
1530 image_create_info.arrayLayers = 1;
1531 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1532 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1533 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1534 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001535
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001536 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001537 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1538 mem_alloc.pNext = NULL;
1539 mem_alloc.allocationSize = 0;
1540 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06001541
Karl Schultz6addd812016-02-02 17:17:23 -07001542 // Introduce failure, do NOT set memProps to
1543 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06001544 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001545 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001546 ASSERT_VK_SUCCESS(err);
1547
Karl Schultz6addd812016-02-02 17:17:23 -07001548 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001549
1550 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001551 pass =
1552 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001553 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001554
1555 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001556 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001557 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001558 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001559 ASSERT_VK_SUCCESS(err);
1560
1561 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06001562 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001563 ASSERT_VK_SUCCESS(err);
1564
Karl Schultz6addd812016-02-02 17:17:23 -07001565 // Introduce validation failure, try to bind a different memory object to
1566 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06001567 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001568
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001569 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001570
Chia-I Wuf7458c52015-10-26 21:10:41 +08001571 vkDestroyImage(m_device->device(), image, NULL);
1572 vkFreeMemory(m_device->device(), mem1, NULL);
1573 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001574}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001575
Karl Schultz6addd812016-02-02 17:17:23 -07001576TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001577 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001578
Karl Schultz6addd812016-02-02 17:17:23 -07001579 m_errorMonitor->SetDesiredFailureMsg(
1580 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
1581 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001582
1583 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001584 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1585 fenceInfo.pNext = NULL;
1586 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06001587
Tony Barbour300a6082015-04-07 13:44:53 -06001588 ASSERT_NO_FATAL_FAILURE(InitState());
1589 ASSERT_NO_FATAL_FAILURE(InitViewport());
1590 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1591
Tony Barbourfe3351b2015-07-28 10:17:20 -06001592 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001593 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1594 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001595 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06001596
1597 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001598
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001599 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001600 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1601 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001602 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001603 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001604 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001605 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001606 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001607 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001608 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001609
1610 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001611 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001612
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001613 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001614}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001615// This is a positive test. We used to expect error in this case but spec now
1616// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07001617TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001618 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001619 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001620 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001621 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1622 fenceInfo.pNext = NULL;
1623
Tony Barbour0b4d9562015-04-09 10:48:04 -06001624 ASSERT_NO_FATAL_FAILURE(InitState());
1625 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08001626 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001627 VkResult result = vkResetFences(m_device->device(), 1, fences);
1628 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06001629
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001630 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06001631}
Tobin Ehlis41376e12015-07-03 08:45:14 -06001632
1633TEST_F(VkLayerTest, InvalidUsageBits)
1634{
Tony Barbourf92621a2016-05-02 14:28:12 -06001635 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001636 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06001637 "Initialize buffer with wrong usage then perform copy expecting errors "
1638 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001639 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001640 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001641
1642 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06001643 VkImageObj image(m_device);
1644 // Initialize image with USAGE_INPUT_ATTACHMENT
1645 image.init(128, 128, VK_FORMAT_D32_SFLOAT_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001646 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1647 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06001648
Tony Barbourf92621a2016-05-02 14:28:12 -06001649 VkImageView dsv;
1650 VkImageViewCreateInfo dsvci = {};
1651 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1652 dsvci.image = image.handle();
1653 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
1654 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
1655 dsvci.subresourceRange.layerCount = 1;
1656 dsvci.subresourceRange.baseMipLevel = 0;
1657 dsvci.subresourceRange.levelCount = 1;
1658 dsvci.subresourceRange.aspectMask =
1659 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06001660
Tony Barbourf92621a2016-05-02 14:28:12 -06001661 // Create a view with depth / stencil aspect for image with different usage
1662 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001663
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001664 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06001665
1666 // Initialize buffer with TRANSFER_DST usage
1667 vk_testing::Buffer buffer;
1668 VkMemoryPropertyFlags reqs = 0;
1669 buffer.init_as_dst(*m_device, 128 * 128, reqs);
1670 VkBufferImageCopy region = {};
1671 region.bufferRowLength = 128;
1672 region.bufferImageHeight = 128;
1673 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1674 region.imageSubresource.layerCount = 1;
1675 region.imageExtent.height = 16;
1676 region.imageExtent.width = 16;
1677 region.imageExtent.depth = 1;
1678
1679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1680 "Invalid usage flag for buffer ");
1681 // Buffer usage not set to TRANSFER_SRC and image usage not set to
1682 // TRANSFER_DST
1683 BeginCommandBuffer();
1684 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1685 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1686 1, &region);
1687 m_errorMonitor->VerifyFound();
1688
1689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1690 "Invalid usage flag for image ");
1691 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1692 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1693 1, &region);
1694 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06001695}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001696#endif // MEM_TRACKER_TESTS
1697
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06001698#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06001699
1700TEST_F(VkLayerTest, LeakAnObject) {
1701 VkResult err;
1702
1703 TEST_DESCRIPTION(
1704 "Create a fence and destroy its device without first destroying the fence.");
1705
1706 // Note that we have to create a new device since destroying the
1707 // framework's device causes Teardown() to fail and just calling Teardown
1708 // will destroy the errorMonitor.
1709
1710 m_errorMonitor->SetDesiredFailureMsg(
1711 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1712 "OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT object");
1713
1714 ASSERT_NO_FATAL_FAILURE(InitState());
1715
1716 const std::vector<VkQueueFamilyProperties> queue_props =
1717 m_device->queue_props;
1718 std::vector<VkDeviceQueueCreateInfo> queue_info;
1719 queue_info.reserve(queue_props.size());
1720 std::vector<std::vector<float>> queue_priorities;
1721 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
1722 VkDeviceQueueCreateInfo qi = {};
1723 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
1724 qi.pNext = NULL;
1725 qi.queueFamilyIndex = i;
1726 qi.queueCount = queue_props[i].queueCount;
1727 queue_priorities.emplace_back(qi.queueCount, 0.0f);
1728 qi.pQueuePriorities = queue_priorities[i].data();
1729 queue_info.push_back(qi);
1730 }
1731
1732 std::vector<const char *> device_layer_names;
1733 std::vector<const char *> device_extension_names;
1734 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
1735 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
1736 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
1737 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
1738 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
1739 device_layer_names.push_back("VK_LAYER_LUNARG_image");
1740 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
1741
1742 // The sacrificial device object
1743 VkDevice testDevice;
1744 VkDeviceCreateInfo device_create_info = {};
1745 auto features = m_device->phy().features();
1746 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
1747 device_create_info.pNext = NULL;
1748 device_create_info.queueCreateInfoCount = queue_info.size();
1749 device_create_info.pQueueCreateInfos = queue_info.data();
1750 device_create_info.enabledLayerCount = device_layer_names.size();
1751 device_create_info.ppEnabledLayerNames = device_layer_names.data();
1752 device_create_info.pEnabledFeatures = &features;
1753 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
1754 ASSERT_VK_SUCCESS(err);
1755
1756 VkFence fence;
1757 VkFenceCreateInfo fence_create_info = {};
1758 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1759 fence_create_info.pNext = NULL;
1760 fence_create_info.flags = 0;
1761 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
1762 ASSERT_VK_SUCCESS(err);
1763
1764 // Induce failure by not calling vkDestroyFence
1765 vkDestroyDevice(testDevice, NULL);
1766 m_errorMonitor->VerifyFound();
1767}
1768
1769TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
1770
1771 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
1772 "attempt to delete them from another.");
1773
1774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1775 "FreeCommandBuffers is attempting to free Command Buffer");
1776
1777 VkCommandPool command_pool_one;
1778 VkCommandPool command_pool_two;
1779
1780 VkCommandPoolCreateInfo pool_create_info{};
1781 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1782 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1783 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1784
1785 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1786 &command_pool_one);
1787
1788 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1789 &command_pool_two);
1790
1791 VkCommandBuffer command_buffer[9];
1792 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1793 command_buffer_allocate_info.sType =
1794 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1795 command_buffer_allocate_info.commandPool = command_pool_one;
1796 command_buffer_allocate_info.commandBufferCount = 9;
1797 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1798 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1799 command_buffer);
1800
1801 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
1802 &command_buffer[3]);
1803
1804 m_errorMonitor->VerifyFound();
1805
1806 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
1807 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
1808}
1809
1810TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
1811 VkResult err;
1812
1813 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
1814 "attempt to delete them from another.");
1815
1816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1817 "FreeDescriptorSets is attempting to free descriptorSet");
1818
1819 ASSERT_NO_FATAL_FAILURE(InitState());
1820 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1821
1822 VkDescriptorPoolSize ds_type_count = {};
1823 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
1824 ds_type_count.descriptorCount = 1;
1825
1826 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1827 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1828 ds_pool_ci.pNext = NULL;
1829 ds_pool_ci.flags = 0;
1830 ds_pool_ci.maxSets = 1;
1831 ds_pool_ci.poolSizeCount = 1;
1832 ds_pool_ci.pPoolSizes = &ds_type_count;
1833
1834 VkDescriptorPool ds_pool_one;
1835 err =
1836 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
1837 ASSERT_VK_SUCCESS(err);
1838
1839 // Create a second descriptor pool
1840 VkDescriptorPool ds_pool_two;
1841 err =
1842 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
1843 ASSERT_VK_SUCCESS(err);
1844
1845 VkDescriptorSetLayoutBinding dsl_binding = {};
1846 dsl_binding.binding = 0;
1847 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1848 dsl_binding.descriptorCount = 1;
1849 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1850 dsl_binding.pImmutableSamplers = NULL;
1851
1852 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1853 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1854 ds_layout_ci.pNext = NULL;
1855 ds_layout_ci.bindingCount = 1;
1856 ds_layout_ci.pBindings = &dsl_binding;
1857
1858 VkDescriptorSetLayout ds_layout;
1859 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1860 &ds_layout);
1861 ASSERT_VK_SUCCESS(err);
1862
1863 VkDescriptorSet descriptorSet;
1864 VkDescriptorSetAllocateInfo alloc_info = {};
1865 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1866 alloc_info.descriptorSetCount = 1;
1867 alloc_info.descriptorPool = ds_pool_one;
1868 alloc_info.pSetLayouts = &ds_layout;
1869 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1870 &descriptorSet);
1871 ASSERT_VK_SUCCESS(err);
1872
1873 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
1874
1875 m_errorMonitor->VerifyFound();
1876
1877 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1878 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
1879 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
1880}
1881
1882TEST_F(VkLayerTest, CreateUnknownObject) {
1883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1884 "Invalid VkImage Object ");
1885
1886 TEST_DESCRIPTION(
1887 "Pass an invalid image object handle into a Vulkan API call.");
1888
1889 ASSERT_NO_FATAL_FAILURE(InitState());
1890
1891 // Pass bogus handle into GetImageMemoryRequirements
1892 VkMemoryRequirements mem_reqs;
1893 uint64_t fakeImageHandle = 0xCADECADE;
1894 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
1895
1896 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
1897
1898 m_errorMonitor->VerifyFound();
1899}
1900
Karl Schultz6addd812016-02-02 17:17:23 -07001901TEST_F(VkLayerTest, PipelineNotBound) {
1902 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001903
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06001904 TEST_DESCRIPTION(
1905 "Pass in an invalid pipeline object handle into a Vulkan API call.");
1906
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001908 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001909
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001910 ASSERT_NO_FATAL_FAILURE(InitState());
1911 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001912
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001913 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001914 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1915 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001916
1917 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001918 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1919 ds_pool_ci.pNext = NULL;
1920 ds_pool_ci.maxSets = 1;
1921 ds_pool_ci.poolSizeCount = 1;
1922 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001923
1924 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001925 err =
1926 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001927 ASSERT_VK_SUCCESS(err);
1928
1929 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001930 dsl_binding.binding = 0;
1931 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1932 dsl_binding.descriptorCount = 1;
1933 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1934 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001935
1936 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001937 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1938 ds_layout_ci.pNext = NULL;
1939 ds_layout_ci.bindingCount = 1;
1940 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001941
1942 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001943 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1944 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001945 ASSERT_VK_SUCCESS(err);
1946
1947 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001948 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001949 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001950 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001951 alloc_info.descriptorPool = ds_pool;
1952 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001953 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1954 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001955 ASSERT_VK_SUCCESS(err);
1956
1957 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001958 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1959 pipeline_layout_ci.pNext = NULL;
1960 pipeline_layout_ci.setLayoutCount = 1;
1961 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001962
1963 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001964 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1965 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001966 ASSERT_VK_SUCCESS(err);
1967
Mark Youngad779052016-01-06 14:26:04 -07001968 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001969
1970 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001971 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1972 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001973
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001974 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001975
Chia-I Wuf7458c52015-10-26 21:10:41 +08001976 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1977 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1978 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001979}
1980
Karl Schultz6addd812016-02-02 17:17:23 -07001981TEST_F(VkLayerTest, BindInvalidMemory) {
1982 VkResult err;
1983 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001984
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001986 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001987
Tobin Ehlisec598302015-09-15 15:02:17 -06001988 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001989
1990 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001991 VkImage image;
1992 VkDeviceMemory mem;
1993 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001994
Karl Schultz6addd812016-02-02 17:17:23 -07001995 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1996 const int32_t tex_width = 32;
1997 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001998
1999 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002000 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2001 image_create_info.pNext = NULL;
2002 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2003 image_create_info.format = tex_format;
2004 image_create_info.extent.width = tex_width;
2005 image_create_info.extent.height = tex_height;
2006 image_create_info.extent.depth = 1;
2007 image_create_info.mipLevels = 1;
2008 image_create_info.arrayLayers = 1;
2009 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2010 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2011 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2012 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002013
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002014 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002015 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2016 mem_alloc.pNext = NULL;
2017 mem_alloc.allocationSize = 0;
2018 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002019
Chia-I Wuf7458c52015-10-26 21:10:41 +08002020 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002021 ASSERT_VK_SUCCESS(err);
2022
Karl Schultz6addd812016-02-02 17:17:23 -07002023 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002024
2025 mem_alloc.allocationSize = mem_reqs.size;
2026
Karl Schultz6addd812016-02-02 17:17:23 -07002027 pass =
2028 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002029 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002030
2031 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002032 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002033 ASSERT_VK_SUCCESS(err);
2034
2035 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002036 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002037
2038 // Try to bind free memory that has been freed
2039 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2040 // This may very well return an error.
2041 (void)err;
2042
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002043 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002044
Chia-I Wuf7458c52015-10-26 21:10:41 +08002045 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002046}
2047
Karl Schultz6addd812016-02-02 17:17:23 -07002048TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2049 VkResult err;
2050 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002051
Karl Schultz6addd812016-02-02 17:17:23 -07002052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2053 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002054
Tobin Ehlisec598302015-09-15 15:02:17 -06002055 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002056
Karl Schultz6addd812016-02-02 17:17:23 -07002057 // Create an image object, allocate memory, destroy the object and then try
2058 // to bind it
2059 VkImage image;
2060 VkDeviceMemory mem;
2061 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002062
Karl Schultz6addd812016-02-02 17:17:23 -07002063 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2064 const int32_t tex_width = 32;
2065 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002066
2067 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002068 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2069 image_create_info.pNext = NULL;
2070 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2071 image_create_info.format = tex_format;
2072 image_create_info.extent.width = tex_width;
2073 image_create_info.extent.height = tex_height;
2074 image_create_info.extent.depth = 1;
2075 image_create_info.mipLevels = 1;
2076 image_create_info.arrayLayers = 1;
2077 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2078 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2079 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2080 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002081
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002082 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002083 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2084 mem_alloc.pNext = NULL;
2085 mem_alloc.allocationSize = 0;
2086 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002087
Chia-I Wuf7458c52015-10-26 21:10:41 +08002088 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002089 ASSERT_VK_SUCCESS(err);
2090
Karl Schultz6addd812016-02-02 17:17:23 -07002091 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002092
2093 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002094 pass =
2095 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002096 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002097
2098 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002099 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002100 ASSERT_VK_SUCCESS(err);
2101
2102 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002103 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002104 ASSERT_VK_SUCCESS(err);
2105
2106 // Now Try to bind memory to this destroyed object
2107 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2108 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002109 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002110
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002111 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002112
Chia-I Wuf7458c52015-10-26 21:10:41 +08002113 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002114}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002115
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002116#endif // OBJ_TRACKER_TESTS
2117
Tobin Ehlis0788f522015-05-26 16:11:58 -06002118#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002119
2120// This is a positive test. No errors should be generated.
2121TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
2122
2123 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2124 "submitted on separate queues followed by a QueueWaitIdle.");
2125
Dustin Graves48458142016-04-29 16:11:55 -06002126 if ((m_device->queue_props.empty()) ||
2127 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002128 return;
2129
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002130 m_errorMonitor->ExpectSuccess();
2131
2132 VkSemaphore semaphore;
2133 VkSemaphoreCreateInfo semaphore_create_info{};
2134 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2135 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2136 &semaphore);
2137
2138 VkCommandPool command_pool;
2139 VkCommandPoolCreateInfo pool_create_info{};
2140 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2141 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2142 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2143 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2144 &command_pool);
2145
2146 VkCommandBuffer command_buffer[2];
2147 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2148 command_buffer_allocate_info.sType =
2149 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2150 command_buffer_allocate_info.commandPool = command_pool;
2151 command_buffer_allocate_info.commandBufferCount = 2;
2152 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2153 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2154 command_buffer);
2155
2156 VkQueue queue = VK_NULL_HANDLE;
2157 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2158 1, &queue);
2159
2160 {
2161 VkCommandBufferBeginInfo begin_info{};
2162 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2163 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2164
2165 vkCmdPipelineBarrier(command_buffer[0],
2166 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2167 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2168 0, nullptr, 0, nullptr);
2169
2170 VkViewport viewport{};
2171 viewport.maxDepth = 1.0f;
2172 viewport.minDepth = 0.0f;
2173 viewport.width = 512;
2174 viewport.height = 512;
2175 viewport.x = 0;
2176 viewport.y = 0;
2177 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2178 vkEndCommandBuffer(command_buffer[0]);
2179 }
2180 {
2181 VkCommandBufferBeginInfo begin_info{};
2182 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2183 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2184
2185 VkViewport viewport{};
2186 viewport.maxDepth = 1.0f;
2187 viewport.minDepth = 0.0f;
2188 viewport.width = 512;
2189 viewport.height = 512;
2190 viewport.x = 0;
2191 viewport.y = 0;
2192 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2193 vkEndCommandBuffer(command_buffer[1]);
2194 }
2195 {
2196 VkSubmitInfo submit_info{};
2197 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2198 submit_info.commandBufferCount = 1;
2199 submit_info.pCommandBuffers = &command_buffer[0];
2200 submit_info.signalSemaphoreCount = 1;
2201 submit_info.pSignalSemaphores = &semaphore;
2202 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2203 }
2204 {
2205 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2206 VkSubmitInfo submit_info{};
2207 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2208 submit_info.commandBufferCount = 1;
2209 submit_info.pCommandBuffers = &command_buffer[1];
2210 submit_info.waitSemaphoreCount = 1;
2211 submit_info.pWaitSemaphores = &semaphore;
2212 submit_info.pWaitDstStageMask = flags;
2213 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2214 }
2215
2216 vkQueueWaitIdle(m_device->m_queue);
2217
2218 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2219 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2220 &command_buffer[0]);
2221 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2222
2223 m_errorMonitor->VerifyNotFound();
2224}
2225
2226// This is a positive test. No errors should be generated.
2227TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
2228
2229 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2230 "submitted on separate queues, the second having a fence"
2231 "followed by a QueueWaitIdle.");
2232
Dustin Graves48458142016-04-29 16:11:55 -06002233 if ((m_device->queue_props.empty()) ||
2234 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002235 return;
2236
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002237 m_errorMonitor->ExpectSuccess();
2238
2239 VkFence fence;
2240 VkFenceCreateInfo fence_create_info{};
2241 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2242 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2243
2244 VkSemaphore semaphore;
2245 VkSemaphoreCreateInfo semaphore_create_info{};
2246 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2247 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2248 &semaphore);
2249
2250 VkCommandPool command_pool;
2251 VkCommandPoolCreateInfo pool_create_info{};
2252 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2253 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2254 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2255 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2256 &command_pool);
2257
2258 VkCommandBuffer command_buffer[2];
2259 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2260 command_buffer_allocate_info.sType =
2261 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2262 command_buffer_allocate_info.commandPool = command_pool;
2263 command_buffer_allocate_info.commandBufferCount = 2;
2264 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2265 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2266 command_buffer);
2267
2268 VkQueue queue = VK_NULL_HANDLE;
2269 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2270 1, &queue);
2271
2272 {
2273 VkCommandBufferBeginInfo begin_info{};
2274 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2275 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2276
2277 vkCmdPipelineBarrier(command_buffer[0],
2278 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2279 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2280 0, nullptr, 0, nullptr);
2281
2282 VkViewport viewport{};
2283 viewport.maxDepth = 1.0f;
2284 viewport.minDepth = 0.0f;
2285 viewport.width = 512;
2286 viewport.height = 512;
2287 viewport.x = 0;
2288 viewport.y = 0;
2289 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2290 vkEndCommandBuffer(command_buffer[0]);
2291 }
2292 {
2293 VkCommandBufferBeginInfo begin_info{};
2294 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2295 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2296
2297 VkViewport viewport{};
2298 viewport.maxDepth = 1.0f;
2299 viewport.minDepth = 0.0f;
2300 viewport.width = 512;
2301 viewport.height = 512;
2302 viewport.x = 0;
2303 viewport.y = 0;
2304 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2305 vkEndCommandBuffer(command_buffer[1]);
2306 }
2307 {
2308 VkSubmitInfo submit_info{};
2309 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2310 submit_info.commandBufferCount = 1;
2311 submit_info.pCommandBuffers = &command_buffer[0];
2312 submit_info.signalSemaphoreCount = 1;
2313 submit_info.pSignalSemaphores = &semaphore;
2314 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2315 }
2316 {
2317 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2318 VkSubmitInfo submit_info{};
2319 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2320 submit_info.commandBufferCount = 1;
2321 submit_info.pCommandBuffers = &command_buffer[1];
2322 submit_info.waitSemaphoreCount = 1;
2323 submit_info.pWaitSemaphores = &semaphore;
2324 submit_info.pWaitDstStageMask = flags;
2325 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2326 }
2327
2328 vkQueueWaitIdle(m_device->m_queue);
2329
2330 vkDestroyFence(m_device->device(), fence, nullptr);
2331 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2332 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2333 &command_buffer[0]);
2334 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2335
2336 m_errorMonitor->VerifyNotFound();
2337}
2338
2339// This is a positive test. No errors should be generated.
2340TEST_F(VkLayerTest,
2341 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
2342
2343 TEST_DESCRIPTION(
2344 "Two command buffers, each in a separate QueueSubmit call "
2345 "submitted on separate queues, the second having a fence"
2346 "followed by two consecutive WaitForFences calls on the same fence.");
2347
Dustin Graves48458142016-04-29 16:11:55 -06002348 if ((m_device->queue_props.empty()) ||
2349 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002350 return;
2351
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002352 m_errorMonitor->ExpectSuccess();
2353
2354 VkFence fence;
2355 VkFenceCreateInfo fence_create_info{};
2356 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2357 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2358
2359 VkSemaphore semaphore;
2360 VkSemaphoreCreateInfo semaphore_create_info{};
2361 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2362 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2363 &semaphore);
2364
2365 VkCommandPool command_pool;
2366 VkCommandPoolCreateInfo pool_create_info{};
2367 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2368 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2369 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2370 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2371 &command_pool);
2372
2373 VkCommandBuffer command_buffer[2];
2374 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2375 command_buffer_allocate_info.sType =
2376 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2377 command_buffer_allocate_info.commandPool = command_pool;
2378 command_buffer_allocate_info.commandBufferCount = 2;
2379 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2380 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2381 command_buffer);
2382
2383 VkQueue queue = VK_NULL_HANDLE;
2384 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2385 1, &queue);
2386
2387 {
2388 VkCommandBufferBeginInfo begin_info{};
2389 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2390 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2391
2392 vkCmdPipelineBarrier(command_buffer[0],
2393 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2394 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2395 0, nullptr, 0, nullptr);
2396
2397 VkViewport viewport{};
2398 viewport.maxDepth = 1.0f;
2399 viewport.minDepth = 0.0f;
2400 viewport.width = 512;
2401 viewport.height = 512;
2402 viewport.x = 0;
2403 viewport.y = 0;
2404 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2405 vkEndCommandBuffer(command_buffer[0]);
2406 }
2407 {
2408 VkCommandBufferBeginInfo begin_info{};
2409 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2410 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2411
2412 VkViewport viewport{};
2413 viewport.maxDepth = 1.0f;
2414 viewport.minDepth = 0.0f;
2415 viewport.width = 512;
2416 viewport.height = 512;
2417 viewport.x = 0;
2418 viewport.y = 0;
2419 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2420 vkEndCommandBuffer(command_buffer[1]);
2421 }
2422 {
2423 VkSubmitInfo submit_info{};
2424 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2425 submit_info.commandBufferCount = 1;
2426 submit_info.pCommandBuffers = &command_buffer[0];
2427 submit_info.signalSemaphoreCount = 1;
2428 submit_info.pSignalSemaphores = &semaphore;
2429 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2430 }
2431 {
2432 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2433 VkSubmitInfo submit_info{};
2434 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2435 submit_info.commandBufferCount = 1;
2436 submit_info.pCommandBuffers = &command_buffer[1];
2437 submit_info.waitSemaphoreCount = 1;
2438 submit_info.pWaitSemaphores = &semaphore;
2439 submit_info.pWaitDstStageMask = flags;
2440 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2441 }
2442
2443 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2444 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2445
2446 vkDestroyFence(m_device->device(), fence, nullptr);
2447 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2448 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2449 &command_buffer[0]);
2450 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2451
2452 m_errorMonitor->VerifyNotFound();
2453}
2454
2455// This is a positive test. No errors should be generated.
2456TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
2457
2458 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2459 "submitted on separate queues, the second having a fence, "
2460 "followed by a WaitForFences call.");
2461
Dustin Graves48458142016-04-29 16:11:55 -06002462 if ((m_device->queue_props.empty()) ||
2463 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002464 return;
2465
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002466 m_errorMonitor->ExpectSuccess();
2467
2468 VkFence fence;
2469 VkFenceCreateInfo fence_create_info{};
2470 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2471 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2472
2473 VkSemaphore semaphore;
2474 VkSemaphoreCreateInfo semaphore_create_info{};
2475 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2476 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2477 &semaphore);
2478
2479 VkCommandPool command_pool;
2480 VkCommandPoolCreateInfo pool_create_info{};
2481 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2482 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2483 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2484 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2485 &command_pool);
2486
2487 VkCommandBuffer command_buffer[2];
2488 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2489 command_buffer_allocate_info.sType =
2490 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2491 command_buffer_allocate_info.commandPool = command_pool;
2492 command_buffer_allocate_info.commandBufferCount = 2;
2493 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2494 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2495 command_buffer);
2496
2497 VkQueue queue = VK_NULL_HANDLE;
2498 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2499 1, &queue);
2500
2501
2502 {
2503 VkCommandBufferBeginInfo begin_info{};
2504 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2505 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2506
2507 vkCmdPipelineBarrier(command_buffer[0],
2508 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2509 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2510 0, nullptr, 0, nullptr);
2511
2512 VkViewport viewport{};
2513 viewport.maxDepth = 1.0f;
2514 viewport.minDepth = 0.0f;
2515 viewport.width = 512;
2516 viewport.height = 512;
2517 viewport.x = 0;
2518 viewport.y = 0;
2519 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2520 vkEndCommandBuffer(command_buffer[0]);
2521 }
2522 {
2523 VkCommandBufferBeginInfo begin_info{};
2524 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2525 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2526
2527 VkViewport viewport{};
2528 viewport.maxDepth = 1.0f;
2529 viewport.minDepth = 0.0f;
2530 viewport.width = 512;
2531 viewport.height = 512;
2532 viewport.x = 0;
2533 viewport.y = 0;
2534 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2535 vkEndCommandBuffer(command_buffer[1]);
2536 }
2537 {
2538 VkSubmitInfo submit_info{};
2539 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2540 submit_info.commandBufferCount = 1;
2541 submit_info.pCommandBuffers = &command_buffer[0];
2542 submit_info.signalSemaphoreCount = 1;
2543 submit_info.pSignalSemaphores = &semaphore;
2544 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2545 }
2546 {
2547 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2548 VkSubmitInfo submit_info{};
2549 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2550 submit_info.commandBufferCount = 1;
2551 submit_info.pCommandBuffers = &command_buffer[1];
2552 submit_info.waitSemaphoreCount = 1;
2553 submit_info.pWaitSemaphores = &semaphore;
2554 submit_info.pWaitDstStageMask = flags;
2555 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2556 }
2557
2558 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2559
2560 vkDestroyFence(m_device->device(), fence, nullptr);
2561 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2562 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2563 &command_buffer[0]);
2564 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2565
2566 m_errorMonitor->VerifyNotFound();
2567}
2568
2569// This is a positive test. No errors should be generated.
2570TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
2571
2572 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2573 "on the same queue, sharing a signal/wait semaphore, the "
2574 "second having a fence, "
2575 "followed by a WaitForFences call.");
2576
2577 m_errorMonitor->ExpectSuccess();
2578
2579 VkFence fence;
2580 VkFenceCreateInfo fence_create_info{};
2581 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2582 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2583
2584 VkSemaphore semaphore;
2585 VkSemaphoreCreateInfo semaphore_create_info{};
2586 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2587 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2588 &semaphore);
2589
2590 VkCommandPool command_pool;
2591 VkCommandPoolCreateInfo pool_create_info{};
2592 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2593 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2594 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2595 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2596 &command_pool);
2597
2598 VkCommandBuffer command_buffer[2];
2599 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2600 command_buffer_allocate_info.sType =
2601 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2602 command_buffer_allocate_info.commandPool = command_pool;
2603 command_buffer_allocate_info.commandBufferCount = 2;
2604 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2605 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2606 command_buffer);
2607
2608 {
2609 VkCommandBufferBeginInfo begin_info{};
2610 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2611 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2612
2613 vkCmdPipelineBarrier(command_buffer[0],
2614 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2615 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2616 0, nullptr, 0, nullptr);
2617
2618 VkViewport viewport{};
2619 viewport.maxDepth = 1.0f;
2620 viewport.minDepth = 0.0f;
2621 viewport.width = 512;
2622 viewport.height = 512;
2623 viewport.x = 0;
2624 viewport.y = 0;
2625 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2626 vkEndCommandBuffer(command_buffer[0]);
2627 }
2628 {
2629 VkCommandBufferBeginInfo begin_info{};
2630 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2631 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2632
2633 VkViewport viewport{};
2634 viewport.maxDepth = 1.0f;
2635 viewport.minDepth = 0.0f;
2636 viewport.width = 512;
2637 viewport.height = 512;
2638 viewport.x = 0;
2639 viewport.y = 0;
2640 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2641 vkEndCommandBuffer(command_buffer[1]);
2642 }
2643 {
2644 VkSubmitInfo submit_info{};
2645 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2646 submit_info.commandBufferCount = 1;
2647 submit_info.pCommandBuffers = &command_buffer[0];
2648 submit_info.signalSemaphoreCount = 1;
2649 submit_info.pSignalSemaphores = &semaphore;
2650 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2651 }
2652 {
2653 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2654 VkSubmitInfo submit_info{};
2655 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2656 submit_info.commandBufferCount = 1;
2657 submit_info.pCommandBuffers = &command_buffer[1];
2658 submit_info.waitSemaphoreCount = 1;
2659 submit_info.pWaitSemaphores = &semaphore;
2660 submit_info.pWaitDstStageMask = flags;
2661 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2662 }
2663
2664 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2665
2666 vkDestroyFence(m_device->device(), fence, nullptr);
2667 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2668 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2669 &command_buffer[0]);
2670 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2671
2672 m_errorMonitor->VerifyNotFound();
2673}
2674
2675// This is a positive test. No errors should be generated.
2676TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
2677
2678 TEST_DESCRIPTION(
2679 "Two command buffers, each in a separate QueueSubmit call "
2680 "on the same queue, no fences, followed by a third QueueSubmit with NO "
2681 "SubmitInfos but with a fence, followed by a WaitForFences call.");
2682
2683 m_errorMonitor->ExpectSuccess();
2684
2685 VkFence fence;
2686 VkFenceCreateInfo fence_create_info{};
2687 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2688 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2689
2690 VkCommandPool command_pool;
2691 VkCommandPoolCreateInfo pool_create_info{};
2692 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2693 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2694 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2695 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2696 &command_pool);
2697
2698 VkCommandBuffer command_buffer[2];
2699 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2700 command_buffer_allocate_info.sType =
2701 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2702 command_buffer_allocate_info.commandPool = command_pool;
2703 command_buffer_allocate_info.commandBufferCount = 2;
2704 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2705 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2706 command_buffer);
2707
2708 {
2709 VkCommandBufferBeginInfo begin_info{};
2710 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2711 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2712
2713 vkCmdPipelineBarrier(command_buffer[0],
2714 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2715 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2716 0, nullptr, 0, nullptr);
2717
2718 VkViewport viewport{};
2719 viewport.maxDepth = 1.0f;
2720 viewport.minDepth = 0.0f;
2721 viewport.width = 512;
2722 viewport.height = 512;
2723 viewport.x = 0;
2724 viewport.y = 0;
2725 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2726 vkEndCommandBuffer(command_buffer[0]);
2727 }
2728 {
2729 VkCommandBufferBeginInfo begin_info{};
2730 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2731 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2732
2733 VkViewport viewport{};
2734 viewport.maxDepth = 1.0f;
2735 viewport.minDepth = 0.0f;
2736 viewport.width = 512;
2737 viewport.height = 512;
2738 viewport.x = 0;
2739 viewport.y = 0;
2740 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2741 vkEndCommandBuffer(command_buffer[1]);
2742 }
2743 {
2744 VkSubmitInfo submit_info{};
2745 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2746 submit_info.commandBufferCount = 1;
2747 submit_info.pCommandBuffers = &command_buffer[0];
2748 submit_info.signalSemaphoreCount = 0;
2749 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2750 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2751 }
2752 {
2753 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2754 VkSubmitInfo submit_info{};
2755 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2756 submit_info.commandBufferCount = 1;
2757 submit_info.pCommandBuffers = &command_buffer[1];
2758 submit_info.waitSemaphoreCount = 0;
2759 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2760 submit_info.pWaitDstStageMask = flags;
2761 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2762 }
2763
2764 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
2765
2766 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2767
2768 vkDestroyFence(m_device->device(), fence, nullptr);
2769 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2770 &command_buffer[0]);
2771 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2772
2773 m_errorMonitor->VerifyNotFound();
2774}
2775
2776// This is a positive test. No errors should be generated.
2777TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
2778
2779 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2780 "on the same queue, the second having a fence, followed "
2781 "by a WaitForFences call.");
2782
2783 m_errorMonitor->ExpectSuccess();
2784
2785 VkFence fence;
2786 VkFenceCreateInfo fence_create_info{};
2787 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2788 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2789
2790 VkCommandPool command_pool;
2791 VkCommandPoolCreateInfo pool_create_info{};
2792 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2793 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2794 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2795 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2796 &command_pool);
2797
2798 VkCommandBuffer command_buffer[2];
2799 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2800 command_buffer_allocate_info.sType =
2801 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2802 command_buffer_allocate_info.commandPool = command_pool;
2803 command_buffer_allocate_info.commandBufferCount = 2;
2804 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2805 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2806 command_buffer);
2807
2808 {
2809 VkCommandBufferBeginInfo begin_info{};
2810 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2811 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2812
2813 vkCmdPipelineBarrier(command_buffer[0],
2814 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2815 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2816 0, nullptr, 0, nullptr);
2817
2818 VkViewport viewport{};
2819 viewport.maxDepth = 1.0f;
2820 viewport.minDepth = 0.0f;
2821 viewport.width = 512;
2822 viewport.height = 512;
2823 viewport.x = 0;
2824 viewport.y = 0;
2825 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2826 vkEndCommandBuffer(command_buffer[0]);
2827 }
2828 {
2829 VkCommandBufferBeginInfo begin_info{};
2830 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2831 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2832
2833 VkViewport viewport{};
2834 viewport.maxDepth = 1.0f;
2835 viewport.minDepth = 0.0f;
2836 viewport.width = 512;
2837 viewport.height = 512;
2838 viewport.x = 0;
2839 viewport.y = 0;
2840 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2841 vkEndCommandBuffer(command_buffer[1]);
2842 }
2843 {
2844 VkSubmitInfo submit_info{};
2845 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2846 submit_info.commandBufferCount = 1;
2847 submit_info.pCommandBuffers = &command_buffer[0];
2848 submit_info.signalSemaphoreCount = 0;
2849 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2850 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2851 }
2852 {
2853 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2854 VkSubmitInfo submit_info{};
2855 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2856 submit_info.commandBufferCount = 1;
2857 submit_info.pCommandBuffers = &command_buffer[1];
2858 submit_info.waitSemaphoreCount = 0;
2859 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2860 submit_info.pWaitDstStageMask = flags;
2861 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2862 }
2863
2864 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2865
2866 vkDestroyFence(m_device->device(), fence, nullptr);
2867 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2868 &command_buffer[0]);
2869 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2870
2871 m_errorMonitor->VerifyNotFound();
2872}
2873
2874// This is a positive test. No errors should be generated.
2875TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
2876
2877 TEST_DESCRIPTION(
2878 "Two command buffers each in a separate SubmitInfo sent in a single "
2879 "QueueSubmit call followed by a WaitForFences call.");
2880
2881 m_errorMonitor->ExpectSuccess();
2882
2883 VkFence fence;
2884 VkFenceCreateInfo fence_create_info{};
2885 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2886 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2887
2888 VkSemaphore semaphore;
2889 VkSemaphoreCreateInfo semaphore_create_info{};
2890 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2891 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2892 &semaphore);
2893
2894 VkCommandPool command_pool;
2895 VkCommandPoolCreateInfo pool_create_info{};
2896 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2897 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2898 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2899 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2900 &command_pool);
2901
2902 VkCommandBuffer command_buffer[2];
2903 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2904 command_buffer_allocate_info.sType =
2905 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2906 command_buffer_allocate_info.commandPool = command_pool;
2907 command_buffer_allocate_info.commandBufferCount = 2;
2908 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2909 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2910 command_buffer);
2911
2912 {
2913 VkCommandBufferBeginInfo begin_info{};
2914 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2915 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2916
2917 vkCmdPipelineBarrier(command_buffer[0],
2918 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2919 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2920 0, nullptr, 0, nullptr);
2921
2922 VkViewport viewport{};
2923 viewport.maxDepth = 1.0f;
2924 viewport.minDepth = 0.0f;
2925 viewport.width = 512;
2926 viewport.height = 512;
2927 viewport.x = 0;
2928 viewport.y = 0;
2929 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2930 vkEndCommandBuffer(command_buffer[0]);
2931 }
2932 {
2933 VkCommandBufferBeginInfo begin_info{};
2934 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2935 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2936
2937 VkViewport viewport{};
2938 viewport.maxDepth = 1.0f;
2939 viewport.minDepth = 0.0f;
2940 viewport.width = 512;
2941 viewport.height = 512;
2942 viewport.x = 0;
2943 viewport.y = 0;
2944 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2945 vkEndCommandBuffer(command_buffer[1]);
2946 }
2947 {
2948 VkSubmitInfo submit_info[2];
2949 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2950
2951 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2952 submit_info[0].pNext = NULL;
2953 submit_info[0].commandBufferCount = 1;
2954 submit_info[0].pCommandBuffers = &command_buffer[0];
2955 submit_info[0].signalSemaphoreCount = 1;
2956 submit_info[0].pSignalSemaphores = &semaphore;
2957 submit_info[0].waitSemaphoreCount = 0;
2958 submit_info[0].pWaitSemaphores = NULL;
2959 submit_info[0].pWaitDstStageMask = 0;
2960
2961 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2962 submit_info[1].pNext = NULL;
2963 submit_info[1].commandBufferCount = 1;
2964 submit_info[1].pCommandBuffers = &command_buffer[1];
2965 submit_info[1].waitSemaphoreCount = 1;
2966 submit_info[1].pWaitSemaphores = &semaphore;
2967 submit_info[1].pWaitDstStageMask = flags;
2968 submit_info[1].signalSemaphoreCount = 0;
2969 submit_info[1].pSignalSemaphores = NULL;
2970 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
2971 }
2972
2973 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2974
2975 vkDestroyFence(m_device->device(), fence, nullptr);
2976 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2977 &command_buffer[0]);
2978 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2979
2980 m_errorMonitor->VerifyNotFound();
2981}
2982
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002983TEST_F(VkLayerTest, DynamicStatesNotBound) {
2984 TEST_DESCRIPTION(
2985 "Run a series of simple draw calls to validate all the different "
2986 "failure cases that can occur when dynamic state is required but not "
2987 "correctly bound."
2988 "Here are the different dynamic state cases verified by this test:\n"
2989 "-Line Width\n-Depth Bias\n-Viewport State\n-Scissor State\n-Blend "
2990 "State\n-Depth Bounds\n-Stencil Read Mask\n-Stencil Write "
2991 "Mask\n-Stencil Reference");
2992
2993 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07002994 m_errorMonitor->SetDesiredFailureMsg(
2995 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002996 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002997 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2998 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002999 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003000 // Dynamic depth bias
Karl Schultz6addd812016-02-02 17:17:23 -07003001 m_errorMonitor->SetDesiredFailureMsg(
3002 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003003 "Dynamic depth bias state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003004 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3005 BsoFailDepthBias);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003006 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003007 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07003008 m_errorMonitor->SetDesiredFailureMsg(
3009 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003010 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003011 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3012 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003013 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003014 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07003015 m_errorMonitor->SetDesiredFailureMsg(
3016 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003017 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003018 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3019 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003020 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003021 // Dynamic blend state
Karl Schultz6addd812016-02-02 17:17:23 -07003022 m_errorMonitor->SetDesiredFailureMsg(
3023 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003024 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003025 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3026 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003027 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003028 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07003029 m_errorMonitor->SetDesiredFailureMsg(
3030 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003031 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003032 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3033 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003034 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003035 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07003036 m_errorMonitor->SetDesiredFailureMsg(
3037 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003038 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003039 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3040 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003041 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003042 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07003043 m_errorMonitor->SetDesiredFailureMsg(
3044 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003045 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003046 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3047 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003048 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06003049}
3050
Karl Schultz6addd812016-02-02 17:17:23 -07003051TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003052 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003053
Karl Schultz6addd812016-02-02 17:17:23 -07003054 m_errorMonitor->SetDesiredFailureMsg(
3055 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3056 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
3057 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003058
3059 VkFenceCreateInfo fenceInfo = {};
3060 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3061 fenceInfo.pNext = NULL;
3062 fenceInfo.flags = 0;
3063
3064 ASSERT_NO_FATAL_FAILURE(InitState());
3065 ASSERT_NO_FATAL_FAILURE(InitViewport());
3066 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3067
Karl Schultz6addd812016-02-02 17:17:23 -07003068 // We luck out b/c by default the framework creates CB w/ the
3069 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003070 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003071 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
3072 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003073 EndCommandBuffer();
3074
3075 testFence.init(*m_device, fenceInfo);
3076
3077 // Bypass framework since it does the waits automatically
3078 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003079 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003080 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3081 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003082 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003083 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003084 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003085 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003086 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003087 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003088 submit_info.pSignalSemaphores = NULL;
3089
Karl Schultz6addd812016-02-02 17:17:23 -07003090 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
3091 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003092
Karl Schultz6addd812016-02-02 17:17:23 -07003093 // Cause validation error by re-submitting cmd buffer that should only be
3094 // submitted once
3095 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003096
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003097 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003098}
3099
Karl Schultz6addd812016-02-02 17:17:23 -07003100TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003101 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07003102 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003103
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003105 "Unable to allocate 1 descriptors of "
3106 "type "
3107 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003108
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003109 ASSERT_NO_FATAL_FAILURE(InitState());
3110 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003111
Karl Schultz6addd812016-02-02 17:17:23 -07003112 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
3113 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003114 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003115 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3116 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003117
3118 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003119 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3120 ds_pool_ci.pNext = NULL;
3121 ds_pool_ci.flags = 0;
3122 ds_pool_ci.maxSets = 1;
3123 ds_pool_ci.poolSizeCount = 1;
3124 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003125
3126 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003127 err =
3128 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003129 ASSERT_VK_SUCCESS(err);
3130
3131 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003132 dsl_binding.binding = 0;
3133 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3134 dsl_binding.descriptorCount = 1;
3135 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3136 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003137
3138 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003139 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3140 ds_layout_ci.pNext = NULL;
3141 ds_layout_ci.bindingCount = 1;
3142 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003143
3144 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003145 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3146 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003147 ASSERT_VK_SUCCESS(err);
3148
3149 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003150 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003151 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003152 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003153 alloc_info.descriptorPool = ds_pool;
3154 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003155 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3156 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003157
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003158 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003159
Chia-I Wuf7458c52015-10-26 21:10:41 +08003160 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3161 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003162}
3163
Karl Schultz6addd812016-02-02 17:17:23 -07003164TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
3165 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06003166
Karl Schultz6addd812016-02-02 17:17:23 -07003167 m_errorMonitor->SetDesiredFailureMsg(
3168 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3169 "It is invalid to call vkFreeDescriptorSets() with a pool created "
3170 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003171
Tobin Ehlise735c692015-10-08 13:13:50 -06003172 ASSERT_NO_FATAL_FAILURE(InitState());
3173 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06003174
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003175 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003176 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3177 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06003178
3179 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003180 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3181 ds_pool_ci.pNext = NULL;
3182 ds_pool_ci.maxSets = 1;
3183 ds_pool_ci.poolSizeCount = 1;
3184 ds_pool_ci.flags = 0;
3185 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
3186 // app can only call vkResetDescriptorPool on this pool.;
3187 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06003188
3189 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003190 err =
3191 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06003192 ASSERT_VK_SUCCESS(err);
3193
3194 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003195 dsl_binding.binding = 0;
3196 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3197 dsl_binding.descriptorCount = 1;
3198 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3199 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06003200
3201 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003202 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3203 ds_layout_ci.pNext = NULL;
3204 ds_layout_ci.bindingCount = 1;
3205 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06003206
3207 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003208 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3209 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06003210 ASSERT_VK_SUCCESS(err);
3211
3212 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003213 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003214 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003215 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003216 alloc_info.descriptorPool = ds_pool;
3217 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003218 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3219 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06003220 ASSERT_VK_SUCCESS(err);
3221
3222 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003223 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06003224
Chia-I Wuf7458c52015-10-26 21:10:41 +08003225 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3226 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06003227}
3228
Karl Schultz6addd812016-02-02 17:17:23 -07003229TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003230 // Attempt to clear Descriptor Pool with bad object.
3231 // ObjectTracker should catch this.
3232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3233 "Invalid VkDescriptorPool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003234 uint64_t fake_pool_handle = 0xbaad6001;
3235 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
3236 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06003237 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003238}
3239
Karl Schultz6addd812016-02-02 17:17:23 -07003240TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003241 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
3242 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003243 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06003244 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003245
3246 uint64_t fake_set_handle = 0xbaad6001;
3247 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003248 VkResult err;
3249 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3250 "Invalid VkDescriptorSet Object 0xbaad6001");
3251
3252 ASSERT_NO_FATAL_FAILURE(InitState());
3253
3254 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
3255 layout_bindings[0].binding = 0;
3256 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3257 layout_bindings[0].descriptorCount = 1;
3258 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3259 layout_bindings[0].pImmutableSamplers = NULL;
3260
3261 VkDescriptorSetLayout descriptor_set_layout;
3262 VkDescriptorSetLayoutCreateInfo dslci = {};
3263 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3264 dslci.pNext = NULL;
3265 dslci.bindingCount = 1;
3266 dslci.pBindings = layout_bindings;
3267 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003268 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003269
3270 VkPipelineLayout pipeline_layout;
3271 VkPipelineLayoutCreateInfo plci = {};
3272 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3273 plci.pNext = NULL;
3274 plci.setLayoutCount = 1;
3275 plci.pSetLayouts = &descriptor_set_layout;
3276 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003277 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003278
3279 BeginCommandBuffer();
3280 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003281 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06003282 m_errorMonitor->VerifyFound();
3283 EndCommandBuffer();
3284 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
3285 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003286}
3287
Karl Schultz6addd812016-02-02 17:17:23 -07003288TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003289 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
3290 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003291 uint64_t fake_layout_handle = 0xbaad6001;
3292 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3294 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
3295
3296 VkPipelineLayout pipeline_layout;
3297 VkPipelineLayoutCreateInfo plci = {};
3298 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3299 plci.pNext = NULL;
3300 plci.setLayoutCount = 1;
3301 plci.pSetLayouts = &bad_layout;
3302 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
3303
3304 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003305}
3306
Karl Schultz6addd812016-02-02 17:17:23 -07003307TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003308 // Attempt to bind an invalid Pipeline to a valid Command Buffer
3309 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003310 // Create a valid cmd buffer
3311 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003312 uint64_t fake_pipeline_handle = 0xbaad6001;
3313 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3315 "Invalid VkPipeline Object 0xbaad6001");
3316 ASSERT_NO_FATAL_FAILURE(InitState());
3317 BeginCommandBuffer();
3318 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3319 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
3320 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06003321
3322 // Now issue a draw call with no pipeline bound
3323 m_errorMonitor->SetDesiredFailureMsg(
3324 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3325 "At Draw/Dispatch time no valid VkPipeline is bound!");
3326 ASSERT_NO_FATAL_FAILURE(InitState());
3327 BeginCommandBuffer();
3328 Draw(1, 0, 0, 0);
3329 m_errorMonitor->VerifyFound();
3330 // Finally same check once more but with Dispatch/Compute
3331 m_errorMonitor->SetDesiredFailureMsg(
3332 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3333 "At Draw/Dispatch time no valid VkPipeline is bound!");
3334 ASSERT_NO_FATAL_FAILURE(InitState());
3335 BeginCommandBuffer();
3336 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
3337 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003338}
3339
Karl Schultz6addd812016-02-02 17:17:23 -07003340TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
3341 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
3342 // CommandBuffer
3343 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003344
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003346 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003347
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003348 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06003349 ASSERT_NO_FATAL_FAILURE(InitViewport());
3350 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003351 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003352 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3353 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003354
3355 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003356 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3357 ds_pool_ci.pNext = NULL;
3358 ds_pool_ci.maxSets = 1;
3359 ds_pool_ci.poolSizeCount = 1;
3360 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06003361
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003362 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003363 err =
3364 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003365 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003366
Tony Barboureb254902015-07-15 12:50:33 -06003367 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003368 dsl_binding.binding = 0;
3369 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3370 dsl_binding.descriptorCount = 1;
3371 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3372 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003373
Tony Barboureb254902015-07-15 12:50:33 -06003374 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003375 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3376 ds_layout_ci.pNext = NULL;
3377 ds_layout_ci.bindingCount = 1;
3378 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003379 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003380 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3381 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003382 ASSERT_VK_SUCCESS(err);
3383
3384 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003385 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003386 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003387 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003388 alloc_info.descriptorPool = ds_pool;
3389 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003390 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3391 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003392 ASSERT_VK_SUCCESS(err);
3393
Tony Barboureb254902015-07-15 12:50:33 -06003394 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003395 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3396 pipeline_layout_ci.pNext = NULL;
3397 pipeline_layout_ci.setLayoutCount = 1;
3398 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003399
3400 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003401 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3402 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003403 ASSERT_VK_SUCCESS(err);
3404
Karl Schultz6addd812016-02-02 17:17:23 -07003405 VkShaderObj vs(m_device, bindStateVertShaderText,
3406 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06003407 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07003408 // on more devices
3409 VkShaderObj fs(m_device, bindStateFragShaderText,
3410 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003411
Tony Barbourc95e4ac2015-08-04 17:05:26 -06003412 VkPipelineObj pipe(m_device);
3413 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06003414 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06003415 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06003416 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06003417
3418 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003419 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3420 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3421 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3422 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3423 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003424
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003425 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003426
Chia-I Wuf7458c52015-10-26 21:10:41 +08003427 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3428 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3429 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003430}
3431
Karl Schultz6addd812016-02-02 17:17:23 -07003432TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003433 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07003434 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003435
Karl Schultz6addd812016-02-02 17:17:23 -07003436 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003437 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
3438 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003439
3440 ASSERT_NO_FATAL_FAILURE(InitState());
3441 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003442 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3443 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003444
3445 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003446 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3447 ds_pool_ci.pNext = NULL;
3448 ds_pool_ci.maxSets = 1;
3449 ds_pool_ci.poolSizeCount = 1;
3450 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003451
3452 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003453 err =
3454 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003455 ASSERT_VK_SUCCESS(err);
3456
3457 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003458 dsl_binding.binding = 0;
3459 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3460 dsl_binding.descriptorCount = 1;
3461 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3462 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003463
3464 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003465 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3466 ds_layout_ci.pNext = NULL;
3467 ds_layout_ci.bindingCount = 1;
3468 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003469 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003470 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3471 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003472 ASSERT_VK_SUCCESS(err);
3473
3474 VkDescriptorSet descriptorSet;
3475 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003476 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003477 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003478 alloc_info.descriptorPool = ds_pool;
3479 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003480 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3481 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003482 ASSERT_VK_SUCCESS(err);
3483
Karl Schultz6addd812016-02-02 17:17:23 -07003484 VkBufferView view =
3485 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003486 VkWriteDescriptorSet descriptor_write;
3487 memset(&descriptor_write, 0, sizeof(descriptor_write));
3488 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3489 descriptor_write.dstSet = descriptorSet;
3490 descriptor_write.dstBinding = 0;
3491 descriptor_write.descriptorCount = 1;
3492 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3493 descriptor_write.pTexelBufferView = &view;
3494
3495 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3496
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003497 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003498
3499 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3500 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3501}
3502
Karl Schultz6addd812016-02-02 17:17:23 -07003503TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
3504 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
3505 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07003506 // 1. No dynamicOffset supplied
3507 // 2. Too many dynamicOffsets supplied
3508 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07003509 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003511 " requires 1 dynamicOffsets, but only "
3512 "0 dynamicOffsets are left in "
3513 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003514
3515 ASSERT_NO_FATAL_FAILURE(InitState());
3516 ASSERT_NO_FATAL_FAILURE(InitViewport());
3517 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3518
3519 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003520 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3521 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003522
3523 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003524 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3525 ds_pool_ci.pNext = NULL;
3526 ds_pool_ci.maxSets = 1;
3527 ds_pool_ci.poolSizeCount = 1;
3528 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003529
3530 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003531 err =
3532 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003533 ASSERT_VK_SUCCESS(err);
3534
3535 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003536 dsl_binding.binding = 0;
3537 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3538 dsl_binding.descriptorCount = 1;
3539 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3540 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003541
3542 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003543 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3544 ds_layout_ci.pNext = NULL;
3545 ds_layout_ci.bindingCount = 1;
3546 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003547 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003548 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3549 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003550 ASSERT_VK_SUCCESS(err);
3551
3552 VkDescriptorSet descriptorSet;
3553 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003554 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003555 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003556 alloc_info.descriptorPool = ds_pool;
3557 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003558 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3559 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003560 ASSERT_VK_SUCCESS(err);
3561
3562 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003563 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3564 pipeline_layout_ci.pNext = NULL;
3565 pipeline_layout_ci.setLayoutCount = 1;
3566 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003567
3568 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003569 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3570 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003571 ASSERT_VK_SUCCESS(err);
3572
3573 // Create a buffer to update the descriptor with
3574 uint32_t qfi = 0;
3575 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003576 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3577 buffCI.size = 1024;
3578 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3579 buffCI.queueFamilyIndexCount = 1;
3580 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003581
3582 VkBuffer dyub;
3583 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3584 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003585 // Allocate memory and bind to buffer so we can make it to the appropriate
3586 // error
3587 VkMemoryAllocateInfo mem_alloc = {};
3588 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3589 mem_alloc.pNext = NULL;
3590 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12003591 mem_alloc.memoryTypeIndex = 0;
3592
3593 VkMemoryRequirements memReqs;
3594 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
3595 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
3596 0);
3597 if (!pass) {
3598 vkDestroyBuffer(m_device->device(), dyub, NULL);
3599 return;
3600 }
3601
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003602 VkDeviceMemory mem;
3603 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3604 ASSERT_VK_SUCCESS(err);
3605 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
3606 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003607 // Correctly update descriptor to avoid "NOT_UPDATED" error
3608 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003609 buffInfo.buffer = dyub;
3610 buffInfo.offset = 0;
3611 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003612
3613 VkWriteDescriptorSet descriptor_write;
3614 memset(&descriptor_write, 0, sizeof(descriptor_write));
3615 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3616 descriptor_write.dstSet = descriptorSet;
3617 descriptor_write.dstBinding = 0;
3618 descriptor_write.descriptorCount = 1;
3619 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3620 descriptor_write.pBufferInfo = &buffInfo;
3621
3622 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3623
3624 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003625 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3626 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3627 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003628 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003629 uint32_t pDynOff[2] = {512, 756};
3630 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07003631 m_errorMonitor->SetDesiredFailureMsg(
3632 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07003633 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07003634 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3635 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3636 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12003637 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003638 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003639 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3640 " dynamic offset 512 combined with "
3641 "offset 0 and range 1024 that "
3642 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07003643 // Create PSO to be used for draw-time errors below
3644 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003645 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003646 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003647 "out gl_PerVertex { \n"
3648 " vec4 gl_Position;\n"
3649 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003650 "void main(){\n"
3651 " gl_Position = vec4(1);\n"
3652 "}\n";
3653 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003654 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003655 "\n"
3656 "layout(location=0) out vec4 x;\n"
3657 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3658 "void main(){\n"
3659 " x = vec4(bar.y);\n"
3660 "}\n";
3661 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3662 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3663 VkPipelineObj pipe(m_device);
3664 pipe.AddShader(&vs);
3665 pipe.AddShader(&fs);
3666 pipe.AddColorAttachment();
3667 pipe.CreateVKPipeline(pipeline_layout, renderPass());
3668
Karl Schultz6addd812016-02-02 17:17:23 -07003669 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3670 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3671 // This update should succeed, but offset size of 512 will overstep buffer
3672 // /w range 1024 & size 1024
3673 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3674 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3675 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07003676 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003677 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003678
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003679 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06003680 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003681
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003682 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3683 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3684}
3685
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003686TEST_F(VkLayerTest, InvalidPushConstants) {
3687 // Hit push constant error cases:
3688 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
3689 // 2. Incorrectly set push constant size to 0
3690 // 3. Incorrectly set push constant size to non-multiple of 4
3691 // 4. Attempt push constant update that exceeds maxPushConstantSize
3692 VkResult err;
3693 m_errorMonitor->SetDesiredFailureMsg(
3694 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3695 "vkCreatePipelineLayout() call has push constants with offset ");
3696
3697 ASSERT_NO_FATAL_FAILURE(InitState());
3698 ASSERT_NO_FATAL_FAILURE(InitViewport());
3699 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3700
3701 VkPushConstantRange pc_range = {};
3702 pc_range.size = 0xFFFFFFFFu;
3703 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3704 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3705 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3706 pipeline_layout_ci.pushConstantRangeCount = 1;
3707 pipeline_layout_ci.pPushConstantRanges = &pc_range;
3708
3709 VkPipelineLayout pipeline_layout;
3710 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3711 &pipeline_layout);
3712
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003713 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003714 // Now cause errors due to size 0 and non-4 byte aligned size
3715 pc_range.size = 0;
3716 m_errorMonitor->SetDesiredFailureMsg(
3717 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3718 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
3719 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3720 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003721 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003722 pc_range.size = 1;
3723 m_errorMonitor->SetDesiredFailureMsg(
3724 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3725 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
3726 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3727 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003728 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003729 // Cause error due to bad size in vkCmdPushConstants() call
3730 m_errorMonitor->SetDesiredFailureMsg(
3731 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3732 "vkCmdPushConstants() call has push constants with offset ");
3733 pipeline_layout_ci.pushConstantRangeCount = 0;
3734 pipeline_layout_ci.pPushConstantRanges = NULL;
3735 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3736 &pipeline_layout);
3737 ASSERT_VK_SUCCESS(err);
3738 BeginCommandBuffer();
3739 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
3740 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003741 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003742 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3743}
3744
Karl Schultz6addd812016-02-02 17:17:23 -07003745TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003746 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07003747 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003748
3749 ASSERT_NO_FATAL_FAILURE(InitState());
3750 ASSERT_NO_FATAL_FAILURE(InitViewport());
3751 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3752
3753 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
3754 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003755 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3756 ds_type_count[0].descriptorCount = 10;
3757 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3758 ds_type_count[1].descriptorCount = 2;
3759 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3760 ds_type_count[2].descriptorCount = 2;
3761 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
3762 ds_type_count[3].descriptorCount = 5;
3763 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
3764 // type
3765 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3766 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
3767 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003768
3769 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003770 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3771 ds_pool_ci.pNext = NULL;
3772 ds_pool_ci.maxSets = 5;
3773 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
3774 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003775
3776 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003777 err =
3778 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003779 ASSERT_VK_SUCCESS(err);
3780
3781 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
3782 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003783 dsl_binding[0].binding = 0;
3784 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3785 dsl_binding[0].descriptorCount = 5;
3786 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3787 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003788
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003789 // Create layout identical to set0 layout but w/ different stageFlags
3790 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003791 dsl_fs_stage_only.binding = 0;
3792 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3793 dsl_fs_stage_only.descriptorCount = 5;
3794 dsl_fs_stage_only.stageFlags =
3795 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
3796 // bind time
3797 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003798 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003799 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3800 ds_layout_ci.pNext = NULL;
3801 ds_layout_ci.bindingCount = 1;
3802 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003803 static const uint32_t NUM_LAYOUTS = 4;
3804 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003805 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003806 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
3807 // layout for error case
3808 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3809 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003810 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003811 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003812 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3813 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003814 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003815 dsl_binding[0].binding = 0;
3816 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003817 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003818 dsl_binding[1].binding = 1;
3819 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3820 dsl_binding[1].descriptorCount = 2;
3821 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
3822 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003823 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003824 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003825 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3826 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003827 ASSERT_VK_SUCCESS(err);
3828 dsl_binding[0].binding = 0;
3829 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003830 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003831 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07003832 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3833 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003834 ASSERT_VK_SUCCESS(err);
3835 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003836 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003837 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3838 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003839 ASSERT_VK_SUCCESS(err);
3840
3841 static const uint32_t NUM_SETS = 4;
3842 VkDescriptorSet descriptorSet[NUM_SETS] = {};
3843 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003844 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003845 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003846 alloc_info.descriptorPool = ds_pool;
3847 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003848 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3849 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003850 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003851 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003852 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003853 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003854 err =
3855 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003856 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003857
3858 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003859 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3860 pipeline_layout_ci.pNext = NULL;
3861 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
3862 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003863
3864 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003865 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3866 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003867 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003868 // Create pipelineLayout with only one setLayout
3869 pipeline_layout_ci.setLayoutCount = 1;
3870 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003871 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3872 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003873 ASSERT_VK_SUCCESS(err);
3874 // Create pipelineLayout with 2 descriptor setLayout at index 0
3875 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
3876 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07003877 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3878 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003879 ASSERT_VK_SUCCESS(err);
3880 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
3881 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
3882 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07003883 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3884 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003885 ASSERT_VK_SUCCESS(err);
3886 // Create pipelineLayout with UB type, but stageFlags for FS only
3887 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
3888 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003889 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3890 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003891 ASSERT_VK_SUCCESS(err);
3892 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
3893 VkDescriptorSetLayout pl_bad_s0[2] = {};
3894 pl_bad_s0[0] = ds_layout_fs_only;
3895 pl_bad_s0[1] = ds_layout[1];
3896 pipeline_layout_ci.setLayoutCount = 2;
3897 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
3898 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07003899 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3900 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003901 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003902
3903 // Create a buffer to update the descriptor with
3904 uint32_t qfi = 0;
3905 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003906 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3907 buffCI.size = 1024;
3908 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3909 buffCI.queueFamilyIndexCount = 1;
3910 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003911
3912 VkBuffer dyub;
3913 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3914 ASSERT_VK_SUCCESS(err);
3915 // Correctly update descriptor to avoid "NOT_UPDATED" error
3916 static const uint32_t NUM_BUFFS = 5;
3917 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003918 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003919 buffInfo[i].buffer = dyub;
3920 buffInfo[i].offset = 0;
3921 buffInfo[i].range = 1024;
3922 }
Karl Schultz6addd812016-02-02 17:17:23 -07003923 VkImage image;
3924 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3925 const int32_t tex_width = 32;
3926 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003927 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003928 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3929 image_create_info.pNext = NULL;
3930 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3931 image_create_info.format = tex_format;
3932 image_create_info.extent.width = tex_width;
3933 image_create_info.extent.height = tex_height;
3934 image_create_info.extent.depth = 1;
3935 image_create_info.mipLevels = 1;
3936 image_create_info.arrayLayers = 1;
3937 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3938 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3939 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3940 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003941 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3942 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003943
Karl Schultz6addd812016-02-02 17:17:23 -07003944 VkMemoryRequirements memReqs;
3945 VkDeviceMemory imageMem;
3946 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003947 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003948 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3949 memAlloc.pNext = NULL;
3950 memAlloc.allocationSize = 0;
3951 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003952 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
3953 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003954 pass =
3955 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003956 ASSERT_TRUE(pass);
3957 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
3958 ASSERT_VK_SUCCESS(err);
3959 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
3960 ASSERT_VK_SUCCESS(err);
3961
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003962 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003963 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3964 image_view_create_info.image = image;
3965 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
3966 image_view_create_info.format = tex_format;
3967 image_view_create_info.subresourceRange.layerCount = 1;
3968 image_view_create_info.subresourceRange.baseMipLevel = 0;
3969 image_view_create_info.subresourceRange.levelCount = 1;
3970 image_view_create_info.subresourceRange.aspectMask =
3971 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003972
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003973 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07003974 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
3975 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003976 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003977 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003978 imageInfo[0].imageView = view;
3979 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3980 imageInfo[1].imageView = view;
3981 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003982 imageInfo[2].imageView = view;
3983 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3984 imageInfo[3].imageView = view;
3985 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003986
3987 static const uint32_t NUM_SET_UPDATES = 3;
3988 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
3989 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3990 descriptor_write[0].dstSet = descriptorSet[0];
3991 descriptor_write[0].dstBinding = 0;
3992 descriptor_write[0].descriptorCount = 5;
3993 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3994 descriptor_write[0].pBufferInfo = buffInfo;
3995 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3996 descriptor_write[1].dstSet = descriptorSet[1];
3997 descriptor_write[1].dstBinding = 0;
3998 descriptor_write[1].descriptorCount = 2;
3999 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
4000 descriptor_write[1].pImageInfo = imageInfo;
4001 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4002 descriptor_write[2].dstSet = descriptorSet[1];
4003 descriptor_write[2].dstBinding = 1;
4004 descriptor_write[2].descriptorCount = 2;
4005 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004006 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004007
4008 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004009
Tobin Ehlis88452832015-12-03 09:40:56 -07004010 // Create PSO to be used for draw-time errors below
4011 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004012 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004013 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07004014 "out gl_PerVertex {\n"
4015 " vec4 gl_Position;\n"
4016 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004017 "void main(){\n"
4018 " gl_Position = vec4(1);\n"
4019 "}\n";
4020 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004021 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004022 "\n"
4023 "layout(location=0) out vec4 x;\n"
4024 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
4025 "void main(){\n"
4026 " x = vec4(bar.y);\n"
4027 "}\n";
4028 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4029 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004030 VkPipelineObj pipe(m_device);
4031 pipe.AddShader(&vs);
4032 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07004033 pipe.AddColorAttachment();
4034 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07004035
4036 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07004037
Karl Schultz6addd812016-02-02 17:17:23 -07004038 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4039 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4040 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
4041 // of PSO
4042 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
4043 // cmd_pipeline.c
4044 // due to the fact that cmd_alloc_dset_data() has not been called in
4045 // cmd_bind_graphics_pipeline()
4046 // TODO : Want to cause various binding incompatibility issues here to test
4047 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07004048 // First cause various verify_layout_compatibility() fails
4049 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004050 // verify_set_layout_compatibility fail cases:
4051 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07004052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4053 " due to: invalid VkPipelineLayout ");
4054 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4055 VK_PIPELINE_BIND_POINT_GRAPHICS,
4056 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
4057 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004058 m_errorMonitor->VerifyFound();
4059
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004060 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07004061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4062 " attempting to bind set to index 1");
4063 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4064 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
4065 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004066 m_errorMonitor->VerifyFound();
4067
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004068 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004069 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
4070 // descriptors
4071 m_errorMonitor->SetDesiredFailureMsg(
4072 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06004073 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07004074 vkCmdBindDescriptorSets(
4075 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4076 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004077 m_errorMonitor->VerifyFound();
4078
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004079 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
4080 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07004081 m_errorMonitor->SetDesiredFailureMsg(
4082 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06004083 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07004084 vkCmdBindDescriptorSets(
4085 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4086 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004087 m_errorMonitor->VerifyFound();
4088
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004089 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
4090 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07004091 m_errorMonitor->SetDesiredFailureMsg(
4092 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06004093 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07004094 vkCmdBindDescriptorSets(
4095 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4096 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004097 m_errorMonitor->VerifyFound();
4098
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004099 // Cause INFO messages due to disturbing previously bound Sets
4100 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07004101 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4102 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4103 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004104 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07004105 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004106 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004107 " previously bound as set #0 was disturbed ");
4108 vkCmdBindDescriptorSets(
4109 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4110 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004111 m_errorMonitor->VerifyFound();
4112
Karl Schultz6addd812016-02-02 17:17:23 -07004113 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4114 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4115 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004116 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004118 " newly bound as set #0 so set #1 and "
4119 "any subsequent sets were disturbed ");
4120 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4121 VK_PIPELINE_BIND_POINT_GRAPHICS,
4122 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004123 m_errorMonitor->VerifyFound();
4124
Tobin Ehlis88452832015-12-03 09:40:56 -07004125 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07004126 // 1. Error due to not binding required set (we actually use same code as
4127 // above to disturb set0)
4128 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4129 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4130 2, &descriptorSet[0], 0, NULL);
4131 vkCmdBindDescriptorSets(
4132 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4133 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
4134 m_errorMonitor->SetDesiredFailureMsg(
4135 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4136 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07004137 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004138 m_errorMonitor->VerifyFound();
4139
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004140 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004141 // 2. Error due to bound set not being compatible with PSO's
4142 // VkPipelineLayout (diff stageFlags in this case)
4143 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4144 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4145 2, &descriptorSet[0], 0, NULL);
4146 m_errorMonitor->SetDesiredFailureMsg(
4147 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4148 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07004149 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004150 m_errorMonitor->VerifyFound();
4151
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004152 // Remaining clean-up
4153 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004154 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004155 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
4156 }
4157 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06004158 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
4159 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004160 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004161 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4162 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4163}
Tobin Ehlis559c6382015-11-05 09:52:49 -07004164
Karl Schultz6addd812016-02-02 17:17:23 -07004165TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004166
Karl Schultz6addd812016-02-02 17:17:23 -07004167 m_errorMonitor->SetDesiredFailureMsg(
4168 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004169 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004170
4171 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004172 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004173 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004174 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004175
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004176 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004177}
4178
Karl Schultz6addd812016-02-02 17:17:23 -07004179TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
4180 VkResult err;
4181 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004182
Karl Schultz6addd812016-02-02 17:17:23 -07004183 m_errorMonitor->SetDesiredFailureMsg(
4184 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07004185 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004186
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004187 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004188
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004189 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004190 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06004191 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004192 cmd.commandPool = m_commandPool;
4193 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004194 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06004195
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004196 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06004197 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004198
4199 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004200 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07004201 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004202 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06004203 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07004204 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
4205 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004206 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004207
4208 // The error should be caught by validation of the BeginCommandBuffer call
4209 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
4210
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004211 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004212 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004213}
4214
Karl Schultz6addd812016-02-02 17:17:23 -07004215TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004216 // Cause error due to Begin while recording CB
4217 // Then cause 2 errors for attempting to reset CB w/o having
4218 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
4219 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004221 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004222
4223 ASSERT_NO_FATAL_FAILURE(InitState());
4224
4225 // Calls AllocateCommandBuffers
4226 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
4227
Karl Schultz6addd812016-02-02 17:17:23 -07004228 // Force the failure by setting the Renderpass and Framebuffer fields with
4229 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004230 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07004231 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004232 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4233 cmd_buf_info.pNext = NULL;
4234 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004235 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004236
4237 // Begin CB to transition to recording state
4238 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
4239 // Can't re-begin. This should trigger error
4240 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004241 m_errorMonitor->VerifyFound();
4242
Karl Schultz6addd812016-02-02 17:17:23 -07004243 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4244 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004245 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
4246 // Reset attempt will trigger error due to incorrect CommandPool state
4247 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004248 m_errorMonitor->VerifyFound();
4249
Karl Schultz6addd812016-02-02 17:17:23 -07004250 m_errorMonitor->SetDesiredFailureMsg(
4251 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4252 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004253 // Transition CB to RECORDED state
4254 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
4255 // Now attempting to Begin will implicitly reset, which triggers error
4256 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004257 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004258}
4259
Karl Schultz6addd812016-02-02 17:17:23 -07004260TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004261 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07004262 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004263
Karl Schultz6addd812016-02-02 17:17:23 -07004264 m_errorMonitor->SetDesiredFailureMsg(
4265 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004266 "Invalid Pipeline CreateInfo State: Vtx Shader required");
4267
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004268 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06004269 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004270
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004271 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004272 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4273 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004274
4275 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004276 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4277 ds_pool_ci.pNext = NULL;
4278 ds_pool_ci.maxSets = 1;
4279 ds_pool_ci.poolSizeCount = 1;
4280 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004281
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004282 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004283 err =
4284 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004285 ASSERT_VK_SUCCESS(err);
4286
Tony Barboureb254902015-07-15 12:50:33 -06004287 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004288 dsl_binding.binding = 0;
4289 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4290 dsl_binding.descriptorCount = 1;
4291 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4292 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004293
Tony Barboureb254902015-07-15 12:50:33 -06004294 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004295 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4296 ds_layout_ci.pNext = NULL;
4297 ds_layout_ci.bindingCount = 1;
4298 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004299
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004300 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004301 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4302 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004303 ASSERT_VK_SUCCESS(err);
4304
4305 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004306 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004307 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004308 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004309 alloc_info.descriptorPool = ds_pool;
4310 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004311 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4312 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004313 ASSERT_VK_SUCCESS(err);
4314
Tony Barboureb254902015-07-15 12:50:33 -06004315 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004316 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4317 pipeline_layout_ci.setLayoutCount = 1;
4318 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004319
4320 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004321 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4322 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004323 ASSERT_VK_SUCCESS(err);
4324
Tobin Ehlise68360f2015-10-01 11:15:13 -06004325 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07004326 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06004327
4328 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004329 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4330 vp_state_ci.scissorCount = 1;
4331 vp_state_ci.pScissors = &sc;
4332 vp_state_ci.viewportCount = 1;
4333 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004334
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004335 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4336 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4337 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4338 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4339 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4340 rs_state_ci.depthClampEnable = VK_FALSE;
4341 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4342 rs_state_ci.depthBiasEnable = VK_FALSE;
4343
Tony Barboureb254902015-07-15 12:50:33 -06004344 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004345 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4346 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004347 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004348 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4349 gp_ci.layout = pipeline_layout;
4350 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06004351
4352 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004353 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4354 pc_ci.initialDataSize = 0;
4355 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004356
4357 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06004358 VkPipelineCache pipelineCache;
4359
Karl Schultz6addd812016-02-02 17:17:23 -07004360 err =
4361 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06004362 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004363 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4364 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004365
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004366 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004367
Chia-I Wuf7458c52015-10-26 21:10:41 +08004368 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4369 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4370 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4371 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004372}
Tobin Ehlis912df022015-09-17 08:46:18 -06004373/*// TODO : This test should be good, but needs Tess support in compiler to run
4374TEST_F(VkLayerTest, InvalidPatchControlPoints)
4375{
4376 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06004377 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004378
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004380 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
4381primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004382
Tobin Ehlis912df022015-09-17 08:46:18 -06004383 ASSERT_NO_FATAL_FAILURE(InitState());
4384 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06004385
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004386 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06004387 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004388 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004389
4390 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4391 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4392 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004393 ds_pool_ci.poolSizeCount = 1;
4394 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06004395
4396 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004397 err = vkCreateDescriptorPool(m_device->device(),
4398VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06004399 ASSERT_VK_SUCCESS(err);
4400
4401 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08004402 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06004403 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08004404 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004405 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4406 dsl_binding.pImmutableSamplers = NULL;
4407
4408 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004409 ds_layout_ci.sType =
4410VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06004411 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004412 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004413 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06004414
4415 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004416 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4417&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06004418 ASSERT_VK_SUCCESS(err);
4419
4420 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004421 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
4422VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06004423 ASSERT_VK_SUCCESS(err);
4424
4425 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004426 pipeline_layout_ci.sType =
4427VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06004428 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004429 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004430 pipeline_layout_ci.pSetLayouts = &ds_layout;
4431
4432 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004433 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4434&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06004435 ASSERT_VK_SUCCESS(err);
4436
4437 VkPipelineShaderStageCreateInfo shaderStages[3];
4438 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
4439
Karl Schultz6addd812016-02-02 17:17:23 -07004440 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
4441this);
Tobin Ehlis912df022015-09-17 08:46:18 -06004442 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07004443 VkShaderObj
4444tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
4445this);
4446 VkShaderObj
4447te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
4448this);
Tobin Ehlis912df022015-09-17 08:46:18 -06004449
Karl Schultz6addd812016-02-02 17:17:23 -07004450 shaderStages[0].sType =
4451VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004452 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004453 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07004454 shaderStages[1].sType =
4455VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004456 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004457 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07004458 shaderStages[2].sType =
4459VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004460 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004461 shaderStages[2].shader = te.handle();
4462
4463 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004464 iaCI.sType =
4465VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08004466 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06004467
4468 VkPipelineTessellationStateCreateInfo tsCI = {};
4469 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
4470 tsCI.patchControlPoints = 0; // This will cause an error
4471
4472 VkGraphicsPipelineCreateInfo gp_ci = {};
4473 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4474 gp_ci.pNext = NULL;
4475 gp_ci.stageCount = 3;
4476 gp_ci.pStages = shaderStages;
4477 gp_ci.pVertexInputState = NULL;
4478 gp_ci.pInputAssemblyState = &iaCI;
4479 gp_ci.pTessellationState = &tsCI;
4480 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004481 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06004482 gp_ci.pMultisampleState = NULL;
4483 gp_ci.pDepthStencilState = NULL;
4484 gp_ci.pColorBlendState = NULL;
4485 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4486 gp_ci.layout = pipeline_layout;
4487 gp_ci.renderPass = renderPass();
4488
4489 VkPipelineCacheCreateInfo pc_ci = {};
4490 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4491 pc_ci.pNext = NULL;
4492 pc_ci.initialSize = 0;
4493 pc_ci.initialData = 0;
4494 pc_ci.maxSize = 0;
4495
4496 VkPipeline pipeline;
4497 VkPipelineCache pipelineCache;
4498
Karl Schultz6addd812016-02-02 17:17:23 -07004499 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
4500&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06004501 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004502 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4503&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06004504
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004505 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004506
Chia-I Wuf7458c52015-10-26 21:10:41 +08004507 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4508 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4509 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4510 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06004511}
4512*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06004513// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07004514TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07004515 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004516
Karl Schultz6addd812016-02-02 17:17:23 -07004517 m_errorMonitor->SetDesiredFailureMsg(
4518 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004519 "Gfx Pipeline viewport count (1) must match scissor count (0).");
4520
Tobin Ehlise68360f2015-10-01 11:15:13 -06004521 ASSERT_NO_FATAL_FAILURE(InitState());
4522 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004523
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004524 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004525 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4526 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004527
4528 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004529 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4530 ds_pool_ci.maxSets = 1;
4531 ds_pool_ci.poolSizeCount = 1;
4532 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004533
4534 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004535 err =
4536 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004537 ASSERT_VK_SUCCESS(err);
4538
4539 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004540 dsl_binding.binding = 0;
4541 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4542 dsl_binding.descriptorCount = 1;
4543 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004544
4545 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004546 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4547 ds_layout_ci.bindingCount = 1;
4548 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004549
4550 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004551 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4552 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004553 ASSERT_VK_SUCCESS(err);
4554
4555 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004556 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004557 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004558 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004559 alloc_info.descriptorPool = ds_pool;
4560 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004561 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4562 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004563 ASSERT_VK_SUCCESS(err);
4564
4565 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004566 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4567 pipeline_layout_ci.setLayoutCount = 1;
4568 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004569
4570 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004571 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4572 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004573 ASSERT_VK_SUCCESS(err);
4574
4575 VkViewport vp = {}; // Just need dummy vp to point to
4576
4577 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004578 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4579 vp_state_ci.scissorCount = 0;
4580 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
4581 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004582
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004583 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4584 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4585 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4586 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4587 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4588 rs_state_ci.depthClampEnable = VK_FALSE;
4589 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4590 rs_state_ci.depthBiasEnable = VK_FALSE;
4591
Cody Northropeb3a6c12015-10-05 14:44:45 -06004592 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004593 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004594
Karl Schultz6addd812016-02-02 17:17:23 -07004595 VkShaderObj vs(m_device, bindStateVertShaderText,
4596 VK_SHADER_STAGE_VERTEX_BIT, this);
4597 VkShaderObj fs(m_device, bindStateFragShaderText,
4598 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004599 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004600 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004601 shaderStages[0] = vs.GetStageCreateInfo();
4602 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004603
4604 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004605 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4606 gp_ci.stageCount = 2;
4607 gp_ci.pStages = shaderStages;
4608 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004609 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004610 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4611 gp_ci.layout = pipeline_layout;
4612 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004613
4614 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004615 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004616
4617 VkPipeline pipeline;
4618 VkPipelineCache pipelineCache;
4619
Karl Schultz6addd812016-02-02 17:17:23 -07004620 err =
4621 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004622 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004623 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4624 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004625
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004626 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004627
Chia-I Wuf7458c52015-10-26 21:10:41 +08004628 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4629 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4630 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4631 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004632}
Karl Schultz6addd812016-02-02 17:17:23 -07004633// Don't set viewport state in PSO. This is an error b/c we always need this
4634// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06004635// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07004636TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06004637 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07004638 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004639
Karl Schultz6addd812016-02-02 17:17:23 -07004640 m_errorMonitor->SetDesiredFailureMsg(
4641 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004642 "Gfx Pipeline pViewportState is null. Even if ");
4643
Tobin Ehlise68360f2015-10-01 11:15:13 -06004644 ASSERT_NO_FATAL_FAILURE(InitState());
4645 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004646
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004647 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004648 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4649 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004650
4651 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004652 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4653 ds_pool_ci.maxSets = 1;
4654 ds_pool_ci.poolSizeCount = 1;
4655 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004656
4657 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004658 err =
4659 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004660 ASSERT_VK_SUCCESS(err);
4661
4662 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004663 dsl_binding.binding = 0;
4664 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4665 dsl_binding.descriptorCount = 1;
4666 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004667
4668 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004669 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4670 ds_layout_ci.bindingCount = 1;
4671 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004672
4673 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004674 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4675 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004676 ASSERT_VK_SUCCESS(err);
4677
4678 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004679 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004680 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004681 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004682 alloc_info.descriptorPool = ds_pool;
4683 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004684 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4685 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004686 ASSERT_VK_SUCCESS(err);
4687
4688 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004689 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4690 pipeline_layout_ci.setLayoutCount = 1;
4691 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004692
4693 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004694 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4695 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004696 ASSERT_VK_SUCCESS(err);
4697
4698 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4699 // Set scissor as dynamic to avoid second error
4700 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004701 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4702 dyn_state_ci.dynamicStateCount = 1;
4703 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004704
Cody Northropeb3a6c12015-10-05 14:44:45 -06004705 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004706 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004707
Karl Schultz6addd812016-02-02 17:17:23 -07004708 VkShaderObj vs(m_device, bindStateVertShaderText,
4709 VK_SHADER_STAGE_VERTEX_BIT, this);
4710 VkShaderObj fs(m_device, bindStateFragShaderText,
4711 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004712 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004713 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004714 shaderStages[0] = vs.GetStageCreateInfo();
4715 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004716
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004717
4718 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4719 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4720 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4721 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4722 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4723 rs_state_ci.depthClampEnable = VK_FALSE;
4724 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4725 rs_state_ci.depthBiasEnable = VK_FALSE;
4726
Tobin Ehlise68360f2015-10-01 11:15:13 -06004727 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004728 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4729 gp_ci.stageCount = 2;
4730 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004731 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004732 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
4733 // should cause validation error
4734 gp_ci.pDynamicState = &dyn_state_ci;
4735 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4736 gp_ci.layout = pipeline_layout;
4737 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004738
4739 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004740 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004741
4742 VkPipeline pipeline;
4743 VkPipelineCache pipelineCache;
4744
Karl Schultz6addd812016-02-02 17:17:23 -07004745 err =
4746 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004747 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004748 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4749 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004750
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004751 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004752
Chia-I Wuf7458c52015-10-26 21:10:41 +08004753 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4754 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4755 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4756 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004757}
4758// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07004759// Then run second test where dynamic scissor count doesn't match PSO scissor
4760// count
4761TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
4762 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004763
Karl Schultz6addd812016-02-02 17:17:23 -07004764 m_errorMonitor->SetDesiredFailureMsg(
4765 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004766 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
4767
Tobin Ehlise68360f2015-10-01 11:15:13 -06004768 ASSERT_NO_FATAL_FAILURE(InitState());
4769 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004770
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004771 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004772 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4773 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004774
4775 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004776 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4777 ds_pool_ci.maxSets = 1;
4778 ds_pool_ci.poolSizeCount = 1;
4779 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004780
4781 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004782 err =
4783 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004784 ASSERT_VK_SUCCESS(err);
4785
4786 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004787 dsl_binding.binding = 0;
4788 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4789 dsl_binding.descriptorCount = 1;
4790 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004791
4792 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004793 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4794 ds_layout_ci.bindingCount = 1;
4795 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004796
4797 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004798 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4799 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004800 ASSERT_VK_SUCCESS(err);
4801
4802 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004803 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004804 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004805 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004806 alloc_info.descriptorPool = ds_pool;
4807 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004808 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4809 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004810 ASSERT_VK_SUCCESS(err);
4811
4812 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004813 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4814 pipeline_layout_ci.setLayoutCount = 1;
4815 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004816
4817 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004818 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4819 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004820 ASSERT_VK_SUCCESS(err);
4821
4822 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004823 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4824 vp_state_ci.viewportCount = 1;
4825 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
4826 vp_state_ci.scissorCount = 1;
4827 vp_state_ci.pScissors =
4828 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06004829
4830 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4831 // Set scissor as dynamic to avoid that error
4832 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004833 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4834 dyn_state_ci.dynamicStateCount = 1;
4835 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004836
Cody Northropeb3a6c12015-10-05 14:44:45 -06004837 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004838 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004839
Karl Schultz6addd812016-02-02 17:17:23 -07004840 VkShaderObj vs(m_device, bindStateVertShaderText,
4841 VK_SHADER_STAGE_VERTEX_BIT, this);
4842 VkShaderObj fs(m_device, bindStateFragShaderText,
4843 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004844 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004845 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004846 shaderStages[0] = vs.GetStageCreateInfo();
4847 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004848
Cody Northropf6622dc2015-10-06 10:33:21 -06004849 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4850 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4851 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004852 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004853 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004854 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004855 vi_ci.pVertexAttributeDescriptions = nullptr;
4856
4857 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4858 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4859 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4860
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004861 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004862 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06004863 rs_ci.pNext = nullptr;
4864
Mark Youngc89c6312016-03-31 16:03:20 -06004865 VkPipelineColorBlendAttachmentState att = {};
4866 att.blendEnable = VK_FALSE;
4867 att.colorWriteMask = 0xf;
4868
Cody Northropf6622dc2015-10-06 10:33:21 -06004869 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4870 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4871 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004872 cb_ci.attachmentCount = 1;
4873 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06004874
Tobin Ehlise68360f2015-10-01 11:15:13 -06004875 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004876 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4877 gp_ci.stageCount = 2;
4878 gp_ci.pStages = shaderStages;
4879 gp_ci.pVertexInputState = &vi_ci;
4880 gp_ci.pInputAssemblyState = &ia_ci;
4881 gp_ci.pViewportState = &vp_state_ci;
4882 gp_ci.pRasterizationState = &rs_ci;
4883 gp_ci.pColorBlendState = &cb_ci;
4884 gp_ci.pDynamicState = &dyn_state_ci;
4885 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4886 gp_ci.layout = pipeline_layout;
4887 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004888
4889 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004890 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004891
4892 VkPipeline pipeline;
4893 VkPipelineCache pipelineCache;
4894
Karl Schultz6addd812016-02-02 17:17:23 -07004895 err =
4896 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004897 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004898 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4899 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004900
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004901 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004902
Tobin Ehlisd332f282015-10-02 11:00:56 -06004903 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07004904 // First need to successfully create the PSO from above by setting
4905 // pViewports
4906 m_errorMonitor->SetDesiredFailureMsg(
4907 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4908 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
4909 "scissorCount is 1. These counts must match.");
4910
4911 VkViewport vp = {}; // Just need dummy vp to point to
4912 vp_state_ci.pViewports = &vp;
4913 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4914 &gp_ci, NULL, &pipeline);
4915 ASSERT_VK_SUCCESS(err);
4916 BeginCommandBuffer();
4917 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4918 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4919 VkRect2D scissors[2] = {}; // don't care about data
4920 // Count of 2 doesn't match PSO count of 1
4921 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
4922 Draw(1, 0, 0, 0);
4923
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004924 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004925
4926 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4927 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4928 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4929 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4930}
4931// Create PSO w/o non-zero scissorCount but no scissor data
4932// Then run second test where dynamic viewportCount doesn't match PSO
4933// viewportCount
4934TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
4935 VkResult err;
4936
4937 m_errorMonitor->SetDesiredFailureMsg(
4938 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4939 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
4940
4941 ASSERT_NO_FATAL_FAILURE(InitState());
4942 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4943
4944 VkDescriptorPoolSize ds_type_count = {};
4945 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4946 ds_type_count.descriptorCount = 1;
4947
4948 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4949 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4950 ds_pool_ci.maxSets = 1;
4951 ds_pool_ci.poolSizeCount = 1;
4952 ds_pool_ci.pPoolSizes = &ds_type_count;
4953
4954 VkDescriptorPool ds_pool;
4955 err =
4956 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4957 ASSERT_VK_SUCCESS(err);
4958
4959 VkDescriptorSetLayoutBinding dsl_binding = {};
4960 dsl_binding.binding = 0;
4961 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4962 dsl_binding.descriptorCount = 1;
4963 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4964
4965 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4966 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4967 ds_layout_ci.bindingCount = 1;
4968 ds_layout_ci.pBindings = &dsl_binding;
4969
4970 VkDescriptorSetLayout ds_layout;
4971 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4972 &ds_layout);
4973 ASSERT_VK_SUCCESS(err);
4974
4975 VkDescriptorSet descriptorSet;
4976 VkDescriptorSetAllocateInfo alloc_info = {};
4977 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4978 alloc_info.descriptorSetCount = 1;
4979 alloc_info.descriptorPool = ds_pool;
4980 alloc_info.pSetLayouts = &ds_layout;
4981 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4982 &descriptorSet);
4983 ASSERT_VK_SUCCESS(err);
4984
4985 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4986 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4987 pipeline_layout_ci.setLayoutCount = 1;
4988 pipeline_layout_ci.pSetLayouts = &ds_layout;
4989
4990 VkPipelineLayout pipeline_layout;
4991 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4992 &pipeline_layout);
4993 ASSERT_VK_SUCCESS(err);
4994
4995 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4996 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4997 vp_state_ci.scissorCount = 1;
4998 vp_state_ci.pScissors =
4999 NULL; // Null scissor w/ count of 1 should cause error
5000 vp_state_ci.viewportCount = 1;
5001 vp_state_ci.pViewports =
5002 NULL; // vp is dynamic (below) so this won't cause error
5003
5004 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
5005 // Set scissor as dynamic to avoid that error
5006 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5007 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5008 dyn_state_ci.dynamicStateCount = 1;
5009 dyn_state_ci.pDynamicStates = &vp_state;
5010
5011 VkPipelineShaderStageCreateInfo shaderStages[2];
5012 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5013
5014 VkShaderObj vs(m_device, bindStateVertShaderText,
5015 VK_SHADER_STAGE_VERTEX_BIT, this);
5016 VkShaderObj fs(m_device, bindStateFragShaderText,
5017 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005018 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005019 // but add it to be able to run on more devices
5020 shaderStages[0] = vs.GetStageCreateInfo();
5021 shaderStages[1] = fs.GetStageCreateInfo();
5022
5023 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5024 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5025 vi_ci.pNext = nullptr;
5026 vi_ci.vertexBindingDescriptionCount = 0;
5027 vi_ci.pVertexBindingDescriptions = nullptr;
5028 vi_ci.vertexAttributeDescriptionCount = 0;
5029 vi_ci.pVertexAttributeDescriptions = nullptr;
5030
5031 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5032 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5033 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5034
5035 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5036 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5037 rs_ci.pNext = nullptr;
5038
Mark Youngc89c6312016-03-31 16:03:20 -06005039 VkPipelineColorBlendAttachmentState att = {};
5040 att.blendEnable = VK_FALSE;
5041 att.colorWriteMask = 0xf;
5042
Karl Schultz6addd812016-02-02 17:17:23 -07005043 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5044 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5045 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06005046 cb_ci.attachmentCount = 1;
5047 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07005048
5049 VkGraphicsPipelineCreateInfo gp_ci = {};
5050 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5051 gp_ci.stageCount = 2;
5052 gp_ci.pStages = shaderStages;
5053 gp_ci.pVertexInputState = &vi_ci;
5054 gp_ci.pInputAssemblyState = &ia_ci;
5055 gp_ci.pViewportState = &vp_state_ci;
5056 gp_ci.pRasterizationState = &rs_ci;
5057 gp_ci.pColorBlendState = &cb_ci;
5058 gp_ci.pDynamicState = &dyn_state_ci;
5059 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5060 gp_ci.layout = pipeline_layout;
5061 gp_ci.renderPass = renderPass();
5062
5063 VkPipelineCacheCreateInfo pc_ci = {};
5064 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5065
5066 VkPipeline pipeline;
5067 VkPipelineCache pipelineCache;
5068
5069 err =
5070 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5071 ASSERT_VK_SUCCESS(err);
5072 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5073 &gp_ci, NULL, &pipeline);
5074
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005075 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07005076
5077 // Now hit second fail case where we set scissor w/ different count than PSO
5078 // First need to successfully create the PSO from above by setting
5079 // pViewports
5080 m_errorMonitor->SetDesiredFailureMsg(
5081 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5082 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
5083 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005084
Tobin Ehlisd332f282015-10-02 11:00:56 -06005085 VkRect2D sc = {}; // Just need dummy vp to point to
5086 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07005087 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5088 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005089 ASSERT_VK_SUCCESS(err);
5090 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005091 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5092 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005093 VkViewport viewports[2] = {}; // don't care about data
5094 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07005095 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005096 Draw(1, 0, 0, 0);
5097
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005098 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005099
Chia-I Wuf7458c52015-10-26 21:10:41 +08005100 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5101 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5102 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5103 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005104}
5105
Mark Young7394fdd2016-03-31 14:56:43 -06005106TEST_F(VkLayerTest, PSOLineWidthInvalid) {
5107 VkResult err;
5108
5109 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06005110 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06005111
5112 ASSERT_NO_FATAL_FAILURE(InitState());
5113 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5114
5115 VkDescriptorPoolSize ds_type_count = {};
5116 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5117 ds_type_count.descriptorCount = 1;
5118
5119 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5120 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5121 ds_pool_ci.maxSets = 1;
5122 ds_pool_ci.poolSizeCount = 1;
5123 ds_pool_ci.pPoolSizes = &ds_type_count;
5124
5125 VkDescriptorPool ds_pool;
5126 err =
5127 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5128 ASSERT_VK_SUCCESS(err);
5129
5130 VkDescriptorSetLayoutBinding dsl_binding = {};
5131 dsl_binding.binding = 0;
5132 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5133 dsl_binding.descriptorCount = 1;
5134 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5135
5136 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5137 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5138 ds_layout_ci.bindingCount = 1;
5139 ds_layout_ci.pBindings = &dsl_binding;
5140
5141 VkDescriptorSetLayout ds_layout;
5142 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5143 &ds_layout);
5144 ASSERT_VK_SUCCESS(err);
5145
5146 VkDescriptorSet descriptorSet;
5147 VkDescriptorSetAllocateInfo alloc_info = {};
5148 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5149 alloc_info.descriptorSetCount = 1;
5150 alloc_info.descriptorPool = ds_pool;
5151 alloc_info.pSetLayouts = &ds_layout;
5152 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5153 &descriptorSet);
5154 ASSERT_VK_SUCCESS(err);
5155
5156 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5157 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5158 pipeline_layout_ci.setLayoutCount = 1;
5159 pipeline_layout_ci.pSetLayouts = &ds_layout;
5160
5161 VkPipelineLayout pipeline_layout;
5162 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5163 &pipeline_layout);
5164 ASSERT_VK_SUCCESS(err);
5165
5166 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5167 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5168 vp_state_ci.scissorCount = 1;
5169 vp_state_ci.pScissors = NULL;
5170 vp_state_ci.viewportCount = 1;
5171 vp_state_ci.pViewports = NULL;
5172
5173 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
5174 VK_DYNAMIC_STATE_SCISSOR,
5175 VK_DYNAMIC_STATE_LINE_WIDTH};
5176 // Set scissor as dynamic to avoid that error
5177 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5178 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5179 dyn_state_ci.dynamicStateCount = 2;
5180 dyn_state_ci.pDynamicStates = dynamic_states;
5181
5182 VkPipelineShaderStageCreateInfo shaderStages[2];
5183 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5184
5185 VkShaderObj vs(m_device, bindStateVertShaderText,
5186 VK_SHADER_STAGE_VERTEX_BIT, this);
5187 VkShaderObj fs(m_device, bindStateFragShaderText,
5188 VK_SHADER_STAGE_FRAGMENT_BIT,
5189 this); // TODO - We shouldn't need a fragment shader
5190 // but add it to be able to run on more devices
5191 shaderStages[0] = vs.GetStageCreateInfo();
5192 shaderStages[1] = fs.GetStageCreateInfo();
5193
5194 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5195 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5196 vi_ci.pNext = nullptr;
5197 vi_ci.vertexBindingDescriptionCount = 0;
5198 vi_ci.pVertexBindingDescriptions = nullptr;
5199 vi_ci.vertexAttributeDescriptionCount = 0;
5200 vi_ci.pVertexAttributeDescriptions = nullptr;
5201
5202 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5203 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5204 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5205
5206 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5207 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5208 rs_ci.pNext = nullptr;
5209
Mark Young47107952016-05-02 15:59:55 -06005210 // Check too low (line width of -1.0f).
5211 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06005212
5213 VkPipelineColorBlendAttachmentState att = {};
5214 att.blendEnable = VK_FALSE;
5215 att.colorWriteMask = 0xf;
5216
5217 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5218 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5219 cb_ci.pNext = nullptr;
5220 cb_ci.attachmentCount = 1;
5221 cb_ci.pAttachments = &att;
5222
5223 VkGraphicsPipelineCreateInfo gp_ci = {};
5224 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5225 gp_ci.stageCount = 2;
5226 gp_ci.pStages = shaderStages;
5227 gp_ci.pVertexInputState = &vi_ci;
5228 gp_ci.pInputAssemblyState = &ia_ci;
5229 gp_ci.pViewportState = &vp_state_ci;
5230 gp_ci.pRasterizationState = &rs_ci;
5231 gp_ci.pColorBlendState = &cb_ci;
5232 gp_ci.pDynamicState = &dyn_state_ci;
5233 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5234 gp_ci.layout = pipeline_layout;
5235 gp_ci.renderPass = renderPass();
5236
5237 VkPipelineCacheCreateInfo pc_ci = {};
5238 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5239
5240 VkPipeline pipeline;
5241 VkPipelineCache pipelineCache;
5242
5243 err =
5244 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5245 ASSERT_VK_SUCCESS(err);
5246 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5247 &gp_ci, NULL, &pipeline);
5248
5249 m_errorMonitor->VerifyFound();
5250
5251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5252 "Attempt to set lineWidth to 65536");
5253
5254 // Check too high (line width of 65536.0f).
5255 rs_ci.lineWidth = 65536.0f;
5256
5257 err =
5258 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5259 ASSERT_VK_SUCCESS(err);
5260 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5261 &gp_ci, NULL, &pipeline);
5262
5263 m_errorMonitor->VerifyFound();
5264
5265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06005266 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06005267
5268 dyn_state_ci.dynamicStateCount = 3;
5269
5270 rs_ci.lineWidth = 1.0f;
5271
5272 err =
5273 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5274 ASSERT_VK_SUCCESS(err);
5275 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5276 &gp_ci, NULL, &pipeline);
5277 BeginCommandBuffer();
5278 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5279 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5280
5281 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06005282 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06005283 m_errorMonitor->VerifyFound();
5284
5285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5286 "Attempt to set lineWidth to 65536");
5287
5288 // Check too high with dynamic setting.
5289 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
5290 m_errorMonitor->VerifyFound();
5291 EndCommandBuffer();
5292
5293 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5294 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5295 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5296 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5297}
5298
Karl Schultz6addd812016-02-02 17:17:23 -07005299TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005300 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005301 m_errorMonitor->SetDesiredFailureMsg(
5302 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005303 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005304
5305 ASSERT_NO_FATAL_FAILURE(InitState());
5306 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005307
Tony Barbourfe3351b2015-07-28 10:17:20 -06005308 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005309 // Don't care about RenderPass handle b/c error should be flagged before
5310 // that
5311 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
5312 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005313
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005314 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005315}
5316
Karl Schultz6addd812016-02-02 17:17:23 -07005317TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005318 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005319 m_errorMonitor->SetDesiredFailureMsg(
5320 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005321 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005322
5323 ASSERT_NO_FATAL_FAILURE(InitState());
5324 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005325
Tony Barbourfe3351b2015-07-28 10:17:20 -06005326 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005327 // Just create a dummy Renderpass that's non-NULL so we can get to the
5328 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06005329 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005330 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
5331 rp_begin.pNext = NULL;
5332 rp_begin.renderPass = renderPass();
5333 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005334
Karl Schultz6addd812016-02-02 17:17:23 -07005335 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
5336 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005337
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005338 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005339}
5340
Karl Schultz6addd812016-02-02 17:17:23 -07005341TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005342 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07005343 m_errorMonitor->SetDesiredFailureMsg(
5344 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005345 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005346
5347 ASSERT_NO_FATAL_FAILURE(InitState());
5348 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005349
5350 // Renderpass is started here
5351 BeginCommandBuffer();
5352
5353 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005354 vk_testing::Buffer dstBuffer;
5355 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005356
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005357 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005358
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005359 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005360}
5361
Karl Schultz6addd812016-02-02 17:17:23 -07005362TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005363 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07005364 m_errorMonitor->SetDesiredFailureMsg(
5365 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005366 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005367
5368 ASSERT_NO_FATAL_FAILURE(InitState());
5369 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005370
5371 // Renderpass is started here
5372 BeginCommandBuffer();
5373
5374 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005375 vk_testing::Buffer dstBuffer;
5376 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005377
Karl Schultz6addd812016-02-02 17:17:23 -07005378 VkDeviceSize dstOffset = 0;
5379 VkDeviceSize dataSize = 1024;
5380 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005381
Karl Schultz6addd812016-02-02 17:17:23 -07005382 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
5383 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005384
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005385 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005386}
5387
Karl Schultz6addd812016-02-02 17:17:23 -07005388TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005389 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005390 m_errorMonitor->SetDesiredFailureMsg(
5391 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005392 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005393
5394 ASSERT_NO_FATAL_FAILURE(InitState());
5395 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005396
5397 // Renderpass is started here
5398 BeginCommandBuffer();
5399
Michael Lentine0a369f62016-02-03 16:51:46 -06005400 VkClearColorValue clear_color;
5401 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07005402 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
5403 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5404 const int32_t tex_width = 32;
5405 const int32_t tex_height = 32;
5406 VkImageCreateInfo image_create_info = {};
5407 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5408 image_create_info.pNext = NULL;
5409 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5410 image_create_info.format = tex_format;
5411 image_create_info.extent.width = tex_width;
5412 image_create_info.extent.height = tex_height;
5413 image_create_info.extent.depth = 1;
5414 image_create_info.mipLevels = 1;
5415 image_create_info.arrayLayers = 1;
5416 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5417 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
5418 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005419
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005420 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005421 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5422 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005423
Karl Schultz6addd812016-02-02 17:17:23 -07005424 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5425 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005426
Karl Schultz6addd812016-02-02 17:17:23 -07005427 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5428 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005429
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005430 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005431}
5432
Karl Schultz6addd812016-02-02 17:17:23 -07005433TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005434 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005435 m_errorMonitor->SetDesiredFailureMsg(
5436 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005437 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005438
5439 ASSERT_NO_FATAL_FAILURE(InitState());
5440 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005441
5442 // Renderpass is started here
5443 BeginCommandBuffer();
5444
5445 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07005446 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005447 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
5448 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5449 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
5450 image_create_info.extent.width = 64;
5451 image_create_info.extent.height = 64;
5452 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5453 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005454
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005455 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005456 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5457 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005458
Karl Schultz6addd812016-02-02 17:17:23 -07005459 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5460 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005461
Karl Schultz6addd812016-02-02 17:17:23 -07005462 vkCmdClearDepthStencilImage(
5463 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5464 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
5465 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005466
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005467 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005468}
5469
Karl Schultz6addd812016-02-02 17:17:23 -07005470TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005471 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005472 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005473
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005475 "vkCmdClearAttachments: This call "
5476 "must be issued inside an active "
5477 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005478
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005479 ASSERT_NO_FATAL_FAILURE(InitState());
5480 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005481
5482 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005483 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005484 ASSERT_VK_SUCCESS(err);
5485
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005486 VkClearAttachment color_attachment;
5487 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5488 color_attachment.clearValue.color.float32[0] = 0;
5489 color_attachment.clearValue.color.float32[1] = 0;
5490 color_attachment.clearValue.color.float32[2] = 0;
5491 color_attachment.clearValue.color.float32[3] = 0;
5492 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005493 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
5494 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5495 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005496
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005497 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005498}
5499
Karl Schultz9e66a292016-04-21 15:57:51 -06005500TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
5501 // Try to add a buffer memory barrier with no buffer.
5502 m_errorMonitor->SetDesiredFailureMsg(
5503 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5504 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
5505
5506 ASSERT_NO_FATAL_FAILURE(InitState());
5507 BeginCommandBuffer();
5508
5509 VkBufferMemoryBarrier buf_barrier = {};
5510 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5511 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5512 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5513 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5514 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5515 buf_barrier.buffer = VK_NULL_HANDLE;
5516 buf_barrier.offset = 0;
5517 buf_barrier.size = VK_WHOLE_SIZE;
5518 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5519 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
5520 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
5521
5522 m_errorMonitor->VerifyFound();
5523}
5524
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06005525TEST_F(VkLayerTest, InvalidBarriers) {
5526 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
5527
5528 m_errorMonitor->SetDesiredFailureMsg(
5529 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
5530
5531 ASSERT_NO_FATAL_FAILURE(InitState());
5532 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5533
5534 VkMemoryBarrier mem_barrier = {};
5535 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
5536 mem_barrier.pNext = NULL;
5537 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5538 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5539 BeginCommandBuffer();
5540 // BeginCommandBuffer() starts a render pass
5541 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5542 VK_PIPELINE_STAGE_HOST_BIT,
5543 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
5544 &mem_barrier, 0, nullptr, 0, nullptr);
5545 m_errorMonitor->VerifyFound();
5546
5547 m_errorMonitor->SetDesiredFailureMsg(
5548 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5549 "Image Layout cannot be transitioned to UNDEFINED");
5550 VkImageObj image(m_device);
5551 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
5552 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5553 ASSERT_TRUE(image.initialized());
5554 VkImageMemoryBarrier img_barrier = {};
5555 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
5556 img_barrier.pNext = NULL;
5557 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5558 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5559 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5560 // New layout can't be UNDEFINED
5561 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5562 img_barrier.image = image.handle();
5563 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5564 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5565 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5566 img_barrier.subresourceRange.baseArrayLayer = 0;
5567 img_barrier.subresourceRange.baseMipLevel = 0;
5568 img_barrier.subresourceRange.layerCount = 1;
5569 img_barrier.subresourceRange.levelCount = 1;
5570 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5571 VK_PIPELINE_STAGE_HOST_BIT,
5572 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5573 nullptr, 1, &img_barrier);
5574 m_errorMonitor->VerifyFound();
5575 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5576
5577 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5578 "Subresource must have the sum of the "
5579 "baseArrayLayer");
5580 // baseArrayLayer + layerCount must be <= image's arrayLayers
5581 img_barrier.subresourceRange.baseArrayLayer = 1;
5582 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5583 VK_PIPELINE_STAGE_HOST_BIT,
5584 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5585 nullptr, 1, &img_barrier);
5586 m_errorMonitor->VerifyFound();
5587 img_barrier.subresourceRange.baseArrayLayer = 0;
5588
5589 m_errorMonitor->SetDesiredFailureMsg(
5590 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5591 "Subresource must have the sum of the baseMipLevel");
5592 // baseMipLevel + levelCount must be <= image's mipLevels
5593 img_barrier.subresourceRange.baseMipLevel = 1;
5594 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5595 VK_PIPELINE_STAGE_HOST_BIT,
5596 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5597 nullptr, 1, &img_barrier);
5598 m_errorMonitor->VerifyFound();
5599 img_barrier.subresourceRange.baseMipLevel = 0;
5600
5601 m_errorMonitor->SetDesiredFailureMsg(
5602 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5603 "Buffer Barriers cannot be used during a render pass");
5604 vk_testing::Buffer buffer;
5605 buffer.init(*m_device, 256);
5606 VkBufferMemoryBarrier buf_barrier = {};
5607 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5608 buf_barrier.pNext = NULL;
5609 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5610 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5611 buf_barrier.buffer = buffer.handle();
5612 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5613 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5614 buf_barrier.offset = 0;
5615 buf_barrier.size = VK_WHOLE_SIZE;
5616 // Can't send buffer barrier during a render pass
5617 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5618 VK_PIPELINE_STAGE_HOST_BIT,
5619 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5620 &buf_barrier, 0, nullptr);
5621 m_errorMonitor->VerifyFound();
5622 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
5623
5624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5625 "which is not less than total size");
5626 buf_barrier.offset = 257;
5627 // Offset greater than total size
5628 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5629 VK_PIPELINE_STAGE_HOST_BIT,
5630 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5631 &buf_barrier, 0, nullptr);
5632 m_errorMonitor->VerifyFound();
5633 buf_barrier.offset = 0;
5634
5635 m_errorMonitor->SetDesiredFailureMsg(
5636 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
5637 buf_barrier.size = 257;
5638 // Size greater than total size
5639 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5640 VK_PIPELINE_STAGE_HOST_BIT,
5641 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5642 &buf_barrier, 0, nullptr);
5643 m_errorMonitor->VerifyFound();
5644 buf_barrier.size = VK_WHOLE_SIZE;
5645
5646 m_errorMonitor->SetDesiredFailureMsg(
5647 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5648 "Image is a depth and stencil format and thus must "
5649 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
5650 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
5651 VkDepthStencilObj ds_image(m_device);
5652 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
5653 ASSERT_TRUE(ds_image.initialized());
5654 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5655 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
5656 img_barrier.image = ds_image.handle();
5657 // Leave aspectMask at COLOR on purpose
5658 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5659 VK_PIPELINE_STAGE_HOST_BIT,
5660 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5661 nullptr, 1, &img_barrier);
5662 m_errorMonitor->VerifyFound();
5663}
5664
Karl Schultz6addd812016-02-02 17:17:23 -07005665TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005666 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005667 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005668
Karl Schultz6addd812016-02-02 17:17:23 -07005669 m_errorMonitor->SetDesiredFailureMsg(
5670 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005671 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
5672
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005673 ASSERT_NO_FATAL_FAILURE(InitState());
5674 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005675 uint32_t qfi = 0;
5676 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005677 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5678 buffCI.size = 1024;
5679 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5680 buffCI.queueFamilyIndexCount = 1;
5681 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005682
5683 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005684 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005685 ASSERT_VK_SUCCESS(err);
5686
5687 BeginCommandBuffer();
5688 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005689 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5690 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005691 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07005692 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
5693 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005694
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005695 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005696
Chia-I Wuf7458c52015-10-26 21:10:41 +08005697 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005698}
5699
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005700TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
5701 // Create an out-of-range queueFamilyIndex
5702 m_errorMonitor->SetDesiredFailureMsg(
5703 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06005704 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005705
5706 ASSERT_NO_FATAL_FAILURE(InitState());
5707 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5708 VkBufferCreateInfo buffCI = {};
5709 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5710 buffCI.size = 1024;
5711 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5712 buffCI.queueFamilyIndexCount = 1;
5713 // Introduce failure by specifying invalid queue_family_index
5714 uint32_t qfi = 777;
5715 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06005716 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005717
5718 VkBuffer ib;
5719 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
5720
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005721 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005722}
5723
Karl Schultz6addd812016-02-02 17:17:23 -07005724TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
5725 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
5726 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005727
Karl Schultz6addd812016-02-02 17:17:23 -07005728 m_errorMonitor->SetDesiredFailureMsg(
5729 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005730 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005731
5732 ASSERT_NO_FATAL_FAILURE(InitState());
5733 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005734
5735 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005736 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005737 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
5738 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005739
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005740 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005741}
5742
Karl Schultz6addd812016-02-02 17:17:23 -07005743TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005744 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07005745 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005746
Karl Schultz6addd812016-02-02 17:17:23 -07005747 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005748 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5749 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
5750 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005751
Tobin Ehlis3b780662015-05-28 12:11:26 -06005752 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005753 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005754 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005755 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5756 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005757
5758 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005759 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5760 ds_pool_ci.pNext = NULL;
5761 ds_pool_ci.maxSets = 1;
5762 ds_pool_ci.poolSizeCount = 1;
5763 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005764
Tobin Ehlis3b780662015-05-28 12:11:26 -06005765 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005766 err =
5767 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005768 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005769 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005770 dsl_binding.binding = 0;
5771 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5772 dsl_binding.descriptorCount = 1;
5773 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5774 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005775
Tony Barboureb254902015-07-15 12:50:33 -06005776 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005777 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5778 ds_layout_ci.pNext = NULL;
5779 ds_layout_ci.bindingCount = 1;
5780 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005781
Tobin Ehlis3b780662015-05-28 12:11:26 -06005782 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005783 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5784 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005785 ASSERT_VK_SUCCESS(err);
5786
5787 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005788 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005789 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005790 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005791 alloc_info.descriptorPool = ds_pool;
5792 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005793 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5794 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005795 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005796
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005797 VkSamplerCreateInfo sampler_ci = {};
5798 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5799 sampler_ci.pNext = NULL;
5800 sampler_ci.magFilter = VK_FILTER_NEAREST;
5801 sampler_ci.minFilter = VK_FILTER_NEAREST;
5802 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5803 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5804 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5805 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5806 sampler_ci.mipLodBias = 1.0;
5807 sampler_ci.anisotropyEnable = VK_FALSE;
5808 sampler_ci.maxAnisotropy = 1;
5809 sampler_ci.compareEnable = VK_FALSE;
5810 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5811 sampler_ci.minLod = 1.0;
5812 sampler_ci.maxLod = 1.0;
5813 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5814 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5815 VkSampler sampler;
5816 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5817 ASSERT_VK_SUCCESS(err);
5818
5819 VkDescriptorImageInfo info = {};
5820 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005821
5822 VkWriteDescriptorSet descriptor_write;
5823 memset(&descriptor_write, 0, sizeof(descriptor_write));
5824 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005825 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005826 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005827 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005828 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005829 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005830
5831 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5832
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005833 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005834
Chia-I Wuf7458c52015-10-26 21:10:41 +08005835 vkDestroySampler(m_device->device(), sampler, NULL);
5836 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5837 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005838}
5839
Karl Schultz6addd812016-02-02 17:17:23 -07005840TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005841 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07005842 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005843
Karl Schultz6addd812016-02-02 17:17:23 -07005844 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005845 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5846 " binding #0 with 1 total descriptors but update of 1 descriptors "
5847 "starting at binding offset of 0 combined with update array element "
5848 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005849
Tobin Ehlis3b780662015-05-28 12:11:26 -06005850 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005851 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005852 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005853 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5854 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005855
5856 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005857 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5858 ds_pool_ci.pNext = NULL;
5859 ds_pool_ci.maxSets = 1;
5860 ds_pool_ci.poolSizeCount = 1;
5861 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005862
Tobin Ehlis3b780662015-05-28 12:11:26 -06005863 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005864 err =
5865 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005866 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005867
Tony Barboureb254902015-07-15 12:50:33 -06005868 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005869 dsl_binding.binding = 0;
5870 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5871 dsl_binding.descriptorCount = 1;
5872 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5873 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005874
5875 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005876 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5877 ds_layout_ci.pNext = NULL;
5878 ds_layout_ci.bindingCount = 1;
5879 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005880
Tobin Ehlis3b780662015-05-28 12:11:26 -06005881 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005882 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5883 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005884 ASSERT_VK_SUCCESS(err);
5885
5886 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005887 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005888 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005889 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005890 alloc_info.descriptorPool = ds_pool;
5891 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005892 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5893 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005894 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005895
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005896 // Correctly update descriptor to avoid "NOT_UPDATED" error
5897 VkDescriptorBufferInfo buff_info = {};
5898 buff_info.buffer =
5899 VkBuffer(0); // Don't care about buffer handle for this test
5900 buff_info.offset = 0;
5901 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005902
5903 VkWriteDescriptorSet descriptor_write;
5904 memset(&descriptor_write, 0, sizeof(descriptor_write));
5905 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005906 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005907 descriptor_write.dstArrayElement =
5908 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08005909 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005910 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5911 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005912
5913 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5914
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005915 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005916
Chia-I Wuf7458c52015-10-26 21:10:41 +08005917 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5918 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005919}
5920
Karl Schultz6addd812016-02-02 17:17:23 -07005921TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
5922 // Create layout w/ count of 1 and attempt update to that layout w/ binding
5923 // index 2
5924 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005925
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5927 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005928
Tobin Ehlis3b780662015-05-28 12:11:26 -06005929 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005930 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005931 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005932 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5933 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005934
5935 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005936 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5937 ds_pool_ci.pNext = NULL;
5938 ds_pool_ci.maxSets = 1;
5939 ds_pool_ci.poolSizeCount = 1;
5940 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005941
Tobin Ehlis3b780662015-05-28 12:11:26 -06005942 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005943 err =
5944 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005945 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005946
Tony Barboureb254902015-07-15 12:50:33 -06005947 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005948 dsl_binding.binding = 0;
5949 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5950 dsl_binding.descriptorCount = 1;
5951 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5952 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005953
5954 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005955 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5956 ds_layout_ci.pNext = NULL;
5957 ds_layout_ci.bindingCount = 1;
5958 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005959 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005960 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5961 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005962 ASSERT_VK_SUCCESS(err);
5963
5964 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005965 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005966 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005967 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005968 alloc_info.descriptorPool = ds_pool;
5969 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005970 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5971 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005972 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005973
Tony Barboureb254902015-07-15 12:50:33 -06005974 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005975 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5976 sampler_ci.pNext = NULL;
5977 sampler_ci.magFilter = VK_FILTER_NEAREST;
5978 sampler_ci.minFilter = VK_FILTER_NEAREST;
5979 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5980 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5981 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5982 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5983 sampler_ci.mipLodBias = 1.0;
5984 sampler_ci.anisotropyEnable = VK_FALSE;
5985 sampler_ci.maxAnisotropy = 1;
5986 sampler_ci.compareEnable = VK_FALSE;
5987 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5988 sampler_ci.minLod = 1.0;
5989 sampler_ci.maxLod = 1.0;
5990 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5991 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005992
Tobin Ehlis3b780662015-05-28 12:11:26 -06005993 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005994 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005995 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005996
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005997 VkDescriptorImageInfo info = {};
5998 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005999
6000 VkWriteDescriptorSet descriptor_write;
6001 memset(&descriptor_write, 0, sizeof(descriptor_write));
6002 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006003 descriptor_write.dstSet = descriptorSet;
6004 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006005 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006006 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006007 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006008 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006009
6010 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6011
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006012 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006013
Chia-I Wuf7458c52015-10-26 21:10:41 +08006014 vkDestroySampler(m_device->device(), sampler, NULL);
6015 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6016 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006017}
6018
Karl Schultz6addd812016-02-02 17:17:23 -07006019TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
6020 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
6021 // types
6022 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006023
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006024 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006025 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006026
Tobin Ehlis3b780662015-05-28 12:11:26 -06006027 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006028
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006029 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006030 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6031 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006032
6033 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006034 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6035 ds_pool_ci.pNext = NULL;
6036 ds_pool_ci.maxSets = 1;
6037 ds_pool_ci.poolSizeCount = 1;
6038 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006039
Tobin Ehlis3b780662015-05-28 12:11:26 -06006040 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006041 err =
6042 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006043 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06006044 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006045 dsl_binding.binding = 0;
6046 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6047 dsl_binding.descriptorCount = 1;
6048 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6049 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006050
Tony Barboureb254902015-07-15 12:50:33 -06006051 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006052 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6053 ds_layout_ci.pNext = NULL;
6054 ds_layout_ci.bindingCount = 1;
6055 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006056
Tobin Ehlis3b780662015-05-28 12:11:26 -06006057 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006058 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6059 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006060 ASSERT_VK_SUCCESS(err);
6061
6062 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006063 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006064 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006065 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006066 alloc_info.descriptorPool = ds_pool;
6067 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006068 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6069 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006070 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006071
Tony Barboureb254902015-07-15 12:50:33 -06006072 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006073 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6074 sampler_ci.pNext = NULL;
6075 sampler_ci.magFilter = VK_FILTER_NEAREST;
6076 sampler_ci.minFilter = VK_FILTER_NEAREST;
6077 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6078 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6079 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6080 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6081 sampler_ci.mipLodBias = 1.0;
6082 sampler_ci.anisotropyEnable = VK_FALSE;
6083 sampler_ci.maxAnisotropy = 1;
6084 sampler_ci.compareEnable = VK_FALSE;
6085 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6086 sampler_ci.minLod = 1.0;
6087 sampler_ci.maxLod = 1.0;
6088 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6089 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006090 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006091 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006092 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006093
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006094 VkDescriptorImageInfo info = {};
6095 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006096
6097 VkWriteDescriptorSet descriptor_write;
6098 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07006099 descriptor_write.sType =
6100 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006101 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006102 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006103 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006104 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006105 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006106
6107 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6108
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006109 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006110
Chia-I Wuf7458c52015-10-26 21:10:41 +08006111 vkDestroySampler(m_device->device(), sampler, NULL);
6112 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6113 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006114}
6115
Karl Schultz6addd812016-02-02 17:17:23 -07006116TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006117 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07006118 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006119
Karl Schultz6addd812016-02-02 17:17:23 -07006120 m_errorMonitor->SetDesiredFailureMsg(
6121 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006122 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006123
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006124 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006125 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
6126 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006127 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006128 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6129 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006130
6131 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006132 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6133 ds_pool_ci.pNext = NULL;
6134 ds_pool_ci.maxSets = 1;
6135 ds_pool_ci.poolSizeCount = 1;
6136 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006137
6138 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006139 err =
6140 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006141 ASSERT_VK_SUCCESS(err);
6142
6143 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006144 dsl_binding.binding = 0;
6145 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6146 dsl_binding.descriptorCount = 1;
6147 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6148 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006149
6150 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006151 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6152 ds_layout_ci.pNext = NULL;
6153 ds_layout_ci.bindingCount = 1;
6154 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006155 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006156 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6157 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006158 ASSERT_VK_SUCCESS(err);
6159
6160 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006161 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006162 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006163 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006164 alloc_info.descriptorPool = ds_pool;
6165 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006166 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6167 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006168 ASSERT_VK_SUCCESS(err);
6169
Karl Schultz6addd812016-02-02 17:17:23 -07006170 VkSampler sampler =
6171 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006172
6173 VkDescriptorImageInfo descriptor_info;
6174 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
6175 descriptor_info.sampler = sampler;
6176
6177 VkWriteDescriptorSet descriptor_write;
6178 memset(&descriptor_write, 0, sizeof(descriptor_write));
6179 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006180 descriptor_write.dstSet = descriptorSet;
6181 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006182 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006183 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6184 descriptor_write.pImageInfo = &descriptor_info;
6185
6186 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6187
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006188 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006189
Chia-I Wuf7458c52015-10-26 21:10:41 +08006190 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6191 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006192}
6193
Karl Schultz6addd812016-02-02 17:17:23 -07006194TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
6195 // Create a single combined Image/Sampler descriptor and send it an invalid
6196 // imageView
6197 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006198
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6200 "Attempted write update to combined "
6201 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -06006202 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006203
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006204 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006205 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006206 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6207 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006208
6209 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006210 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6211 ds_pool_ci.pNext = NULL;
6212 ds_pool_ci.maxSets = 1;
6213 ds_pool_ci.poolSizeCount = 1;
6214 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006215
6216 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006217 err =
6218 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006219 ASSERT_VK_SUCCESS(err);
6220
6221 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006222 dsl_binding.binding = 0;
6223 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6224 dsl_binding.descriptorCount = 1;
6225 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6226 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006227
6228 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006229 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6230 ds_layout_ci.pNext = NULL;
6231 ds_layout_ci.bindingCount = 1;
6232 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006233 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006234 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6235 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006236 ASSERT_VK_SUCCESS(err);
6237
6238 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006239 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006240 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006241 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006242 alloc_info.descriptorPool = ds_pool;
6243 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006244 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6245 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006246 ASSERT_VK_SUCCESS(err);
6247
6248 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006249 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6250 sampler_ci.pNext = NULL;
6251 sampler_ci.magFilter = VK_FILTER_NEAREST;
6252 sampler_ci.minFilter = VK_FILTER_NEAREST;
6253 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6254 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6255 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6256 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6257 sampler_ci.mipLodBias = 1.0;
6258 sampler_ci.anisotropyEnable = VK_FALSE;
6259 sampler_ci.maxAnisotropy = 1;
6260 sampler_ci.compareEnable = VK_FALSE;
6261 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6262 sampler_ci.minLod = 1.0;
6263 sampler_ci.maxLod = 1.0;
6264 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6265 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006266
6267 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006268 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006269 ASSERT_VK_SUCCESS(err);
6270
Karl Schultz6addd812016-02-02 17:17:23 -07006271 VkImageView view =
6272 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006273
6274 VkDescriptorImageInfo descriptor_info;
6275 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
6276 descriptor_info.sampler = sampler;
6277 descriptor_info.imageView = view;
6278
6279 VkWriteDescriptorSet descriptor_write;
6280 memset(&descriptor_write, 0, sizeof(descriptor_write));
6281 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006282 descriptor_write.dstSet = descriptorSet;
6283 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006284 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006285 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6286 descriptor_write.pImageInfo = &descriptor_info;
6287
6288 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6289
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006290 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006291
Chia-I Wuf7458c52015-10-26 21:10:41 +08006292 vkDestroySampler(m_device->device(), sampler, NULL);
6293 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6294 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006295}
6296
Karl Schultz6addd812016-02-02 17:17:23 -07006297TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
6298 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
6299 // into the other
6300 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006301
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6303 " binding #1 with type "
6304 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
6305 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006306
Tobin Ehlis04356f92015-10-27 16:35:27 -06006307 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006308 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006309 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006310 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6311 ds_type_count[0].descriptorCount = 1;
6312 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
6313 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006314
6315 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006316 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6317 ds_pool_ci.pNext = NULL;
6318 ds_pool_ci.maxSets = 1;
6319 ds_pool_ci.poolSizeCount = 2;
6320 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006321
6322 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006323 err =
6324 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006325 ASSERT_VK_SUCCESS(err);
6326 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006327 dsl_binding[0].binding = 0;
6328 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6329 dsl_binding[0].descriptorCount = 1;
6330 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6331 dsl_binding[0].pImmutableSamplers = NULL;
6332 dsl_binding[1].binding = 1;
6333 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6334 dsl_binding[1].descriptorCount = 1;
6335 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
6336 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006337
6338 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006339 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6340 ds_layout_ci.pNext = NULL;
6341 ds_layout_ci.bindingCount = 2;
6342 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006343
6344 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006345 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6346 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006347 ASSERT_VK_SUCCESS(err);
6348
6349 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006350 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006351 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006352 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006353 alloc_info.descriptorPool = ds_pool;
6354 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006355 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6356 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006357 ASSERT_VK_SUCCESS(err);
6358
6359 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006360 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6361 sampler_ci.pNext = NULL;
6362 sampler_ci.magFilter = VK_FILTER_NEAREST;
6363 sampler_ci.minFilter = VK_FILTER_NEAREST;
6364 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6365 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6366 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6367 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6368 sampler_ci.mipLodBias = 1.0;
6369 sampler_ci.anisotropyEnable = VK_FALSE;
6370 sampler_ci.maxAnisotropy = 1;
6371 sampler_ci.compareEnable = VK_FALSE;
6372 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6373 sampler_ci.minLod = 1.0;
6374 sampler_ci.maxLod = 1.0;
6375 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6376 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006377
6378 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006379 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006380 ASSERT_VK_SUCCESS(err);
6381
6382 VkDescriptorImageInfo info = {};
6383 info.sampler = sampler;
6384
6385 VkWriteDescriptorSet descriptor_write;
6386 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
6387 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006388 descriptor_write.dstSet = descriptorSet;
6389 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08006390 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006391 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6392 descriptor_write.pImageInfo = &info;
6393 // This write update should succeed
6394 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6395 // Now perform a copy update that fails due to type mismatch
6396 VkCopyDescriptorSet copy_ds_update;
6397 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6398 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6399 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06006400 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006401 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006402 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08006403 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006404 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6405
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006406 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006407 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006408 m_errorMonitor->SetDesiredFailureMsg(
6409 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006410 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -06006411 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6412 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6413 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006414 copy_ds_update.srcBinding =
6415 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006416 copy_ds_update.dstSet = descriptorSet;
6417 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06006418 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006419 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6420
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006421 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006422
Tobin Ehlis04356f92015-10-27 16:35:27 -06006423 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006424 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006425 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
6426 "update array offset of 0 and update of "
6427 "5 descriptors oversteps total number "
6428 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006429
Tobin Ehlis04356f92015-10-27 16:35:27 -06006430 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6431 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6432 copy_ds_update.srcSet = descriptorSet;
6433 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006434 copy_ds_update.dstSet = descriptorSet;
6435 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006436 copy_ds_update.descriptorCount =
6437 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06006438 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6439
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006440 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006441
Chia-I Wuf7458c52015-10-26 21:10:41 +08006442 vkDestroySampler(m_device->device(), sampler, NULL);
6443 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6444 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006445}
6446
Karl Schultz6addd812016-02-02 17:17:23 -07006447TEST_F(VkLayerTest, NumSamplesMismatch) {
6448 // Create CommandBuffer where MSAA samples doesn't match RenderPass
6449 // sampleCount
6450 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006451
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006453 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006454
Tobin Ehlis3b780662015-05-28 12:11:26 -06006455 ASSERT_NO_FATAL_FAILURE(InitState());
6456 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006457 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06006458 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006459 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006460
6461 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006462 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6463 ds_pool_ci.pNext = NULL;
6464 ds_pool_ci.maxSets = 1;
6465 ds_pool_ci.poolSizeCount = 1;
6466 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006467
Tobin Ehlis3b780662015-05-28 12:11:26 -06006468 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006469 err =
6470 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006471 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006472
Tony Barboureb254902015-07-15 12:50:33 -06006473 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08006474 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06006475 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08006476 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006477 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6478 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006479
Tony Barboureb254902015-07-15 12:50:33 -06006480 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6481 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6482 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006483 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006484 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006485
Tobin Ehlis3b780662015-05-28 12:11:26 -06006486 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006487 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6488 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006489 ASSERT_VK_SUCCESS(err);
6490
6491 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006492 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006493 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006494 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006495 alloc_info.descriptorPool = ds_pool;
6496 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006497 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6498 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006499 ASSERT_VK_SUCCESS(err);
6500
Tony Barboureb254902015-07-15 12:50:33 -06006501 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006502 pipe_ms_state_ci.sType =
6503 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6504 pipe_ms_state_ci.pNext = NULL;
6505 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6506 pipe_ms_state_ci.sampleShadingEnable = 0;
6507 pipe_ms_state_ci.minSampleShading = 1.0;
6508 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006509
Tony Barboureb254902015-07-15 12:50:33 -06006510 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006511 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6512 pipeline_layout_ci.pNext = NULL;
6513 pipeline_layout_ci.setLayoutCount = 1;
6514 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006515
6516 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006517 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6518 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006519 ASSERT_VK_SUCCESS(err);
6520
Karl Schultz6addd812016-02-02 17:17:23 -07006521 VkShaderObj vs(m_device, bindStateVertShaderText,
6522 VK_SHADER_STAGE_VERTEX_BIT, this);
6523 VkShaderObj fs(m_device, bindStateFragShaderText,
6524 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006525 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006526 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006527 VkPipelineObj pipe(m_device);
6528 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006529 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006530 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006531 pipe.SetMSAA(&pipe_ms_state_ci);
6532 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006533
Tony Barbourfe3351b2015-07-28 10:17:20 -06006534 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006535 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6536 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006537
Mark Young29927482016-05-04 14:38:51 -06006538 // Render triangle (the error should trigger on the attempt to draw).
6539 Draw(3, 1, 0, 0);
6540
6541 // Finalize recording of the command buffer
6542 EndCommandBuffer();
6543
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006544 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006545
Chia-I Wuf7458c52015-10-26 21:10:41 +08006546 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6547 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6548 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006549}
Mark Young29927482016-05-04 14:38:51 -06006550
Mark Youngc89c6312016-03-31 16:03:20 -06006551TEST_F(VkLayerTest, NumBlendAttachMismatch) {
6552 // Create Pipeline where the number of blend attachments doesn't match the
6553 // number of color attachments. In this case, we don't add any color
6554 // blend attachments even though we have a color attachment.
6555 VkResult err;
6556
6557 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -06006558 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -06006559
6560 ASSERT_NO_FATAL_FAILURE(InitState());
6561 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6562 VkDescriptorPoolSize ds_type_count = {};
6563 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6564 ds_type_count.descriptorCount = 1;
6565
6566 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6567 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6568 ds_pool_ci.pNext = NULL;
6569 ds_pool_ci.maxSets = 1;
6570 ds_pool_ci.poolSizeCount = 1;
6571 ds_pool_ci.pPoolSizes = &ds_type_count;
6572
6573 VkDescriptorPool ds_pool;
6574 err =
6575 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6576 ASSERT_VK_SUCCESS(err);
6577
6578 VkDescriptorSetLayoutBinding dsl_binding = {};
6579 dsl_binding.binding = 0;
6580 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6581 dsl_binding.descriptorCount = 1;
6582 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6583 dsl_binding.pImmutableSamplers = NULL;
6584
6585 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6586 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6587 ds_layout_ci.pNext = NULL;
6588 ds_layout_ci.bindingCount = 1;
6589 ds_layout_ci.pBindings = &dsl_binding;
6590
6591 VkDescriptorSetLayout ds_layout;
6592 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6593 &ds_layout);
6594 ASSERT_VK_SUCCESS(err);
6595
6596 VkDescriptorSet descriptorSet;
6597 VkDescriptorSetAllocateInfo alloc_info = {};
6598 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6599 alloc_info.descriptorSetCount = 1;
6600 alloc_info.descriptorPool = ds_pool;
6601 alloc_info.pSetLayouts = &ds_layout;
6602 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6603 &descriptorSet);
6604 ASSERT_VK_SUCCESS(err);
6605
6606 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
6607 pipe_ms_state_ci.sType =
6608 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6609 pipe_ms_state_ci.pNext = NULL;
6610 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6611 pipe_ms_state_ci.sampleShadingEnable = 0;
6612 pipe_ms_state_ci.minSampleShading = 1.0;
6613 pipe_ms_state_ci.pSampleMask = NULL;
6614
6615 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6616 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6617 pipeline_layout_ci.pNext = NULL;
6618 pipeline_layout_ci.setLayoutCount = 1;
6619 pipeline_layout_ci.pSetLayouts = &ds_layout;
6620
6621 VkPipelineLayout pipeline_layout;
6622 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6623 &pipeline_layout);
6624 ASSERT_VK_SUCCESS(err);
6625
6626 VkShaderObj vs(m_device, bindStateVertShaderText,
6627 VK_SHADER_STAGE_VERTEX_BIT, this);
6628 VkShaderObj fs(m_device, bindStateFragShaderText,
6629 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006630 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06006631 // but add it to be able to run on more devices
6632 VkPipelineObj pipe(m_device);
6633 pipe.AddShader(&vs);
6634 pipe.AddShader(&fs);
6635 pipe.SetMSAA(&pipe_ms_state_ci);
6636 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6637
6638 BeginCommandBuffer();
6639 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6640 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6641
Mark Young29927482016-05-04 14:38:51 -06006642 // Render triangle (the error should trigger on the attempt to draw).
6643 Draw(3, 1, 0, 0);
6644
6645 // Finalize recording of the command buffer
6646 EndCommandBuffer();
6647
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006648 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06006649
6650 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6651 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6652 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6653}
Mark Young29927482016-05-04 14:38:51 -06006654
Karl Schultz6addd812016-02-02 17:17:23 -07006655TEST_F(VkLayerTest, ClearCmdNoDraw) {
6656 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
6657 // to issuing a Draw
6658 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006659
Karl Schultz6addd812016-02-02 17:17:23 -07006660 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07006661 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006662 "vkCmdClearAttachments() issued on CB object ");
6663
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006664 ASSERT_NO_FATAL_FAILURE(InitState());
6665 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006666
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006667 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006668 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6669 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006670
6671 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006672 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6673 ds_pool_ci.pNext = NULL;
6674 ds_pool_ci.maxSets = 1;
6675 ds_pool_ci.poolSizeCount = 1;
6676 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006677
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006678 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006679 err =
6680 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006681 ASSERT_VK_SUCCESS(err);
6682
Tony Barboureb254902015-07-15 12:50:33 -06006683 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006684 dsl_binding.binding = 0;
6685 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6686 dsl_binding.descriptorCount = 1;
6687 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6688 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006689
Tony Barboureb254902015-07-15 12:50:33 -06006690 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006691 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6692 ds_layout_ci.pNext = NULL;
6693 ds_layout_ci.bindingCount = 1;
6694 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006695
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006696 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006697 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6698 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006699 ASSERT_VK_SUCCESS(err);
6700
6701 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006702 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006703 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006704 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006705 alloc_info.descriptorPool = ds_pool;
6706 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006707 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6708 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006709 ASSERT_VK_SUCCESS(err);
6710
Tony Barboureb254902015-07-15 12:50:33 -06006711 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006712 pipe_ms_state_ci.sType =
6713 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6714 pipe_ms_state_ci.pNext = NULL;
6715 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6716 pipe_ms_state_ci.sampleShadingEnable = 0;
6717 pipe_ms_state_ci.minSampleShading = 1.0;
6718 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006719
Tony Barboureb254902015-07-15 12:50:33 -06006720 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006721 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6722 pipeline_layout_ci.pNext = NULL;
6723 pipeline_layout_ci.setLayoutCount = 1;
6724 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006725
6726 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006727 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6728 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006729 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006730
Karl Schultz6addd812016-02-02 17:17:23 -07006731 VkShaderObj vs(m_device, bindStateVertShaderText,
6732 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006733 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006734 // on more devices
6735 VkShaderObj fs(m_device, bindStateFragShaderText,
6736 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006737
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006738 VkPipelineObj pipe(m_device);
6739 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006740 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006741 pipe.SetMSAA(&pipe_ms_state_ci);
6742 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006743
6744 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006745
Karl Schultz6addd812016-02-02 17:17:23 -07006746 // Main thing we care about for this test is that the VkImage obj we're
6747 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006748 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006749 VkClearAttachment color_attachment;
6750 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6751 color_attachment.clearValue.color.float32[0] = 1.0;
6752 color_attachment.clearValue.color.float32[1] = 1.0;
6753 color_attachment.clearValue.color.float32[2] = 1.0;
6754 color_attachment.clearValue.color.float32[3] = 1.0;
6755 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006756 VkClearRect clear_rect = {
6757 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006758
Karl Schultz6addd812016-02-02 17:17:23 -07006759 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
6760 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006761
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006762 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006763
Chia-I Wuf7458c52015-10-26 21:10:41 +08006764 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6765 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6766 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006767}
6768
Karl Schultz6addd812016-02-02 17:17:23 -07006769TEST_F(VkLayerTest, VtxBufferBadIndex) {
6770 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006771
Karl Schultz6addd812016-02-02 17:17:23 -07006772 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006773 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07006774 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006775
Tobin Ehlis502480b2015-06-24 15:53:07 -06006776 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06006777 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06006778 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006779
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006780 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006781 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6782 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006783
6784 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006785 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6786 ds_pool_ci.pNext = NULL;
6787 ds_pool_ci.maxSets = 1;
6788 ds_pool_ci.poolSizeCount = 1;
6789 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006790
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006791 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006792 err =
6793 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006794 ASSERT_VK_SUCCESS(err);
6795
Tony Barboureb254902015-07-15 12:50:33 -06006796 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006797 dsl_binding.binding = 0;
6798 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6799 dsl_binding.descriptorCount = 1;
6800 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6801 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006802
Tony Barboureb254902015-07-15 12:50:33 -06006803 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006804 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6805 ds_layout_ci.pNext = NULL;
6806 ds_layout_ci.bindingCount = 1;
6807 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006808
Tobin Ehlis502480b2015-06-24 15:53:07 -06006809 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006810 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6811 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006812 ASSERT_VK_SUCCESS(err);
6813
6814 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006815 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006816 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006817 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006818 alloc_info.descriptorPool = ds_pool;
6819 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006820 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6821 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006822 ASSERT_VK_SUCCESS(err);
6823
Tony Barboureb254902015-07-15 12:50:33 -06006824 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006825 pipe_ms_state_ci.sType =
6826 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6827 pipe_ms_state_ci.pNext = NULL;
6828 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6829 pipe_ms_state_ci.sampleShadingEnable = 0;
6830 pipe_ms_state_ci.minSampleShading = 1.0;
6831 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006832
Tony Barboureb254902015-07-15 12:50:33 -06006833 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006834 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6835 pipeline_layout_ci.pNext = NULL;
6836 pipeline_layout_ci.setLayoutCount = 1;
6837 pipeline_layout_ci.pSetLayouts = &ds_layout;
6838 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006839
Karl Schultz6addd812016-02-02 17:17:23 -07006840 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6841 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006842 ASSERT_VK_SUCCESS(err);
6843
Karl Schultz6addd812016-02-02 17:17:23 -07006844 VkShaderObj vs(m_device, bindStateVertShaderText,
6845 VK_SHADER_STAGE_VERTEX_BIT, this);
6846 VkShaderObj fs(m_device, bindStateFragShaderText,
6847 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006848 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006849 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006850 VkPipelineObj pipe(m_device);
6851 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006852 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006853 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006854 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006855 pipe.SetViewport(m_viewports);
6856 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006857 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006858
6859 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006860 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6861 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006862 // Don't care about actual data, just need to get to draw to flag error
6863 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07006864 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
6865 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006866 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06006867 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006868
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006869 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006870
Chia-I Wuf7458c52015-10-26 21:10:41 +08006871 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6872 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6873 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006874}
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06006875// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
6876TEST_F(VkLayerTest, InvalidImageLayout) {
6877 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
6878 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
6879 "images in the wrong layout when they're copied or transitioned.");
6880 // 3 in ValidateCmdBufImageLayouts
6881 // * -1 Attempt to submit cmd buf w/ deleted image
6882 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
6883 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
6884 m_errorMonitor->SetDesiredFailureMsg(
6885 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6886 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
6887
6888 ASSERT_NO_FATAL_FAILURE(InitState());
6889 // Create src & dst images to use for copy operations
6890 VkImage src_image;
6891 VkImage dst_image;
6892
6893 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6894 const int32_t tex_width = 32;
6895 const int32_t tex_height = 32;
6896
6897 VkImageCreateInfo image_create_info = {};
6898 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6899 image_create_info.pNext = NULL;
6900 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6901 image_create_info.format = tex_format;
6902 image_create_info.extent.width = tex_width;
6903 image_create_info.extent.height = tex_height;
6904 image_create_info.extent.depth = 1;
6905 image_create_info.mipLevels = 1;
6906 image_create_info.arrayLayers = 4;
6907 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6908 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6909 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6910 image_create_info.flags = 0;
6911
6912 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
6913 ASSERT_VK_SUCCESS(err);
6914 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
6915 ASSERT_VK_SUCCESS(err);
6916
6917 BeginCommandBuffer();
6918 VkImageCopy copyRegion;
6919 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6920 copyRegion.srcSubresource.mipLevel = 0;
6921 copyRegion.srcSubresource.baseArrayLayer = 0;
6922 copyRegion.srcSubresource.layerCount = 1;
6923 copyRegion.srcOffset.x = 0;
6924 copyRegion.srcOffset.y = 0;
6925 copyRegion.srcOffset.z = 0;
6926 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6927 copyRegion.dstSubresource.mipLevel = 0;
6928 copyRegion.dstSubresource.baseArrayLayer = 0;
6929 copyRegion.dstSubresource.layerCount = 1;
6930 copyRegion.dstOffset.x = 0;
6931 copyRegion.dstOffset.y = 0;
6932 copyRegion.dstOffset.z = 0;
6933 copyRegion.extent.width = 1;
6934 copyRegion.extent.height = 1;
6935 copyRegion.extent.depth = 1;
6936 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6937 m_errorMonitor->VerifyFound();
6938 // Now cause error due to src image layout changing
6939 m_errorMonitor->SetDesiredFailureMsg(
6940 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6941 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
6942 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6943 m_errorMonitor->VerifyFound();
6944 // Final src error is due to bad layout type
6945 m_errorMonitor->SetDesiredFailureMsg(
6946 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6947 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
6948 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6949 m_errorMonitor->VerifyFound();
6950 // Now verify same checks for dst
6951 m_errorMonitor->SetDesiredFailureMsg(
6952 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6953 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
6954 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6955 m_errorMonitor->VerifyFound();
6956 // Now cause error due to src image layout changing
6957 m_errorMonitor->SetDesiredFailureMsg(
6958 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6959 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
6960 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
6961 m_errorMonitor->VerifyFound();
6962 m_errorMonitor->SetDesiredFailureMsg(
6963 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6964 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
6965 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
6966 m_errorMonitor->VerifyFound();
6967 // Now cause error due to bad image layout transition in PipelineBarrier
6968 VkImageMemoryBarrier image_barrier[1] = {};
6969 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
6970 image_barrier[0].image = src_image;
6971 image_barrier[0].subresourceRange.layerCount = 2;
6972 image_barrier[0].subresourceRange.levelCount = 2;
6973 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6974 m_errorMonitor->SetDesiredFailureMsg(
6975 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6976 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
6977 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
6978 m_errorMonitor->VerifyFound();
6979
6980 // Finally some layout errors at RenderPass create time
6981 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
6982 VkAttachmentReference attach = {};
6983 // perf warning for GENERAL layout w/ non-DS input attachment
6984 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
6985 VkSubpassDescription subpass = {};
6986 subpass.inputAttachmentCount = 1;
6987 subpass.pInputAttachments = &attach;
6988 VkRenderPassCreateInfo rpci = {};
6989 rpci.subpassCount = 1;
6990 rpci.pSubpasses = &subpass;
6991 rpci.attachmentCount = 1;
6992 VkAttachmentDescription attach_desc = {};
6993 attach_desc.format = VK_FORMAT_UNDEFINED;
6994 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -06006995 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06006996 VkRenderPass rp;
6997 m_errorMonitor->SetDesiredFailureMsg(
6998 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6999 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
7000 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7001 m_errorMonitor->VerifyFound();
7002 // error w/ non-general layout
7003 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7004
7005 m_errorMonitor->SetDesiredFailureMsg(
7006 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7007 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
7008 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7009 m_errorMonitor->VerifyFound();
7010 subpass.inputAttachmentCount = 0;
7011 subpass.colorAttachmentCount = 1;
7012 subpass.pColorAttachments = &attach;
7013 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7014 // perf warning for GENERAL layout on color attachment
7015 m_errorMonitor->SetDesiredFailureMsg(
7016 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7017 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
7018 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7019 m_errorMonitor->VerifyFound();
7020 // error w/ non-color opt or GENERAL layout for color attachment
7021 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7022 m_errorMonitor->SetDesiredFailureMsg(
7023 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7024 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
7025 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7026 m_errorMonitor->VerifyFound();
7027 subpass.colorAttachmentCount = 0;
7028 subpass.pDepthStencilAttachment = &attach;
7029 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7030 // perf warning for GENERAL layout on DS attachment
7031 m_errorMonitor->SetDesiredFailureMsg(
7032 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7033 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
7034 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7035 m_errorMonitor->VerifyFound();
7036 // error w/ non-ds opt or GENERAL layout for color attachment
7037 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7038 m_errorMonitor->SetDesiredFailureMsg(
7039 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7040 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
7041 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7042 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -06007043 // For this error we need a valid renderpass so create default one
7044 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7045 attach.attachment = 0;
7046 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
7047 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
7048 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
7049 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
7050 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
7051 // Can't do a CLEAR load on READ_ONLY initialLayout
7052 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
7053 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7054 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
7055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7056 " with invalid first layout "
7057 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
7058 "ONLY_OPTIMAL");
7059 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7060 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06007061
7062 vkDestroyImage(m_device->device(), src_image, NULL);
7063 vkDestroyImage(m_device->device(), dst_image, NULL);
7064}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007065#endif // DRAW_STATE_TESTS
7066
Tobin Ehlis0788f522015-05-26 16:11:58 -06007067#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06007068#if GTEST_IS_THREADSAFE
7069struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007070 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007071 VkEvent event;
7072 bool bailout;
7073};
7074
Karl Schultz6addd812016-02-02 17:17:23 -07007075extern "C" void *AddToCommandBuffer(void *arg) {
7076 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007077
Karl Schultz6addd812016-02-02 17:17:23 -07007078 for (int i = 0; i < 10000; i++) {
7079 vkCmdSetEvent(data->commandBuffer, data->event,
7080 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007081 if (data->bailout) {
7082 break;
7083 }
7084 }
7085 return NULL;
7086}
7087
Karl Schultz6addd812016-02-02 17:17:23 -07007088TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007089 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007090
Karl Schultz6addd812016-02-02 17:17:23 -07007091 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7092 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007093
Mike Stroyanaccf7692015-05-12 16:00:45 -06007094 ASSERT_NO_FATAL_FAILURE(InitState());
7095 ASSERT_NO_FATAL_FAILURE(InitViewport());
7096 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7097
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007098 // Calls AllocateCommandBuffers
7099 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06007100
7101 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007102 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007103
7104 VkEventCreateInfo event_info;
7105 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007106 VkResult err;
7107
7108 memset(&event_info, 0, sizeof(event_info));
7109 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
7110
Chia-I Wuf7458c52015-10-26 21:10:41 +08007111 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007112 ASSERT_VK_SUCCESS(err);
7113
Mike Stroyanaccf7692015-05-12 16:00:45 -06007114 err = vkResetEvent(device(), event);
7115 ASSERT_VK_SUCCESS(err);
7116
7117 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007118 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007119 data.event = event;
7120 data.bailout = false;
7121 m_errorMonitor->SetBailout(&data.bailout);
7122 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007123 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007124 // Add many entries to command buffer from this thread at the same time.
7125 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06007126
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007127 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007128 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007129
Mike Stroyan10b8cb72016-01-22 15:22:03 -07007130 m_errorMonitor->SetBailout(NULL);
7131
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007132 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007133
Chia-I Wuf7458c52015-10-26 21:10:41 +08007134 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007135}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007136#endif // GTEST_IS_THREADSAFE
7137#endif // THREADING_TESTS
7138
Chris Forbes9f7ff632015-05-25 11:13:08 +12007139#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007140TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007141 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007142 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007143
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007144 ASSERT_NO_FATAL_FAILURE(InitState());
7145 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7146
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007147 VkShaderModule module;
7148 VkShaderModuleCreateInfo moduleCreateInfo;
7149 struct icd_spv_header spv;
7150
7151 spv.magic = ICD_SPV_MAGIC;
7152 spv.version = ICD_SPV_VERSION;
7153 spv.gen_magic = 0;
7154
7155 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7156 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007157 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007158 moduleCreateInfo.codeSize = 4;
7159 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007160 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007161
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007162 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007163}
7164
Karl Schultz6addd812016-02-02 17:17:23 -07007165TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007167 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007168
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007169 ASSERT_NO_FATAL_FAILURE(InitState());
7170 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7171
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007172 VkShaderModule module;
7173 VkShaderModuleCreateInfo moduleCreateInfo;
7174 struct icd_spv_header spv;
7175
7176 spv.magic = ~ICD_SPV_MAGIC;
7177 spv.version = ICD_SPV_VERSION;
7178 spv.gen_magic = 0;
7179
7180 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7181 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007182 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007183 moduleCreateInfo.codeSize = sizeof(spv) + 10;
7184 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007185 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007186
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007187 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007188}
7189
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007190#if 0
7191// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07007192TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007194 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007195
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007196 ASSERT_NO_FATAL_FAILURE(InitState());
7197 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7198
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007199 VkShaderModule module;
7200 VkShaderModuleCreateInfo moduleCreateInfo;
7201 struct icd_spv_header spv;
7202
7203 spv.magic = ICD_SPV_MAGIC;
7204 spv.version = ~ICD_SPV_VERSION;
7205 spv.gen_magic = 0;
7206
7207 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7208 moduleCreateInfo.pNext = NULL;
7209
Karl Schultz6addd812016-02-02 17:17:23 -07007210 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007211 moduleCreateInfo.codeSize = sizeof(spv) + 10;
7212 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007213 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007214
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007215 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007216}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007217#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007218
Karl Schultz6addd812016-02-02 17:17:23 -07007219TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007221 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007222
Chris Forbes9f7ff632015-05-25 11:13:08 +12007223 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007224 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12007225
7226 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007227 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12007228 "\n"
7229 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007230 "out gl_PerVertex {\n"
7231 " vec4 gl_Position;\n"
7232 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12007233 "void main(){\n"
7234 " gl_Position = vec4(1);\n"
7235 " x = 0;\n"
7236 "}\n";
7237 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007238 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12007239 "\n"
7240 "layout(location=0) out vec4 color;\n"
7241 "void main(){\n"
7242 " color = vec4(1);\n"
7243 "}\n";
7244
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007245 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7246 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12007247
7248 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007249 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12007250 pipe.AddShader(&vs);
7251 pipe.AddShader(&fs);
7252
Chris Forbes9f7ff632015-05-25 11:13:08 +12007253 VkDescriptorSetObj descriptorSet(m_device);
7254 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007255 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12007256
Tony Barbour5781e8f2015-08-04 16:23:11 -06007257 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12007258
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007259 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12007260}
Chris Forbes9f7ff632015-05-25 11:13:08 +12007261
Karl Schultz6addd812016-02-02 17:17:23 -07007262TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007264 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007265
Chris Forbes59cb88d2015-05-25 11:13:13 +12007266 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007267 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12007268
7269 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007270 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12007271 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007272 "out gl_PerVertex {\n"
7273 " vec4 gl_Position;\n"
7274 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12007275 "void main(){\n"
7276 " gl_Position = vec4(1);\n"
7277 "}\n";
7278 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007279 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12007280 "\n"
7281 "layout(location=0) in float x;\n"
7282 "layout(location=0) out vec4 color;\n"
7283 "void main(){\n"
7284 " color = vec4(x);\n"
7285 "}\n";
7286
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007287 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7288 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12007289
7290 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007291 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12007292 pipe.AddShader(&vs);
7293 pipe.AddShader(&fs);
7294
Chris Forbes59cb88d2015-05-25 11:13:13 +12007295 VkDescriptorSetObj descriptorSet(m_device);
7296 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007297 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12007298
Tony Barbour5781e8f2015-08-04 16:23:11 -06007299 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12007300
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007301 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12007302}
7303
Karl Schultz6addd812016-02-02 17:17:23 -07007304TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13007305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007306 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13007307
7308 ASSERT_NO_FATAL_FAILURE(InitState());
7309 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7310
7311 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007312 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007313 "\n"
7314 "out gl_PerVertex {\n"
7315 " vec4 gl_Position;\n"
7316 "};\n"
7317 "void main(){\n"
7318 " gl_Position = vec4(1);\n"
7319 "}\n";
7320 char const *fsSource =
7321 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007322 "\n"
7323 "in block { layout(location=0) float x; } ins;\n"
7324 "layout(location=0) out vec4 color;\n"
7325 "void main(){\n"
7326 " color = vec4(ins.x);\n"
7327 "}\n";
7328
7329 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7330 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7331
7332 VkPipelineObj pipe(m_device);
7333 pipe.AddColorAttachment();
7334 pipe.AddShader(&vs);
7335 pipe.AddShader(&fs);
7336
7337 VkDescriptorSetObj descriptorSet(m_device);
7338 descriptorSet.AppendDummy();
7339 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7340
7341 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7342
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007343 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13007344}
7345
Karl Schultz6addd812016-02-02 17:17:23 -07007346TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13007347 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13007348 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07007349 "output arr[2] of float32' vs 'ptr to "
7350 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13007351
7352 ASSERT_NO_FATAL_FAILURE(InitState());
7353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7354
7355 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007356 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13007357 "\n"
7358 "layout(location=0) out float x[2];\n"
7359 "out gl_PerVertex {\n"
7360 " vec4 gl_Position;\n"
7361 "};\n"
7362 "void main(){\n"
7363 " x[0] = 0; x[1] = 0;\n"
7364 " gl_Position = vec4(1);\n"
7365 "}\n";
7366 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007367 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13007368 "\n"
7369 "layout(location=0) in float x[3];\n"
7370 "layout(location=0) out vec4 color;\n"
7371 "void main(){\n"
7372 " color = vec4(x[0] + x[1] + x[2]);\n"
7373 "}\n";
7374
7375 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7376 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7377
7378 VkPipelineObj pipe(m_device);
7379 pipe.AddColorAttachment();
7380 pipe.AddShader(&vs);
7381 pipe.AddShader(&fs);
7382
7383 VkDescriptorSetObj descriptorSet(m_device);
7384 descriptorSet.AppendDummy();
7385 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7386
7387 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7388
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007389 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13007390}
7391
Karl Schultz6addd812016-02-02 17:17:23 -07007392TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007394 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007395
Chris Forbesb56af562015-05-25 11:13:17 +12007396 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007397 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12007398
7399 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007400 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007401 "\n"
7402 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007403 "out gl_PerVertex {\n"
7404 " vec4 gl_Position;\n"
7405 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007406 "void main(){\n"
7407 " x = 0;\n"
7408 " gl_Position = vec4(1);\n"
7409 "}\n";
7410 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007411 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007412 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007413 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12007414 "layout(location=0) out vec4 color;\n"
7415 "void main(){\n"
7416 " color = vec4(x);\n"
7417 "}\n";
7418
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007419 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7420 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12007421
7422 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007423 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12007424 pipe.AddShader(&vs);
7425 pipe.AddShader(&fs);
7426
Chris Forbesb56af562015-05-25 11:13:17 +12007427 VkDescriptorSetObj descriptorSet(m_device);
7428 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007429 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12007430
Tony Barbour5781e8f2015-08-04 16:23:11 -06007431 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12007432
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007433 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12007434}
7435
Karl Schultz6addd812016-02-02 17:17:23 -07007436TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13007437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007438 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13007439
7440 ASSERT_NO_FATAL_FAILURE(InitState());
7441 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7442
7443 char const *vsSource =
7444 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007445 "\n"
7446 "out block { layout(location=0) int x; } outs;\n"
7447 "out gl_PerVertex {\n"
7448 " vec4 gl_Position;\n"
7449 "};\n"
7450 "void main(){\n"
7451 " outs.x = 0;\n"
7452 " gl_Position = vec4(1);\n"
7453 "}\n";
7454 char const *fsSource =
7455 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007456 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007457 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13007458 "layout(location=0) out vec4 color;\n"
7459 "void main(){\n"
7460 " color = vec4(ins.x);\n"
7461 "}\n";
7462
7463 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7464 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7465
7466 VkPipelineObj pipe(m_device);
7467 pipe.AddColorAttachment();
7468 pipe.AddShader(&vs);
7469 pipe.AddShader(&fs);
7470
7471 VkDescriptorSetObj descriptorSet(m_device);
7472 descriptorSet.AppendDummy();
7473 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7474
7475 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7476
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007477 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13007478}
7479
7480TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
7481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7482 "location 0.0 which is not written by vertex shader");
7483
7484 ASSERT_NO_FATAL_FAILURE(InitState());
7485 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7486
7487 char const *vsSource =
7488 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007489 "\n"
7490 "out block { layout(location=1) float x; } outs;\n"
7491 "out gl_PerVertex {\n"
7492 " vec4 gl_Position;\n"
7493 "};\n"
7494 "void main(){\n"
7495 " outs.x = 0;\n"
7496 " gl_Position = vec4(1);\n"
7497 "}\n";
7498 char const *fsSource =
7499 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007500 "\n"
7501 "in block { layout(location=0) float x; } ins;\n"
7502 "layout(location=0) out vec4 color;\n"
7503 "void main(){\n"
7504 " color = vec4(ins.x);\n"
7505 "}\n";
7506
7507 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7508 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7509
7510 VkPipelineObj pipe(m_device);
7511 pipe.AddColorAttachment();
7512 pipe.AddShader(&vs);
7513 pipe.AddShader(&fs);
7514
7515 VkDescriptorSetObj descriptorSet(m_device);
7516 descriptorSet.AppendDummy();
7517 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7518
7519 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7520
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007521 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13007522}
7523
7524TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
7525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7526 "location 0.1 which is not written by vertex shader");
7527
7528 ASSERT_NO_FATAL_FAILURE(InitState());
7529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7530
7531 char const *vsSource =
7532 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007533 "\n"
7534 "out block { layout(location=0, component=0) float x; } outs;\n"
7535 "out gl_PerVertex {\n"
7536 " vec4 gl_Position;\n"
7537 "};\n"
7538 "void main(){\n"
7539 " outs.x = 0;\n"
7540 " gl_Position = vec4(1);\n"
7541 "}\n";
7542 char const *fsSource =
7543 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007544 "\n"
7545 "in block { layout(location=0, component=1) float x; } ins;\n"
7546 "layout(location=0) out vec4 color;\n"
7547 "void main(){\n"
7548 " color = vec4(ins.x);\n"
7549 "}\n";
7550
7551 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7552 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7553
7554 VkPipelineObj pipe(m_device);
7555 pipe.AddColorAttachment();
7556 pipe.AddShader(&vs);
7557 pipe.AddShader(&fs);
7558
7559 VkDescriptorSetObj descriptorSet(m_device);
7560 descriptorSet.AppendDummy();
7561 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7562
7563 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7564
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007565 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13007566}
7567
Karl Schultz6addd812016-02-02 17:17:23 -07007568TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007570 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007571
Chris Forbesde136e02015-05-25 11:13:28 +12007572 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007573 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12007574
7575 VkVertexInputBindingDescription input_binding;
7576 memset(&input_binding, 0, sizeof(input_binding));
7577
7578 VkVertexInputAttributeDescription input_attrib;
7579 memset(&input_attrib, 0, sizeof(input_attrib));
7580 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7581
7582 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007583 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007584 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007585 "out gl_PerVertex {\n"
7586 " vec4 gl_Position;\n"
7587 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007588 "void main(){\n"
7589 " gl_Position = vec4(1);\n"
7590 "}\n";
7591 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007592 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007593 "\n"
7594 "layout(location=0) out vec4 color;\n"
7595 "void main(){\n"
7596 " color = vec4(1);\n"
7597 "}\n";
7598
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007599 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7600 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12007601
7602 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007603 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12007604 pipe.AddShader(&vs);
7605 pipe.AddShader(&fs);
7606
7607 pipe.AddVertexInputBindings(&input_binding, 1);
7608 pipe.AddVertexInputAttribs(&input_attrib, 1);
7609
Chris Forbesde136e02015-05-25 11:13:28 +12007610 VkDescriptorSetObj descriptorSet(m_device);
7611 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007612 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12007613
Tony Barbour5781e8f2015-08-04 16:23:11 -06007614 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12007615
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007616 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12007617}
7618
Karl Schultz6addd812016-02-02 17:17:23 -07007619TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007621 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13007622
7623 ASSERT_NO_FATAL_FAILURE(InitState());
7624 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7625
7626 VkVertexInputBindingDescription input_binding;
7627 memset(&input_binding, 0, sizeof(input_binding));
7628
7629 VkVertexInputAttributeDescription input_attrib;
7630 memset(&input_attrib, 0, sizeof(input_attrib));
7631 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7632
7633 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007634 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007635 "\n"
7636 "layout(location=1) in float x;\n"
7637 "out gl_PerVertex {\n"
7638 " vec4 gl_Position;\n"
7639 "};\n"
7640 "void main(){\n"
7641 " gl_Position = vec4(x);\n"
7642 "}\n";
7643 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007644 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007645 "\n"
7646 "layout(location=0) out vec4 color;\n"
7647 "void main(){\n"
7648 " color = vec4(1);\n"
7649 "}\n";
7650
7651 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7652 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7653
7654 VkPipelineObj pipe(m_device);
7655 pipe.AddColorAttachment();
7656 pipe.AddShader(&vs);
7657 pipe.AddShader(&fs);
7658
7659 pipe.AddVertexInputBindings(&input_binding, 1);
7660 pipe.AddVertexInputAttribs(&input_attrib, 1);
7661
7662 VkDescriptorSetObj descriptorSet(m_device);
7663 descriptorSet.AppendDummy();
7664 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7665
7666 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7667
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007668 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13007669}
7670
Karl Schultz6addd812016-02-02 17:17:23 -07007671TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
7672 m_errorMonitor->SetDesiredFailureMsg(
7673 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007674 "VS consumes input at location 0 but not provided");
7675
Chris Forbes62e8e502015-05-25 11:13:29 +12007676 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007677 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12007678
7679 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007680 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007681 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007682 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07007683 "out gl_PerVertex {\n"
7684 " vec4 gl_Position;\n"
7685 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007686 "void main(){\n"
7687 " gl_Position = x;\n"
7688 "}\n";
7689 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007690 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007691 "\n"
7692 "layout(location=0) out vec4 color;\n"
7693 "void main(){\n"
7694 " color = vec4(1);\n"
7695 "}\n";
7696
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007697 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7698 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12007699
7700 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007701 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12007702 pipe.AddShader(&vs);
7703 pipe.AddShader(&fs);
7704
Chris Forbes62e8e502015-05-25 11:13:29 +12007705 VkDescriptorSetObj descriptorSet(m_device);
7706 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007707 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12007708
Tony Barbour5781e8f2015-08-04 16:23:11 -06007709 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12007710
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007711 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12007712}
7713
Karl Schultz6addd812016-02-02 17:17:23 -07007714TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
7715 m_errorMonitor->SetDesiredFailureMsg(
7716 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007717 "location 0 does not match VS input type");
7718
Chris Forbesc97d98e2015-05-25 11:13:31 +12007719 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007720 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12007721
7722 VkVertexInputBindingDescription input_binding;
7723 memset(&input_binding, 0, sizeof(input_binding));
7724
7725 VkVertexInputAttributeDescription input_attrib;
7726 memset(&input_attrib, 0, sizeof(input_attrib));
7727 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7728
7729 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007730 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007731 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007732 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007733 "out gl_PerVertex {\n"
7734 " vec4 gl_Position;\n"
7735 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007736 "void main(){\n"
7737 " gl_Position = vec4(x);\n"
7738 "}\n";
7739 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007740 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007741 "\n"
7742 "layout(location=0) out vec4 color;\n"
7743 "void main(){\n"
7744 " color = vec4(1);\n"
7745 "}\n";
7746
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007747 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7748 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12007749
7750 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007751 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12007752 pipe.AddShader(&vs);
7753 pipe.AddShader(&fs);
7754
7755 pipe.AddVertexInputBindings(&input_binding, 1);
7756 pipe.AddVertexInputAttribs(&input_attrib, 1);
7757
Chris Forbesc97d98e2015-05-25 11:13:31 +12007758 VkDescriptorSetObj descriptorSet(m_device);
7759 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007760 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12007761
Tony Barbour5781e8f2015-08-04 16:23:11 -06007762 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12007763
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007764 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12007765}
7766
Chris Forbesc68b43c2016-04-06 11:18:47 +12007767TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
7768 m_errorMonitor->SetDesiredFailureMsg(
7769 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7770 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
7771
7772 ASSERT_NO_FATAL_FAILURE(InitState());
7773 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7774
7775 char const *vsSource =
7776 "#version 450\n"
7777 "\n"
7778 "out gl_PerVertex {\n"
7779 " vec4 gl_Position;\n"
7780 "};\n"
7781 "void main(){\n"
7782 " gl_Position = vec4(1);\n"
7783 "}\n";
7784 char const *fsSource =
7785 "#version 450\n"
7786 "\n"
7787 "layout(location=0) out vec4 color;\n"
7788 "void main(){\n"
7789 " color = vec4(1);\n"
7790 "}\n";
7791
7792 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7793 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7794
7795 VkPipelineObj pipe(m_device);
7796 pipe.AddColorAttachment();
7797 pipe.AddShader(&vs);
7798 pipe.AddShader(&vs);
7799 pipe.AddShader(&fs);
7800
7801 VkDescriptorSetObj descriptorSet(m_device);
7802 descriptorSet.AppendDummy();
7803 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7804
7805 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7806
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007807 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12007808}
7809
Karl Schultz6addd812016-02-02 17:17:23 -07007810TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007811 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007812
7813 ASSERT_NO_FATAL_FAILURE(InitState());
7814 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7815
7816 VkVertexInputBindingDescription input_binding;
7817 memset(&input_binding, 0, sizeof(input_binding));
7818
7819 VkVertexInputAttributeDescription input_attribs[2];
7820 memset(input_attribs, 0, sizeof(input_attribs));
7821
7822 for (int i = 0; i < 2; i++) {
7823 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7824 input_attribs[i].location = i;
7825 }
7826
7827 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007828 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007829 "\n"
7830 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007831 "out gl_PerVertex {\n"
7832 " vec4 gl_Position;\n"
7833 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007834 "void main(){\n"
7835 " gl_Position = x[0] + x[1];\n"
7836 "}\n";
7837 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007838 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007839 "\n"
7840 "layout(location=0) out vec4 color;\n"
7841 "void main(){\n"
7842 " color = vec4(1);\n"
7843 "}\n";
7844
7845 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7846 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7847
7848 VkPipelineObj pipe(m_device);
7849 pipe.AddColorAttachment();
7850 pipe.AddShader(&vs);
7851 pipe.AddShader(&fs);
7852
7853 pipe.AddVertexInputBindings(&input_binding, 1);
7854 pipe.AddVertexInputAttribs(input_attribs, 2);
7855
7856 VkDescriptorSetObj descriptorSet(m_device);
7857 descriptorSet.AppendDummy();
7858 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7859
7860 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7861
7862 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007863 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007864}
7865
Chris Forbes2682b242015-11-24 11:13:14 +13007866TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
7867{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007868 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007869
7870 ASSERT_NO_FATAL_FAILURE(InitState());
7871 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7872
7873 VkVertexInputBindingDescription input_binding;
7874 memset(&input_binding, 0, sizeof(input_binding));
7875
7876 VkVertexInputAttributeDescription input_attribs[2];
7877 memset(input_attribs, 0, sizeof(input_attribs));
7878
7879 for (int i = 0; i < 2; i++) {
7880 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7881 input_attribs[i].location = i;
7882 }
7883
7884 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007885 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007886 "\n"
7887 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07007888 "out gl_PerVertex {\n"
7889 " vec4 gl_Position;\n"
7890 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007891 "void main(){\n"
7892 " gl_Position = x[0] + x[1];\n"
7893 "}\n";
7894 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007895 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007896 "\n"
7897 "layout(location=0) out vec4 color;\n"
7898 "void main(){\n"
7899 " color = vec4(1);\n"
7900 "}\n";
7901
7902 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7903 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7904
7905 VkPipelineObj pipe(m_device);
7906 pipe.AddColorAttachment();
7907 pipe.AddShader(&vs);
7908 pipe.AddShader(&fs);
7909
7910 pipe.AddVertexInputBindings(&input_binding, 1);
7911 pipe.AddVertexInputAttribs(input_attribs, 2);
7912
7913 VkDescriptorSetObj descriptorSet(m_device);
7914 descriptorSet.AppendDummy();
7915 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7916
7917 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7918
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007919 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007920}
Chris Forbes2682b242015-11-24 11:13:14 +13007921
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007922TEST_F(VkLayerTest, CreatePipelineSimplePositive)
7923{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007924 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007925
7926 ASSERT_NO_FATAL_FAILURE(InitState());
7927 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7928
7929 char const *vsSource =
7930 "#version 450\n"
7931 "out gl_PerVertex {\n"
7932 " vec4 gl_Position;\n"
7933 "};\n"
7934 "void main(){\n"
7935 " gl_Position = vec4(0);\n"
7936 "}\n";
7937 char const *fsSource =
7938 "#version 450\n"
7939 "\n"
7940 "layout(location=0) out vec4 color;\n"
7941 "void main(){\n"
7942 " color = vec4(1);\n"
7943 "}\n";
7944
7945 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7946 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7947
7948 VkPipelineObj pipe(m_device);
7949 pipe.AddColorAttachment();
7950 pipe.AddShader(&vs);
7951 pipe.AddShader(&fs);
7952
7953 VkDescriptorSetObj descriptorSet(m_device);
7954 descriptorSet.AppendDummy();
7955 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7956
7957 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7958
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007959 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007960}
7961
Chris Forbes912c9192016-04-05 17:50:35 +12007962TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
7963{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007964 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12007965
7966 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
7967
7968 ASSERT_NO_FATAL_FAILURE(InitState());
7969 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7970
7971 char const *vsSource =
7972 "#version 450\n"
7973 "out gl_PerVertex {\n"
7974 " vec4 gl_Position;\n"
7975 "};\n"
7976 "layout(location=0) out vec3 x;\n"
7977 "layout(location=1) out ivec3 y;\n"
7978 "layout(location=2) out vec3 z;\n"
7979 "void main(){\n"
7980 " gl_Position = vec4(0);\n"
7981 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
7982 "}\n";
7983 char const *fsSource =
7984 "#version 450\n"
7985 "\n"
7986 "layout(location=0) out vec4 color;\n"
7987 "layout(location=0) in float x;\n"
7988 "layout(location=1) flat in int y;\n"
7989 "layout(location=2) in vec2 z;\n"
7990 "void main(){\n"
7991 " color = vec4(1 + x + y + z.x);\n"
7992 "}\n";
7993
7994 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7995 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7996
7997 VkPipelineObj pipe(m_device);
7998 pipe.AddColorAttachment();
7999 pipe.AddShader(&vs);
8000 pipe.AddShader(&fs);
8001
8002 VkDescriptorSetObj descriptorSet(m_device);
8003 descriptorSet.AppendDummy();
8004 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8005
8006 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8007
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008008 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12008009}
8010
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008011TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
8012{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008013 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008014
8015 ASSERT_NO_FATAL_FAILURE(InitState());
8016 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8017
Chris Forbesc1e852d2016-04-04 19:26:42 +12008018 if (!m_device->phy().features().tessellationShader) {
8019 printf("Device does not support tessellation shaders; skipped.\n");
8020 return;
8021 }
8022
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008023 char const *vsSource =
8024 "#version 450\n"
8025 "void main(){}\n";
8026 char const *tcsSource =
8027 "#version 450\n"
8028 "layout(location=0) out int x[];\n"
8029 "layout(vertices=3) out;\n"
8030 "void main(){\n"
8031 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
8032 " gl_TessLevelInner[0] = 1;\n"
8033 " x[gl_InvocationID] = gl_InvocationID;\n"
8034 "}\n";
8035 char const *tesSource =
8036 "#version 450\n"
8037 "layout(triangles, equal_spacing, cw) in;\n"
8038 "layout(location=0) in int x[];\n"
8039 "out gl_PerVertex { vec4 gl_Position; };\n"
8040 "void main(){\n"
8041 " gl_Position.xyz = gl_TessCoord;\n"
8042 " gl_Position.w = x[0] + x[1] + x[2];\n"
8043 "}\n";
8044 char const *fsSource =
8045 "#version 450\n"
8046 "layout(location=0) out vec4 color;\n"
8047 "void main(){\n"
8048 " color = vec4(1);\n"
8049 "}\n";
8050
8051 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8052 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
8053 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
8054 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8055
8056 VkPipelineInputAssemblyStateCreateInfo iasci{
8057 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
8058 nullptr,
8059 0,
8060 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
8061 VK_FALSE};
8062
Chris Forbesb4cacb62016-04-04 19:15:00 +12008063 VkPipelineTessellationStateCreateInfo tsci{
8064 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
8065 nullptr,
8066 0,
8067 3};
8068
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008069 VkPipelineObj pipe(m_device);
8070 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12008071 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008072 pipe.AddColorAttachment();
8073 pipe.AddShader(&vs);
8074 pipe.AddShader(&tcs);
8075 pipe.AddShader(&tes);
8076 pipe.AddShader(&fs);
8077
8078 VkDescriptorSetObj descriptorSet(m_device);
8079 descriptorSet.AppendDummy();
8080 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8081
8082 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8083
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008084 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008085}
8086
Chris Forbesa0ab8152016-04-20 13:34:27 +12008087TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
8088{
8089 m_errorMonitor->ExpectSuccess();
8090
8091 ASSERT_NO_FATAL_FAILURE(InitState());
8092 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8093
8094 if (!m_device->phy().features().geometryShader) {
8095 printf("Device does not support geometry shaders; skipped.\n");
8096 return;
8097 }
8098
8099 char const *vsSource =
8100 "#version 450\n"
8101 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
8102 "void main(){\n"
8103 " vs_out.x = vec4(1);\n"
8104 "}\n";
8105 char const *gsSource =
8106 "#version 450\n"
8107 "layout(triangles) in;\n"
8108 "layout(triangle_strip, max_vertices=3) out;\n"
8109 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
8110 "out gl_PerVertex { vec4 gl_Position; };\n"
8111 "void main() {\n"
8112 " gl_Position = gs_in[0].x;\n"
8113 " EmitVertex();\n"
8114 "}\n";
8115 char const *fsSource =
8116 "#version 450\n"
8117 "layout(location=0) out vec4 color;\n"
8118 "void main(){\n"
8119 " color = vec4(1);\n"
8120 "}\n";
8121
8122 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8123 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
8124 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8125
8126 VkPipelineObj pipe(m_device);
8127 pipe.AddColorAttachment();
8128 pipe.AddShader(&vs);
8129 pipe.AddShader(&gs);
8130 pipe.AddShader(&fs);
8131
8132 VkDescriptorSetObj descriptorSet(m_device);
8133 descriptorSet.AppendDummy();
8134 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8135
8136 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8137
8138 m_errorMonitor->VerifyNotFound();
8139}
8140
Chris Forbesa0193bc2016-04-04 19:19:47 +12008141TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
8142{
8143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8144 "is per-vertex in tessellation control shader stage "
8145 "but per-patch in tessellation evaluation shader stage");
8146
8147 ASSERT_NO_FATAL_FAILURE(InitState());
8148 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8149
Chris Forbesc1e852d2016-04-04 19:26:42 +12008150 if (!m_device->phy().features().tessellationShader) {
8151 printf("Device does not support tessellation shaders; skipped.\n");
8152 return;
8153 }
8154
Chris Forbesa0193bc2016-04-04 19:19:47 +12008155 char const *vsSource =
8156 "#version 450\n"
8157 "void main(){}\n";
8158 char const *tcsSource =
8159 "#version 450\n"
8160 "layout(location=0) out int x[];\n"
8161 "layout(vertices=3) out;\n"
8162 "void main(){\n"
8163 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
8164 " gl_TessLevelInner[0] = 1;\n"
8165 " x[gl_InvocationID] = gl_InvocationID;\n"
8166 "}\n";
8167 char const *tesSource =
8168 "#version 450\n"
8169 "layout(triangles, equal_spacing, cw) in;\n"
8170 "layout(location=0) patch in int x;\n"
8171 "out gl_PerVertex { vec4 gl_Position; };\n"
8172 "void main(){\n"
8173 " gl_Position.xyz = gl_TessCoord;\n"
8174 " gl_Position.w = x;\n"
8175 "}\n";
8176 char const *fsSource =
8177 "#version 450\n"
8178 "layout(location=0) out vec4 color;\n"
8179 "void main(){\n"
8180 " color = vec4(1);\n"
8181 "}\n";
8182
8183 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8184 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
8185 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
8186 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8187
8188 VkPipelineInputAssemblyStateCreateInfo iasci{
8189 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
8190 nullptr,
8191 0,
8192 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
8193 VK_FALSE};
8194
8195 VkPipelineTessellationStateCreateInfo tsci{
8196 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
8197 nullptr,
8198 0,
8199 3};
8200
8201 VkPipelineObj pipe(m_device);
8202 pipe.SetInputAssembly(&iasci);
8203 pipe.SetTessellation(&tsci);
8204 pipe.AddColorAttachment();
8205 pipe.AddShader(&vs);
8206 pipe.AddShader(&tcs);
8207 pipe.AddShader(&tes);
8208 pipe.AddShader(&fs);
8209
8210 VkDescriptorSetObj descriptorSet(m_device);
8211 descriptorSet.AppendDummy();
8212 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8213
8214 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8215
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008216 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12008217}
8218
Karl Schultz6addd812016-02-02 17:17:23 -07008219TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
8220 m_errorMonitor->SetDesiredFailureMsg(
8221 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008222 "Duplicate vertex input binding descriptions for binding 0");
8223
Chris Forbes280ba2c2015-06-12 11:16:41 +12008224 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008225 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12008226
8227 /* Two binding descriptions for binding 0 */
8228 VkVertexInputBindingDescription input_bindings[2];
8229 memset(input_bindings, 0, sizeof(input_bindings));
8230
8231 VkVertexInputAttributeDescription input_attrib;
8232 memset(&input_attrib, 0, sizeof(input_attrib));
8233 input_attrib.format = VK_FORMAT_R32_SFLOAT;
8234
8235 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008236 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12008237 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008238 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07008239 "out gl_PerVertex {\n"
8240 " vec4 gl_Position;\n"
8241 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12008242 "void main(){\n"
8243 " gl_Position = vec4(x);\n"
8244 "}\n";
8245 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008246 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12008247 "\n"
8248 "layout(location=0) out vec4 color;\n"
8249 "void main(){\n"
8250 " color = vec4(1);\n"
8251 "}\n";
8252
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008253 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8254 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12008255
8256 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008257 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12008258 pipe.AddShader(&vs);
8259 pipe.AddShader(&fs);
8260
8261 pipe.AddVertexInputBindings(input_bindings, 2);
8262 pipe.AddVertexInputAttribs(&input_attrib, 1);
8263
Chris Forbes280ba2c2015-06-12 11:16:41 +12008264 VkDescriptorSetObj descriptorSet(m_device);
8265 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008266 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12008267
Tony Barbour5781e8f2015-08-04 16:23:11 -06008268 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12008269
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008270 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12008271}
Chris Forbes8f68b562015-05-25 11:13:32 +12008272
Chris Forbes35efec72016-04-21 14:32:08 +12008273TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
8274 m_errorMonitor->ExpectSuccess();
8275
8276 ASSERT_NO_FATAL_FAILURE(InitState());
8277 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8278
8279 if (!m_device->phy().features().tessellationShader) {
8280 printf("Device does not support 64bit vertex attributes; skipped.\n");
8281 return;
8282 }
8283
8284 VkVertexInputBindingDescription input_bindings[1];
8285 memset(input_bindings, 0, sizeof(input_bindings));
8286
8287 VkVertexInputAttributeDescription input_attribs[4];
8288 memset(input_attribs, 0, sizeof(input_attribs));
8289 input_attribs[0].location = 0;
8290 input_attribs[0].offset = 0;
8291 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8292 input_attribs[1].location = 2;
8293 input_attribs[1].offset = 32;
8294 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8295 input_attribs[2].location = 4;
8296 input_attribs[2].offset = 64;
8297 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8298 input_attribs[3].location = 6;
8299 input_attribs[3].offset = 96;
8300 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8301
8302 char const *vsSource =
8303 "#version 450\n"
8304 "\n"
8305 "layout(location=0) in dmat4 x;\n"
8306 "out gl_PerVertex {\n"
8307 " vec4 gl_Position;\n"
8308 "};\n"
8309 "void main(){\n"
8310 " gl_Position = vec4(x[0][0]);\n"
8311 "}\n";
8312 char const *fsSource =
8313 "#version 450\n"
8314 "\n"
8315 "layout(location=0) out vec4 color;\n"
8316 "void main(){\n"
8317 " color = vec4(1);\n"
8318 "}\n";
8319
8320 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8321 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8322
8323 VkPipelineObj pipe(m_device);
8324 pipe.AddColorAttachment();
8325 pipe.AddShader(&vs);
8326 pipe.AddShader(&fs);
8327
8328 pipe.AddVertexInputBindings(input_bindings, 1);
8329 pipe.AddVertexInputAttribs(input_attribs, 4);
8330
8331 VkDescriptorSetObj descriptorSet(m_device);
8332 descriptorSet.AppendDummy();
8333 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8334
8335 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8336
8337 m_errorMonitor->VerifyNotFound();
8338}
8339
Karl Schultz6addd812016-02-02 17:17:23 -07008340TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008342 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008343
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008344 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008345
8346 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008347 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008348 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008349 "out gl_PerVertex {\n"
8350 " vec4 gl_Position;\n"
8351 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008352 "void main(){\n"
8353 " gl_Position = vec4(1);\n"
8354 "}\n";
8355 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008356 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008357 "\n"
8358 "void main(){\n"
8359 "}\n";
8360
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008361 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8362 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008363
8364 VkPipelineObj pipe(m_device);
8365 pipe.AddShader(&vs);
8366 pipe.AddShader(&fs);
8367
Chia-I Wu08accc62015-07-07 11:50:03 +08008368 /* set up CB 0, not written */
8369 pipe.AddColorAttachment();
8370 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008371
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008372 VkDescriptorSetObj descriptorSet(m_device);
8373 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008374 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008375
Tony Barbour5781e8f2015-08-04 16:23:11 -06008376 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008377
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008378 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008379}
8380
Karl Schultz6addd812016-02-02 17:17:23 -07008381TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07008382 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008383 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008384 "FS writes to output location 1 with no matching attachment");
8385
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008386 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008387
8388 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008389 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008390 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008391 "out gl_PerVertex {\n"
8392 " vec4 gl_Position;\n"
8393 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008394 "void main(){\n"
8395 " gl_Position = vec4(1);\n"
8396 "}\n";
8397 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008398 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008399 "\n"
8400 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008401 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008402 "void main(){\n"
8403 " x = vec4(1);\n"
8404 " y = vec4(1);\n"
8405 "}\n";
8406
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008407 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8408 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008409
8410 VkPipelineObj pipe(m_device);
8411 pipe.AddShader(&vs);
8412 pipe.AddShader(&fs);
8413
Chia-I Wu08accc62015-07-07 11:50:03 +08008414 /* set up CB 0, not written */
8415 pipe.AddColorAttachment();
8416 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008417 /* FS writes CB 1, but we don't configure it */
8418
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008419 VkDescriptorSetObj descriptorSet(m_device);
8420 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008421 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008422
Tony Barbour5781e8f2015-08-04 16:23:11 -06008423 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008424
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008425 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008426}
8427
Karl Schultz6addd812016-02-02 17:17:23 -07008428TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008430 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008431
Chris Forbesa36d69e2015-05-25 11:13:44 +12008432 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008433
8434 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008435 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008436 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008437 "out gl_PerVertex {\n"
8438 " vec4 gl_Position;\n"
8439 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008440 "void main(){\n"
8441 " gl_Position = vec4(1);\n"
8442 "}\n";
8443 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008444 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008445 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008446 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12008447 "void main(){\n"
8448 " x = ivec4(1);\n"
8449 "}\n";
8450
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008451 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8452 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12008453
8454 VkPipelineObj pipe(m_device);
8455 pipe.AddShader(&vs);
8456 pipe.AddShader(&fs);
8457
Chia-I Wu08accc62015-07-07 11:50:03 +08008458 /* set up CB 0; type is UNORM by default */
8459 pipe.AddColorAttachment();
8460 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008461
Chris Forbesa36d69e2015-05-25 11:13:44 +12008462 VkDescriptorSetObj descriptorSet(m_device);
8463 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008464 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12008465
Tony Barbour5781e8f2015-08-04 16:23:11 -06008466 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008467
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008468 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12008469}
Chris Forbes7b1b8932015-06-05 14:43:36 +12008470
Karl Schultz6addd812016-02-02 17:17:23 -07008471TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008472 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008473 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008474
Chris Forbes556c76c2015-08-14 12:04:59 +12008475 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12008476
8477 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008478 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008479 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008480 "out gl_PerVertex {\n"
8481 " vec4 gl_Position;\n"
8482 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008483 "void main(){\n"
8484 " gl_Position = vec4(1);\n"
8485 "}\n";
8486 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008487 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008488 "\n"
8489 "layout(location=0) out vec4 x;\n"
8490 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
8491 "void main(){\n"
8492 " x = vec4(bar.y);\n"
8493 "}\n";
8494
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008495 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8496 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12008497
Chris Forbes556c76c2015-08-14 12:04:59 +12008498 VkPipelineObj pipe(m_device);
8499 pipe.AddShader(&vs);
8500 pipe.AddShader(&fs);
8501
8502 /* set up CB 0; type is UNORM by default */
8503 pipe.AddColorAttachment();
8504 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8505
8506 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008507 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12008508
8509 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8510
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008511 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12008512}
8513
Chris Forbes5c59e902016-02-26 16:56:09 +13008514TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
8515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8516 "not declared in layout");
8517
8518 ASSERT_NO_FATAL_FAILURE(InitState());
8519
8520 char const *vsSource =
8521 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13008522 "\n"
8523 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
8524 "out gl_PerVertex {\n"
8525 " vec4 gl_Position;\n"
8526 "};\n"
8527 "void main(){\n"
8528 " gl_Position = vec4(consts.x);\n"
8529 "}\n";
8530 char const *fsSource =
8531 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13008532 "\n"
8533 "layout(location=0) out vec4 x;\n"
8534 "void main(){\n"
8535 " x = vec4(1);\n"
8536 "}\n";
8537
8538 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8539 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8540
8541 VkPipelineObj pipe(m_device);
8542 pipe.AddShader(&vs);
8543 pipe.AddShader(&fs);
8544
8545 /* set up CB 0; type is UNORM by default */
8546 pipe.AddColorAttachment();
8547 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8548
8549 VkDescriptorSetObj descriptorSet(m_device);
8550 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8551
8552 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8553
8554 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008555 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13008556}
8557
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008558#endif // SHADER_CHECKER_TESTS
8559
8560#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06008561TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07008562 m_errorMonitor->SetDesiredFailureMsg(
8563 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008564 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008565
8566 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008567
8568 // Create an image
8569 VkImage image;
8570
Karl Schultz6addd812016-02-02 17:17:23 -07008571 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8572 const int32_t tex_width = 32;
8573 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008574
8575 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008576 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8577 image_create_info.pNext = NULL;
8578 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8579 image_create_info.format = tex_format;
8580 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008581 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07008582 image_create_info.extent.depth = 1;
8583 image_create_info.mipLevels = 1;
8584 image_create_info.arrayLayers = 1;
8585 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8586 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8587 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8588 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008589
8590 // Introduce error by sending down a bogus width extent
8591 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008592 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008593
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008594 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008595}
8596
Mark Youngc48c4c12016-04-11 14:26:49 -06008597TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
8598 m_errorMonitor->SetDesiredFailureMsg(
8599 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8600 "CreateImage extents is 0 for at least one required dimension");
8601
8602 ASSERT_NO_FATAL_FAILURE(InitState());
8603
8604 // Create an image
8605 VkImage image;
8606
8607 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8608 const int32_t tex_width = 32;
8609 const int32_t tex_height = 32;
8610
8611 VkImageCreateInfo image_create_info = {};
8612 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8613 image_create_info.pNext = NULL;
8614 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8615 image_create_info.format = tex_format;
8616 image_create_info.extent.width = tex_width;
8617 image_create_info.extent.height = tex_height;
8618 image_create_info.extent.depth = 1;
8619 image_create_info.mipLevels = 1;
8620 image_create_info.arrayLayers = 1;
8621 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8622 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8623 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8624 image_create_info.flags = 0;
8625
8626 // Introduce error by sending down a bogus width extent
8627 image_create_info.extent.width = 0;
8628 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8629
8630 m_errorMonitor->VerifyFound();
8631}
8632
Karl Schultz6addd812016-02-02 17:17:23 -07008633TEST_F(VkLayerTest, UpdateBufferAlignment) {
8634 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06008635
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008637 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008638
Mike Stroyana3082432015-09-25 13:39:21 -06008639 ASSERT_NO_FATAL_FAILURE(InitState());
8640
8641 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8642 vk_testing::Buffer buffer;
8643 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8644
8645 BeginCommandBuffer();
8646 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008647 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008648 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008649
Mike Stroyana3082432015-09-25 13:39:21 -06008650 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008652 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008653
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008654 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008655 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008656 EndCommandBuffer();
8657}
8658
Karl Schultz6addd812016-02-02 17:17:23 -07008659TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008661 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06008662
8663 ASSERT_NO_FATAL_FAILURE(InitState());
8664
8665 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8666 vk_testing::Buffer buffer;
8667 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8668
8669 BeginCommandBuffer();
8670 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008671 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008672 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008673
Mike Stroyana3082432015-09-25 13:39:21 -06008674 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008676 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008677
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008678 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008679
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008680 m_errorMonitor->VerifyFound();
8681
Mike Stroyana3082432015-09-25 13:39:21 -06008682 EndCommandBuffer();
8683}
8684
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008685#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12008686
Tobin Ehliscde08892015-09-22 10:11:37 -06008687#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07008688TEST_F(VkLayerTest, InvalidImageView) {
8689 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06008690
Karl Schultz6addd812016-02-02 17:17:23 -07008691 m_errorMonitor->SetDesiredFailureMsg(
8692 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008693 "vkCreateImageView called with baseMipLevel 10 ");
8694
Tobin Ehliscde08892015-09-22 10:11:37 -06008695 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06008696
Mike Stroyana3082432015-09-25 13:39:21 -06008697 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07008698 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06008699
Karl Schultz6addd812016-02-02 17:17:23 -07008700 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8701 const int32_t tex_width = 32;
8702 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06008703
8704 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008705 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8706 image_create_info.pNext = NULL;
8707 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8708 image_create_info.format = tex_format;
8709 image_create_info.extent.width = tex_width;
8710 image_create_info.extent.height = tex_height;
8711 image_create_info.extent.depth = 1;
8712 image_create_info.mipLevels = 1;
8713 image_create_info.arrayLayers = 1;
8714 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8715 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8716 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8717 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06008718
Chia-I Wuf7458c52015-10-26 21:10:41 +08008719 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06008720 ASSERT_VK_SUCCESS(err);
8721
8722 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008723 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8724 image_view_create_info.image = image;
8725 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8726 image_view_create_info.format = tex_format;
8727 image_view_create_info.subresourceRange.layerCount = 1;
8728 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
8729 image_view_create_info.subresourceRange.levelCount = 1;
8730 image_view_create_info.subresourceRange.aspectMask =
8731 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06008732
8733 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008734 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8735 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06008736
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008737 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06008738}
Mike Stroyana3082432015-09-25 13:39:21 -06008739
Karl Schultz6addd812016-02-02 17:17:23 -07008740TEST_F(VkLayerTest, InvalidImageViewAspect) {
8741 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008742
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008744 "vkCreateImageView: Color image "
8745 "formats must have ONLY the "
8746 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008747
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008748 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008749
8750 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07008751 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008752
Karl Schultz6addd812016-02-02 17:17:23 -07008753 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8754 const int32_t tex_width = 32;
8755 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008756
8757 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008758 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8759 image_create_info.pNext = NULL;
8760 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8761 image_create_info.format = tex_format;
8762 image_create_info.extent.width = tex_width;
8763 image_create_info.extent.height = tex_height;
8764 image_create_info.extent.depth = 1;
8765 image_create_info.mipLevels = 1;
8766 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8767 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8768 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8769 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008770
Chia-I Wuf7458c52015-10-26 21:10:41 +08008771 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008772 ASSERT_VK_SUCCESS(err);
8773
8774 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008775 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8776 image_view_create_info.image = image;
8777 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8778 image_view_create_info.format = tex_format;
8779 image_view_create_info.subresourceRange.baseMipLevel = 0;
8780 image_view_create_info.subresourceRange.levelCount = 1;
8781 // Cause an error by setting an invalid image aspect
8782 image_view_create_info.subresourceRange.aspectMask =
8783 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008784
8785 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008786 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8787 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008788
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008789 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008790}
8791
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008792TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008793 VkResult err;
8794 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008795
Karl Schultz6addd812016-02-02 17:17:23 -07008796 m_errorMonitor->SetDesiredFailureMsg(
8797 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008798 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008799
Mike Stroyana3082432015-09-25 13:39:21 -06008800 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008801
8802 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008803 VkImage srcImage;
8804 VkImage dstImage;
8805 VkDeviceMemory srcMem;
8806 VkDeviceMemory destMem;
8807 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008808
8809 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008810 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8811 image_create_info.pNext = NULL;
8812 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8813 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8814 image_create_info.extent.width = 32;
8815 image_create_info.extent.height = 32;
8816 image_create_info.extent.depth = 1;
8817 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008818 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07008819 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8820 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8821 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8822 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008823
Karl Schultz6addd812016-02-02 17:17:23 -07008824 err =
8825 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008826 ASSERT_VK_SUCCESS(err);
8827
Karl Schultz6addd812016-02-02 17:17:23 -07008828 err =
8829 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008830 ASSERT_VK_SUCCESS(err);
8831
8832 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008833 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008834 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8835 memAlloc.pNext = NULL;
8836 memAlloc.allocationSize = 0;
8837 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008838
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008839 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008840 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008841 pass =
8842 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008843 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008844 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008845 ASSERT_VK_SUCCESS(err);
8846
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008847 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008848 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008849 pass =
8850 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008851 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008852 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008853 ASSERT_VK_SUCCESS(err);
8854
8855 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8856 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008857 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008858 ASSERT_VK_SUCCESS(err);
8859
8860 BeginCommandBuffer();
8861 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008862 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008863 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008864 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008865 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06008866 copyRegion.srcOffset.x = 0;
8867 copyRegion.srcOffset.y = 0;
8868 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008869 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008870 copyRegion.dstSubresource.mipLevel = 0;
8871 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008872 // Introduce failure by forcing the dst layerCount to differ from src
8873 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008874 copyRegion.dstOffset.x = 0;
8875 copyRegion.dstOffset.y = 0;
8876 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008877 copyRegion.extent.width = 1;
8878 copyRegion.extent.height = 1;
8879 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008880 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8881 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008882 EndCommandBuffer();
8883
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008884 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008885
Chia-I Wuf7458c52015-10-26 21:10:41 +08008886 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008887 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008888 vkFreeMemory(m_device->device(), srcMem, NULL);
8889 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008890}
8891
Tony Barbourd6673642016-05-05 14:46:39 -06008892TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
8893
8894 TEST_DESCRIPTION("Creating images with unsuported formats ");
8895
8896 ASSERT_NO_FATAL_FAILURE(InitState());
8897 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8898 VkImageObj image(m_device);
8899 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
8900 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
8901 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
8902 VK_IMAGE_TILING_OPTIMAL, 0);
8903 ASSERT_TRUE(image.initialized());
8904
8905 VkFormat unsupported = VK_FORMAT_UNDEFINED;
8906 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
8907 VkFormat format = static_cast<VkFormat>(f);
8908 VkFormatProperties fProps = m_device->format_properties(format);
8909 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
8910 fProps.optimalTilingFeatures == 0) {
8911 unsupported = format;
8912 break;
8913 }
8914 }
8915 if (unsupported != VK_FORMAT_UNDEFINED) {
8916 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8917 "vkCreateImage parameter, "
8918 "VkFormat pCreateInfo->format, "
8919 "contains unsupported format");
8920 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
8921 VkImageCreateInfo image_create_info;
8922 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8923 image_create_info.pNext = NULL;
8924 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8925 image_create_info.format = unsupported;
8926 image_create_info.extent.width = 32;
8927 image_create_info.extent.height = 32;
8928 image_create_info.extent.depth = 1;
8929 image_create_info.mipLevels = 1;
8930 image_create_info.arrayLayers = 1;
8931 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8932 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8933 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8934 image_create_info.flags = 0;
8935
8936 VkImage localImage;
8937 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
8938 m_errorMonitor->VerifyFound();
8939
8940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8941 "vkCreateRenderPass parameter, "
8942 "VkFormat in "
8943 "pCreateInfo->pAttachments");
8944 // Create renderpass with unsupported format - Expect FORMAT_UNSUPPORTED
8945 VkAttachmentDescription att;
8946 att.format = unsupported;
8947 att.samples = VK_SAMPLE_COUNT_1_BIT;
8948 att.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
8949 att.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
8950 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
8951 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
8952 att.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8953 att.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8954
8955 VkRenderPassCreateInfo rp_info = {};
8956 VkRenderPass rp;
8957 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8958 rp_info.attachmentCount = 1;
8959 rp_info.pAttachments = &att;
8960 rp_info.subpassCount = 0;
8961 rp_info.pSubpasses = NULL;
8962 vkCreateRenderPass(m_device->handle(), &rp_info, NULL, &rp);
8963 m_errorMonitor->VerifyFound();
8964 }
8965}
8966
8967TEST_F(VkLayerTest, ImageLayerViewTests) {
8968 VkResult ret;
8969 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
8970
8971 ASSERT_NO_FATAL_FAILURE(InitState());
8972
8973 VkImageObj image(m_device);
8974 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
8975 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
8976 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
8977 VK_IMAGE_TILING_OPTIMAL, 0);
8978 ASSERT_TRUE(image.initialized());
8979
8980 VkImageView imgView;
8981 VkImageViewCreateInfo imgViewInfo = {};
8982 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8983 imgViewInfo.image = image.handle();
8984 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
8985 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
8986 imgViewInfo.subresourceRange.layerCount = 1;
8987 imgViewInfo.subresourceRange.baseMipLevel = 0;
8988 imgViewInfo.subresourceRange.levelCount = 1;
8989 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8990
8991 m_errorMonitor->SetDesiredFailureMsg(
8992 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8993 "vkCreateImageView called with baseMipLevel");
8994 // View can't have baseMipLevel >= image's mipLevels - Expect
8995 // VIEW_CREATE_ERROR
8996 imgViewInfo.subresourceRange.baseMipLevel = 1;
8997 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
8998 m_errorMonitor->VerifyFound();
8999 imgViewInfo.subresourceRange.baseMipLevel = 0;
9000
9001 m_errorMonitor->SetDesiredFailureMsg(
9002 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9003 "vkCreateImageView called with baseArrayLayer");
9004 // View can't have baseArrayLayer >= image's arraySize - Expect
9005 // VIEW_CREATE_ERROR
9006 imgViewInfo.subresourceRange.baseArrayLayer = 1;
9007 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9008 m_errorMonitor->VerifyFound();
9009 imgViewInfo.subresourceRange.baseArrayLayer = 0;
9010
9011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9012 "vkCreateImageView called with 0 in "
9013 "pCreateInfo->subresourceRange."
9014 "levelCount");
9015 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
9016 imgViewInfo.subresourceRange.levelCount = 0;
9017 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9018 m_errorMonitor->VerifyFound();
9019 imgViewInfo.subresourceRange.levelCount = 1;
9020
9021 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9022 "vkCreateImageView called with 0 in "
9023 "pCreateInfo->subresourceRange."
9024 "layerCount");
9025 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
9026 imgViewInfo.subresourceRange.layerCount = 0;
9027 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9028 m_errorMonitor->VerifyFound();
9029 imgViewInfo.subresourceRange.layerCount = 1;
9030
9031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9032 "but both must be color formats");
9033 // Can't use depth format for view into color image - Expect INVALID_FORMAT
9034 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
9035 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9036 m_errorMonitor->VerifyFound();
9037 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9038
9039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9040 "Formats MUST be IDENTICAL unless "
9041 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
9042 "was set on image creation.");
9043 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
9044 // VIEW_CREATE_ERROR
9045 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
9046 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9047 m_errorMonitor->VerifyFound();
9048 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9049
9050 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9051 "can support ImageViews with "
9052 "differing formats but they must be "
9053 "in the same compatibility class.");
9054 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
9055 // VIEW_CREATE_ERROR
9056 VkImageCreateInfo mutImgInfo = image.create_info();
9057 VkImage mutImage;
9058 mutImgInfo.format = VK_FORMAT_R8_UINT;
9059 assert(
9060 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
9061 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
9062 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
9063 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9064 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
9065 ASSERT_VK_SUCCESS(ret);
9066 imgViewInfo.image = mutImage;
9067 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9068 m_errorMonitor->VerifyFound();
9069 imgViewInfo.image = image.handle();
9070 vkDestroyImage(m_device->handle(), mutImage, NULL);
9071}
9072
9073TEST_F(VkLayerTest, MiscImageLayerTests) {
9074
9075 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
9076
9077 ASSERT_NO_FATAL_FAILURE(InitState());
9078
9079 VkImageObj image(m_device);
9080 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9081 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
9082 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
9083 VK_IMAGE_TILING_OPTIMAL, 0);
9084 ASSERT_TRUE(image.initialized());
9085
9086 m_errorMonitor->SetDesiredFailureMsg(
9087 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9088 "number of layers in image subresource is zero");
9089 vk_testing::Buffer buffer;
9090 VkMemoryPropertyFlags reqs = 0;
9091 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
9092 VkBufferImageCopy region = {};
9093 region.bufferRowLength = 128;
9094 region.bufferImageHeight = 128;
9095 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9096 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
9097 region.imageSubresource.layerCount = 0;
9098 region.imageExtent.height = 4;
9099 region.imageExtent.width = 4;
9100 region.imageExtent.depth = 1;
9101 m_commandBuffer->BeginCommandBuffer();
9102 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
9103 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
9104 1, &region);
9105 m_errorMonitor->VerifyFound();
9106 region.imageSubresource.layerCount = 1;
9107
9108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9109 "aspectMasks for each region must "
9110 "specify only COLOR or DEPTH or "
9111 "STENCIL");
9112 // Expect MISMATCHED_IMAGE_ASPECT
9113 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
9114 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
9115 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
9116 1, &region);
9117 m_errorMonitor->VerifyFound();
9118 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9119
9120 m_errorMonitor->SetDesiredFailureMsg(
9121 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9122 "If the format of srcImage is a depth, stencil, depth stencil or "
9123 "integer-based format then filter must be VK_FILTER_NEAREST");
9124 // Expect INVALID_FILTER
9125 VkImageObj intImage1(m_device);
9126 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
9127 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
9128 0);
9129 VkImageObj intImage2(m_device);
9130 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
9131 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
9132 0);
9133 VkImageBlit blitRegion = {};
9134 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9135 blitRegion.srcSubresource.baseArrayLayer = 0;
9136 blitRegion.srcSubresource.layerCount = 1;
9137 blitRegion.srcSubresource.mipLevel = 0;
9138 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9139 blitRegion.dstSubresource.baseArrayLayer = 0;
9140 blitRegion.dstSubresource.layerCount = 1;
9141 blitRegion.dstSubresource.mipLevel = 0;
9142
9143 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
9144 intImage1.layout(), intImage2.handle(), intImage2.layout(),
9145 16, &blitRegion, VK_FILTER_LINEAR);
9146 m_errorMonitor->VerifyFound();
9147
9148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9149 "called with 0 in ppMemoryBarriers");
9150 VkImageMemoryBarrier img_barrier;
9151 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9152 img_barrier.pNext = NULL;
9153 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9154 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9155 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9156 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9157 img_barrier.image = image.handle();
9158 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9159 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9160 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9161 img_barrier.subresourceRange.baseArrayLayer = 0;
9162 img_barrier.subresourceRange.baseMipLevel = 0;
9163 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
9164 img_barrier.subresourceRange.layerCount = 0;
9165 img_barrier.subresourceRange.levelCount = 1;
9166 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9167 VK_PIPELINE_STAGE_HOST_BIT,
9168 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9169 nullptr, 1, &img_barrier);
9170 m_errorMonitor->VerifyFound();
9171 img_barrier.subresourceRange.layerCount = 1;
9172}
9173
9174TEST_F(VkLayerTest, ImageFormatLimits) {
9175
9176 TEST_DESCRIPTION("Exceed the limits of image format ");
9177
9178 m_errorMonitor->SetDesiredFailureMsg(
9179 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9180 "CreateImage extents exceed allowable limits for format");
9181 VkImageCreateInfo image_create_info = {};
9182 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9183 image_create_info.pNext = NULL;
9184 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9185 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9186 image_create_info.extent.width = 32;
9187 image_create_info.extent.height = 32;
9188 image_create_info.extent.depth = 1;
9189 image_create_info.mipLevels = 1;
9190 image_create_info.arrayLayers = 1;
9191 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9192 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9193 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9194 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9195 image_create_info.flags = 0;
9196
9197 VkImage nullImg;
9198 VkImageFormatProperties imgFmtProps;
9199 vkGetPhysicalDeviceImageFormatProperties(
9200 gpu(), image_create_info.format, image_create_info.imageType,
9201 image_create_info.tiling, image_create_info.usage,
9202 image_create_info.flags, &imgFmtProps);
9203 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
9204 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9205 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9206 m_errorMonitor->VerifyFound();
9207 image_create_info.extent.depth = 1;
9208
9209 m_errorMonitor->SetDesiredFailureMsg(
9210 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9211 "exceeds allowable maximum supported by format of");
9212 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
9213 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9214 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9215 m_errorMonitor->VerifyFound();
9216 image_create_info.mipLevels = 1;
9217
9218 m_errorMonitor->SetDesiredFailureMsg(
9219 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9220 "exceeds allowable maximum supported by format of");
9221 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
9222 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9223 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9224 m_errorMonitor->VerifyFound();
9225 image_create_info.arrayLayers = 1;
9226
9227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9228 "is not supported by format");
9229 int samples = imgFmtProps.sampleCounts >> 1;
9230 image_create_info.samples = (VkSampleCountFlagBits)samples;
9231 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9232 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9233 m_errorMonitor->VerifyFound();
9234 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9235
9236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9237 "pCreateInfo->initialLayout, must be "
9238 "VK_IMAGE_LAYOUT_UNDEFINED or "
9239 "VK_IMAGE_LAYOUT_PREINITIALIZED");
9240 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9241 // Expect INVALID_LAYOUT
9242 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9243 m_errorMonitor->VerifyFound();
9244 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9245}
9246
Karl Schultz6addd812016-02-02 17:17:23 -07009247TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06009248 VkResult err;
9249 bool pass;
9250
9251 // Create color images with different format sizes and try to copy between them
9252 m_errorMonitor->SetDesiredFailureMsg(
9253 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9254 "vkCmdCopyImage called with unmatched source and dest image format sizes");
9255
9256 ASSERT_NO_FATAL_FAILURE(InitState());
9257
9258 // Create two images of different types and try to copy between them
9259 VkImage srcImage;
9260 VkImage dstImage;
9261 VkDeviceMemory srcMem;
9262 VkDeviceMemory destMem;
9263 VkMemoryRequirements memReqs;
9264
9265 VkImageCreateInfo image_create_info = {};
9266 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9267 image_create_info.pNext = NULL;
9268 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9269 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9270 image_create_info.extent.width = 32;
9271 image_create_info.extent.height = 32;
9272 image_create_info.extent.depth = 1;
9273 image_create_info.mipLevels = 1;
9274 image_create_info.arrayLayers = 1;
9275 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9276 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9277 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9278 image_create_info.flags = 0;
9279
9280 err =
9281 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
9282 ASSERT_VK_SUCCESS(err);
9283
9284 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
9285 // Introduce failure by creating second image with a different-sized format.
9286 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
9287
9288 err =
9289 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
9290 ASSERT_VK_SUCCESS(err);
9291
9292 // Allocate memory
9293 VkMemoryAllocateInfo memAlloc = {};
9294 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9295 memAlloc.pNext = NULL;
9296 memAlloc.allocationSize = 0;
9297 memAlloc.memoryTypeIndex = 0;
9298
9299 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
9300 memAlloc.allocationSize = memReqs.size;
9301 pass =
9302 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
9303 ASSERT_TRUE(pass);
9304 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
9305 ASSERT_VK_SUCCESS(err);
9306
9307 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
9308 memAlloc.allocationSize = memReqs.size;
9309 pass =
9310 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
9311 ASSERT_TRUE(pass);
9312 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
9313 ASSERT_VK_SUCCESS(err);
9314
9315 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9316 ASSERT_VK_SUCCESS(err);
9317 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
9318 ASSERT_VK_SUCCESS(err);
9319
9320 BeginCommandBuffer();
9321 VkImageCopy copyRegion;
9322 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9323 copyRegion.srcSubresource.mipLevel = 0;
9324 copyRegion.srcSubresource.baseArrayLayer = 0;
9325 copyRegion.srcSubresource.layerCount = 0;
9326 copyRegion.srcOffset.x = 0;
9327 copyRegion.srcOffset.y = 0;
9328 copyRegion.srcOffset.z = 0;
9329 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9330 copyRegion.dstSubresource.mipLevel = 0;
9331 copyRegion.dstSubresource.baseArrayLayer = 0;
9332 copyRegion.dstSubresource.layerCount = 0;
9333 copyRegion.dstOffset.x = 0;
9334 copyRegion.dstOffset.y = 0;
9335 copyRegion.dstOffset.z = 0;
9336 copyRegion.extent.width = 1;
9337 copyRegion.extent.height = 1;
9338 copyRegion.extent.depth = 1;
9339 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9340 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
9341 EndCommandBuffer();
9342
9343 m_errorMonitor->VerifyFound();
9344
9345 vkDestroyImage(m_device->device(), srcImage, NULL);
9346 vkDestroyImage(m_device->device(), dstImage, NULL);
9347 vkFreeMemory(m_device->device(), srcMem, NULL);
9348 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009349}
9350
Karl Schultz6addd812016-02-02 17:17:23 -07009351TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
9352 VkResult err;
9353 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009354
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009355 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009356 m_errorMonitor->SetDesiredFailureMsg(
9357 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009358 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009359
Mike Stroyana3082432015-09-25 13:39:21 -06009360 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009361
9362 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009363 VkImage srcImage;
9364 VkImage dstImage;
9365 VkDeviceMemory srcMem;
9366 VkDeviceMemory destMem;
9367 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009368
9369 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009370 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9371 image_create_info.pNext = NULL;
9372 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9373 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9374 image_create_info.extent.width = 32;
9375 image_create_info.extent.height = 32;
9376 image_create_info.extent.depth = 1;
9377 image_create_info.mipLevels = 1;
9378 image_create_info.arrayLayers = 1;
9379 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9380 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9381 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9382 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009383
Karl Schultz6addd812016-02-02 17:17:23 -07009384 err =
9385 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009386 ASSERT_VK_SUCCESS(err);
9387
Karl Schultzbdb75952016-04-19 11:36:49 -06009388 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
9389
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009390 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07009391 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009392 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
9393 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009394
Karl Schultz6addd812016-02-02 17:17:23 -07009395 err =
9396 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009397 ASSERT_VK_SUCCESS(err);
9398
9399 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009400 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009401 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9402 memAlloc.pNext = NULL;
9403 memAlloc.allocationSize = 0;
9404 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009405
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009406 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009407 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009408 pass =
9409 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009410 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009411 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009412 ASSERT_VK_SUCCESS(err);
9413
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009414 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009415 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009416 pass =
9417 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009418 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009419 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009420 ASSERT_VK_SUCCESS(err);
9421
9422 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9423 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009424 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009425 ASSERT_VK_SUCCESS(err);
9426
9427 BeginCommandBuffer();
9428 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009429 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009430 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009431 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009432 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009433 copyRegion.srcOffset.x = 0;
9434 copyRegion.srcOffset.y = 0;
9435 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009436 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009437 copyRegion.dstSubresource.mipLevel = 0;
9438 copyRegion.dstSubresource.baseArrayLayer = 0;
9439 copyRegion.dstSubresource.layerCount = 0;
9440 copyRegion.dstOffset.x = 0;
9441 copyRegion.dstOffset.y = 0;
9442 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009443 copyRegion.extent.width = 1;
9444 copyRegion.extent.height = 1;
9445 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009446 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9447 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009448 EndCommandBuffer();
9449
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009450 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009451
Chia-I Wuf7458c52015-10-26 21:10:41 +08009452 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009453 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009454 vkFreeMemory(m_device->device(), srcMem, NULL);
9455 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009456}
9457
Karl Schultz6addd812016-02-02 17:17:23 -07009458TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
9459 VkResult err;
9460 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009461
Karl Schultz6addd812016-02-02 17:17:23 -07009462 m_errorMonitor->SetDesiredFailureMsg(
9463 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009464 "vkCmdResolveImage called with source sample count less than 2.");
9465
Mike Stroyana3082432015-09-25 13:39:21 -06009466 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009467
9468 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07009469 VkImage srcImage;
9470 VkImage dstImage;
9471 VkDeviceMemory srcMem;
9472 VkDeviceMemory destMem;
9473 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009474
9475 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009476 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9477 image_create_info.pNext = NULL;
9478 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9479 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9480 image_create_info.extent.width = 32;
9481 image_create_info.extent.height = 1;
9482 image_create_info.extent.depth = 1;
9483 image_create_info.mipLevels = 1;
9484 image_create_info.arrayLayers = 1;
9485 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9486 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9487 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9488 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009489
Karl Schultz6addd812016-02-02 17:17:23 -07009490 err =
9491 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009492 ASSERT_VK_SUCCESS(err);
9493
Karl Schultz6addd812016-02-02 17:17:23 -07009494 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009495
Karl Schultz6addd812016-02-02 17:17:23 -07009496 err =
9497 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009498 ASSERT_VK_SUCCESS(err);
9499
9500 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009501 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009502 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9503 memAlloc.pNext = NULL;
9504 memAlloc.allocationSize = 0;
9505 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009506
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009507 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009508 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009509 pass =
9510 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009511 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009512 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009513 ASSERT_VK_SUCCESS(err);
9514
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009515 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009516 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009517 pass =
9518 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009519 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009520 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009521 ASSERT_VK_SUCCESS(err);
9522
9523 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9524 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009525 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009526 ASSERT_VK_SUCCESS(err);
9527
9528 BeginCommandBuffer();
9529 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009530 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9531 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009532 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009533 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009534 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009535 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009536 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009537 resolveRegion.srcOffset.x = 0;
9538 resolveRegion.srcOffset.y = 0;
9539 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009540 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009541 resolveRegion.dstSubresource.mipLevel = 0;
9542 resolveRegion.dstSubresource.baseArrayLayer = 0;
9543 resolveRegion.dstSubresource.layerCount = 0;
9544 resolveRegion.dstOffset.x = 0;
9545 resolveRegion.dstOffset.y = 0;
9546 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009547 resolveRegion.extent.width = 1;
9548 resolveRegion.extent.height = 1;
9549 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009550 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9551 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009552 EndCommandBuffer();
9553
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009554 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009555
Chia-I Wuf7458c52015-10-26 21:10:41 +08009556 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009557 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009558 vkFreeMemory(m_device->device(), srcMem, NULL);
9559 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009560}
9561
Karl Schultz6addd812016-02-02 17:17:23 -07009562TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
9563 VkResult err;
9564 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009565
Karl Schultz6addd812016-02-02 17:17:23 -07009566 m_errorMonitor->SetDesiredFailureMsg(
9567 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009568 "vkCmdResolveImage called with dest sample count greater than 1.");
9569
Mike Stroyana3082432015-09-25 13:39:21 -06009570 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009571
Chris Forbesa7530692016-05-08 12:35:39 +12009572 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07009573 VkImage srcImage;
9574 VkImage dstImage;
9575 VkDeviceMemory srcMem;
9576 VkDeviceMemory destMem;
9577 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009578
9579 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009580 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9581 image_create_info.pNext = NULL;
9582 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9583 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9584 image_create_info.extent.width = 32;
9585 image_create_info.extent.height = 1;
9586 image_create_info.extent.depth = 1;
9587 image_create_info.mipLevels = 1;
9588 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +12009589 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07009590 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9591 // Note: Some implementations expect color attachment usage for any
9592 // multisample surface
9593 image_create_info.usage =
9594 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9595 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009596
Karl Schultz6addd812016-02-02 17:17:23 -07009597 err =
9598 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009599 ASSERT_VK_SUCCESS(err);
9600
Karl Schultz6addd812016-02-02 17:17:23 -07009601 // Note: Some implementations expect color attachment usage for any
9602 // multisample surface
9603 image_create_info.usage =
9604 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009605
Karl Schultz6addd812016-02-02 17:17:23 -07009606 err =
9607 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009608 ASSERT_VK_SUCCESS(err);
9609
9610 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009611 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009612 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9613 memAlloc.pNext = NULL;
9614 memAlloc.allocationSize = 0;
9615 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009616
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009617 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009618 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009619 pass =
9620 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009621 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009622 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009623 ASSERT_VK_SUCCESS(err);
9624
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009625 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009626 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009627 pass =
9628 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009629 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009630 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009631 ASSERT_VK_SUCCESS(err);
9632
9633 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9634 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009635 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009636 ASSERT_VK_SUCCESS(err);
9637
9638 BeginCommandBuffer();
9639 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009640 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9641 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009642 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009643 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009644 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009645 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009646 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009647 resolveRegion.srcOffset.x = 0;
9648 resolveRegion.srcOffset.y = 0;
9649 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009650 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009651 resolveRegion.dstSubresource.mipLevel = 0;
9652 resolveRegion.dstSubresource.baseArrayLayer = 0;
9653 resolveRegion.dstSubresource.layerCount = 0;
9654 resolveRegion.dstOffset.x = 0;
9655 resolveRegion.dstOffset.y = 0;
9656 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009657 resolveRegion.extent.width = 1;
9658 resolveRegion.extent.height = 1;
9659 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009660 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9661 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009662 EndCommandBuffer();
9663
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009664 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009665
Chia-I Wuf7458c52015-10-26 21:10:41 +08009666 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009667 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009668 vkFreeMemory(m_device->device(), srcMem, NULL);
9669 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009670}
9671
Karl Schultz6addd812016-02-02 17:17:23 -07009672TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
9673 VkResult err;
9674 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009675
Karl Schultz6addd812016-02-02 17:17:23 -07009676 m_errorMonitor->SetDesiredFailureMsg(
9677 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009678 "vkCmdResolveImage called with unmatched source and dest formats.");
9679
Mike Stroyana3082432015-09-25 13:39:21 -06009680 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009681
9682 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009683 VkImage srcImage;
9684 VkImage dstImage;
9685 VkDeviceMemory srcMem;
9686 VkDeviceMemory destMem;
9687 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009688
9689 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009690 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9691 image_create_info.pNext = NULL;
9692 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9693 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9694 image_create_info.extent.width = 32;
9695 image_create_info.extent.height = 1;
9696 image_create_info.extent.depth = 1;
9697 image_create_info.mipLevels = 1;
9698 image_create_info.arrayLayers = 1;
9699 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
9700 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9701 // Note: Some implementations expect color attachment usage for any
9702 // multisample surface
9703 image_create_info.usage =
9704 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9705 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009706
Karl Schultz6addd812016-02-02 17:17:23 -07009707 err =
9708 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009709 ASSERT_VK_SUCCESS(err);
9710
Karl Schultz6addd812016-02-02 17:17:23 -07009711 // Set format to something other than source image
9712 image_create_info.format = VK_FORMAT_R32_SFLOAT;
9713 // Note: Some implementations expect color attachment usage for any
9714 // multisample surface
9715 image_create_info.usage =
9716 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9717 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009718
Karl Schultz6addd812016-02-02 17:17:23 -07009719 err =
9720 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009721 ASSERT_VK_SUCCESS(err);
9722
9723 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009724 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009725 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9726 memAlloc.pNext = NULL;
9727 memAlloc.allocationSize = 0;
9728 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009729
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009730 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009731 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009732 pass =
9733 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009734 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009735 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009736 ASSERT_VK_SUCCESS(err);
9737
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009738 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009739 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009740 pass =
9741 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009742 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009743 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009744 ASSERT_VK_SUCCESS(err);
9745
9746 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9747 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009748 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009749 ASSERT_VK_SUCCESS(err);
9750
9751 BeginCommandBuffer();
9752 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009753 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9754 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009755 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009756 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009757 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009758 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009759 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009760 resolveRegion.srcOffset.x = 0;
9761 resolveRegion.srcOffset.y = 0;
9762 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009763 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009764 resolveRegion.dstSubresource.mipLevel = 0;
9765 resolveRegion.dstSubresource.baseArrayLayer = 0;
9766 resolveRegion.dstSubresource.layerCount = 0;
9767 resolveRegion.dstOffset.x = 0;
9768 resolveRegion.dstOffset.y = 0;
9769 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009770 resolveRegion.extent.width = 1;
9771 resolveRegion.extent.height = 1;
9772 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009773 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9774 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009775 EndCommandBuffer();
9776
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009777 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009778
Chia-I Wuf7458c52015-10-26 21:10:41 +08009779 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009780 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009781 vkFreeMemory(m_device->device(), srcMem, NULL);
9782 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009783}
9784
Karl Schultz6addd812016-02-02 17:17:23 -07009785TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
9786 VkResult err;
9787 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009788
Karl Schultz6addd812016-02-02 17:17:23 -07009789 m_errorMonitor->SetDesiredFailureMsg(
9790 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009791 "vkCmdResolveImage called with unmatched source and dest image types.");
9792
Mike Stroyana3082432015-09-25 13:39:21 -06009793 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009794
9795 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009796 VkImage srcImage;
9797 VkImage dstImage;
9798 VkDeviceMemory srcMem;
9799 VkDeviceMemory destMem;
9800 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009801
9802 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009803 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9804 image_create_info.pNext = NULL;
9805 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9806 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9807 image_create_info.extent.width = 32;
9808 image_create_info.extent.height = 1;
9809 image_create_info.extent.depth = 1;
9810 image_create_info.mipLevels = 1;
9811 image_create_info.arrayLayers = 1;
9812 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
9813 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9814 // Note: Some implementations expect color attachment usage for any
9815 // multisample surface
9816 image_create_info.usage =
9817 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9818 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009819
Karl Schultz6addd812016-02-02 17:17:23 -07009820 err =
9821 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009822 ASSERT_VK_SUCCESS(err);
9823
Karl Schultz6addd812016-02-02 17:17:23 -07009824 image_create_info.imageType = VK_IMAGE_TYPE_1D;
9825 // Note: Some implementations expect color attachment usage for any
9826 // multisample surface
9827 image_create_info.usage =
9828 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9829 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009830
Karl Schultz6addd812016-02-02 17:17:23 -07009831 err =
9832 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009833 ASSERT_VK_SUCCESS(err);
9834
9835 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009836 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009837 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9838 memAlloc.pNext = NULL;
9839 memAlloc.allocationSize = 0;
9840 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009841
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009842 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009843 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009844 pass =
9845 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009846 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009847 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009848 ASSERT_VK_SUCCESS(err);
9849
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009850 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009851 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009852 pass =
9853 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009854 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009855 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009856 ASSERT_VK_SUCCESS(err);
9857
9858 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9859 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009860 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009861 ASSERT_VK_SUCCESS(err);
9862
9863 BeginCommandBuffer();
9864 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009865 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9866 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009867 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009868 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009869 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009870 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009871 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009872 resolveRegion.srcOffset.x = 0;
9873 resolveRegion.srcOffset.y = 0;
9874 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009875 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009876 resolveRegion.dstSubresource.mipLevel = 0;
9877 resolveRegion.dstSubresource.baseArrayLayer = 0;
9878 resolveRegion.dstSubresource.layerCount = 0;
9879 resolveRegion.dstOffset.x = 0;
9880 resolveRegion.dstOffset.y = 0;
9881 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009882 resolveRegion.extent.width = 1;
9883 resolveRegion.extent.height = 1;
9884 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009885 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9886 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009887 EndCommandBuffer();
9888
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009889 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009890
Chia-I Wuf7458c52015-10-26 21:10:41 +08009891 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009892 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009893 vkFreeMemory(m_device->device(), srcMem, NULL);
9894 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009895}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009896
Karl Schultz6addd812016-02-02 17:17:23 -07009897TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009898 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07009899 // to using a DS format, then cause it to hit error due to COLOR_BIT not
9900 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009901 // The image format check comes 2nd in validation so we trigger it first,
9902 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07009903 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009904
Karl Schultz6addd812016-02-02 17:17:23 -07009905 m_errorMonitor->SetDesiredFailureMsg(
9906 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009907 "Combination depth/stencil image formats can have only the ");
9908
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009909 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009910
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009911 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009912 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
9913 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009914
9915 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009916 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9917 ds_pool_ci.pNext = NULL;
9918 ds_pool_ci.maxSets = 1;
9919 ds_pool_ci.poolSizeCount = 1;
9920 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009921
9922 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009923 err =
9924 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009925 ASSERT_VK_SUCCESS(err);
9926
9927 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009928 dsl_binding.binding = 0;
9929 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
9930 dsl_binding.descriptorCount = 1;
9931 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9932 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009933
9934 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009935 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9936 ds_layout_ci.pNext = NULL;
9937 ds_layout_ci.bindingCount = 1;
9938 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009939 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009940 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9941 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009942 ASSERT_VK_SUCCESS(err);
9943
9944 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009945 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009946 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009947 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009948 alloc_info.descriptorPool = ds_pool;
9949 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009950 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9951 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009952 ASSERT_VK_SUCCESS(err);
9953
Karl Schultz6addd812016-02-02 17:17:23 -07009954 VkImage image_bad;
9955 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009956 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07009957 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009958 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07009959 const int32_t tex_width = 32;
9960 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009961
9962 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009963 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9964 image_create_info.pNext = NULL;
9965 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9966 image_create_info.format = tex_format_bad;
9967 image_create_info.extent.width = tex_width;
9968 image_create_info.extent.height = tex_height;
9969 image_create_info.extent.depth = 1;
9970 image_create_info.mipLevels = 1;
9971 image_create_info.arrayLayers = 1;
9972 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9973 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9974 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
9975 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
9976 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009977
Karl Schultz6addd812016-02-02 17:17:23 -07009978 err =
9979 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009980 ASSERT_VK_SUCCESS(err);
9981 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07009982 image_create_info.usage =
9983 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9984 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
9985 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009986 ASSERT_VK_SUCCESS(err);
9987
9988 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009989 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9990 image_view_create_info.image = image_bad;
9991 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
9992 image_view_create_info.format = tex_format_bad;
9993 image_view_create_info.subresourceRange.baseArrayLayer = 0;
9994 image_view_create_info.subresourceRange.baseMipLevel = 0;
9995 image_view_create_info.subresourceRange.layerCount = 1;
9996 image_view_create_info.subresourceRange.levelCount = 1;
9997 image_view_create_info.subresourceRange.aspectMask =
9998 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009999
10000 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070010001 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
10002 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010003
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010004 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010005
Chia-I Wuf7458c52015-10-26 21:10:41 +080010006 vkDestroyImage(m_device->device(), image_bad, NULL);
10007 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010008 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10009 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010010}
Tobin Ehliscde08892015-09-22 10:11:37 -060010011#endif // IMAGE_TESTS
10012
Tony Barbour300a6082015-04-07 13:44:53 -060010013int main(int argc, char **argv) {
10014 int result;
10015
Cody Northrop8e54a402016-03-08 22:25:52 -070010016#ifdef ANDROID
10017 int vulkanSupport = InitVulkan();
10018 if (vulkanSupport == 0)
10019 return 1;
10020#endif
10021
Tony Barbour300a6082015-04-07 13:44:53 -060010022 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060010023 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060010024
10025 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
10026
10027 result = RUN_ALL_TESTS();
10028
Tony Barbour6918cd52015-04-09 12:58:51 -060010029 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060010030 return result;
10031}