blob: 9c5b1495590d0f33cf8c85d3c03e6132768ee66e [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
20 */
Tony Barbour65c48b32015-11-17 10:02:56 -070021
Cody Northrop8e54a402016-03-08 22:25:52 -070022#ifdef ANDROID
23#include "vulkan_wrapper.h"
24#else
David Pinedo9316d3b2015-11-06 12:54:48 -070025#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070026#endif
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060027#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060028#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060029#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070030#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060031
Mark Lobodzinski3780e142015-05-14 15:08:13 -050032#define GLM_FORCE_RADIANS
33#include "glm/glm.hpp"
34#include <glm/gtc/matrix_transform.hpp>
35
Dustin Gravesffa90fa2016-05-06 11:20:38 -060036#define PARAMETER_VALIDATION_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060037#define MEM_TRACKER_TESTS 1
38#define OBJ_TRACKER_TESTS 1
39#define DRAW_STATE_TESTS 1
40#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120041#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060042#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060043#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060044
Mark Lobodzinski3780e142015-05-14 15:08:13 -050045//--------------------------------------------------------------------------------------
46// Mesh and VertexFormat Data
47//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070048struct Vertex {
49 float posX, posY, posZ, posW; // Position data
50 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050051};
52
Karl Schultz6addd812016-02-02 17:17:23 -070053#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050054
55typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070056 BsoFailNone = 0x00000000,
57 BsoFailLineWidth = 0x00000001,
58 BsoFailDepthBias = 0x00000002,
59 BsoFailViewport = 0x00000004,
60 BsoFailScissor = 0x00000008,
61 BsoFailBlend = 0x00000010,
62 BsoFailDepthBounds = 0x00000020,
63 BsoFailStencilReadMask = 0x00000040,
64 BsoFailStencilWriteMask = 0x00000080,
65 BsoFailStencilReference = 0x00000100,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050066} BsoFailSelect;
67
68struct vktriangle_vs_uniform {
69 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070070 float mvp[4][4];
71 float position[3][4];
72 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050073};
74
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050075static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120076 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070077 "vec2 vertices[3];\n"
78 "out gl_PerVertex {\n"
79 " vec4 gl_Position;\n"
80 "};\n"
81 "void main() {\n"
82 " vertices[0] = vec2(-1.0, -1.0);\n"
83 " vertices[1] = vec2( 1.0, -1.0);\n"
84 " vertices[2] = vec2( 0.0, 1.0);\n"
85 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
86 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050087
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050088static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120089 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070090 "\n"
91 "layout(location = 0) out vec4 uFragColor;\n"
92 "void main(){\n"
93 " uFragColor = vec4(0,1,0,1);\n"
94 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050095
Karl Schultz6addd812016-02-02 17:17:23 -070096static VKAPI_ATTR VkBool32 VKAPI_CALL
97myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
98 uint64_t srcObject, size_t location, int32_t msgCode,
99 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -0600100
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600101// ********************************************************
102// ErrorMonitor Usage:
103//
104// Call SetDesiredFailureMsg with a string to be compared against all
105// encountered log messages. Passing NULL will match all log messages.
106// logMsg will return true for skipCall only if msg is matched or NULL.
107//
108// Call DesiredMsgFound to determine if the desired failure message
109// was encountered.
110
Tony Barbour300a6082015-04-07 13:44:53 -0600111class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700112 public:
113 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600114 test_platform_thread_create_mutex(&m_mutex);
115 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700116 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700117 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600118 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600119 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600120
Dustin Graves48458142016-04-29 16:11:55 -0600121 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
122
Karl Schultz6addd812016-02-02 17:17:23 -0700123 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200124 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600125 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600126 m_failureMsg.clear();
127 m_otherMsgs.clear();
128 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700129 m_msgFound = VK_FALSE;
130 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600131 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600132 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600133
Karl Schultz6addd812016-02-02 17:17:23 -0700134 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600135 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600136 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600137 if (m_bailout != NULL) {
138 *m_bailout = true;
139 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600140 string errorString(msgString);
141 if (msgFlags & m_msgFlags) {
142 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200143 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
144 m_otherMsgs.push_back(m_failureMsg);
145 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600146 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700147 m_msgFound = VK_TRUE;
148 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600149 } else {
150 m_otherMsgs.push_back(errorString);
151 }
152 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600153 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600154 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600155 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600156
Karl Schultz6addd812016-02-02 17:17:23 -0700157 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600158
Karl Schultz6addd812016-02-02 17:17:23 -0700159 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600160
Karl Schultz6addd812016-02-02 17:17:23 -0700161 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600162
Karl Schultz6addd812016-02-02 17:17:23 -0700163 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600164
Karl Schultz6addd812016-02-02 17:17:23 -0700165 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600166 vector<string> otherMsgs = GetOtherFailureMsgs();
167 cout << "Other error messages logged for this test were:" << endl;
168 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
169 cout << " " << *iter << endl;
170 }
171 }
172
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200173 /* helpers */
174
175 void ExpectSuccess() {
176 // match anything
177 SetDesiredFailureMsg(~0u, "");
178 }
179
180 void VerifyFound() {
181 // Not seeing the desired message is a failure. /Before/ throwing, dump
182 // any other messages.
183 if (!DesiredMsgFound()) {
184 DumpFailureMsgs();
185 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
186 }
187 }
188
189 void VerifyNotFound() {
190 // ExpectSuccess() configured us to match anything. Any error is a
191 // failure.
192 if (DesiredMsgFound()) {
193 DumpFailureMsgs();
194 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
195 }
196 }
197
Karl Schultz6addd812016-02-02 17:17:23 -0700198 private:
199 VkFlags m_msgFlags;
200 string m_desiredMsg;
201 string m_failureMsg;
202 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600203 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700204 bool *m_bailout;
205 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600206};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500207
Karl Schultz6addd812016-02-02 17:17:23 -0700208static VKAPI_ATTR VkBool32 VKAPI_CALL
209myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
210 uint64_t srcObject, size_t location, int32_t msgCode,
211 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
212 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700213 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700214 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600215 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600216 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600217 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600218 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600219}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500220
Karl Schultz6addd812016-02-02 17:17:23 -0700221class VkLayerTest : public VkRenderFramework {
222 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800223 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
224 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700225 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
226 BsoFailSelect failMask);
227 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
228 VkPipelineObj &pipelineobj,
229 VkDescriptorSetObj &descriptorSet,
230 BsoFailSelect failMask);
231 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
232 VkDescriptorSetObj &descriptorSet,
233 BsoFailSelect failMask) {
234 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
235 failMask);
236 }
Tony Barbour300a6082015-04-07 13:44:53 -0600237
Tony Barbourfe3351b2015-07-28 10:17:20 -0600238 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700239 VkResult BeginCommandBuffer() {
240 return BeginCommandBuffer(*m_commandBuffer);
241 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800242 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700243 void Draw(uint32_t vertexCount, uint32_t instanceCount,
244 uint32_t firstVertex, uint32_t firstInstance) {
245 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
246 firstInstance);
247 }
248 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
249 uint32_t firstIndex, int32_t vertexOffset,
250 uint32_t firstInstance) {
251 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
252 vertexOffset, firstInstance);
253 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800254 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700255 void QueueCommandBuffer(const VkFence &fence) {
256 m_commandBuffer->QueueCommandBuffer(fence);
257 }
258 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
259 VkDeviceSize offset, uint32_t binding) {
260 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
261 }
262 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
263 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
264 }
265
266 protected:
267 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600268
269 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600270 std::vector<const char *> instance_layer_names;
271 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600272 std::vector<const char *> instance_extension_names;
273 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600274
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700275 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600276 /*
277 * Since CreateDbgMsgCallback is an instance level extension call
278 * any extension / layer that utilizes that feature also needs
279 * to be enabled at create instance time.
280 */
Karl Schultz6addd812016-02-02 17:17:23 -0700281 // Use Threading layer first to protect others from
282 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700283 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600284 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800285 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700286 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800287 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
288 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600289 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700290 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600291
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700292 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600293 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800294 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700295 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800296 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
297 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600298 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700299 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600300
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600301 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600302 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800303 this->app_info.pApplicationName = "layer_tests";
304 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600305 this->app_info.pEngineName = "unittest";
306 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600307 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600308
Tony Barbour15524c32015-04-29 17:34:29 -0600309 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600310 InitFramework(instance_layer_names, device_layer_names,
311 instance_extension_names, device_extension_names,
312 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600313 }
314
315 virtual void TearDown() {
316 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600317 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600318 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600319 }
320};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500321
Karl Schultz6addd812016-02-02 17:17:23 -0700322VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600323 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600324
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800325 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600326
327 /*
328 * For render test all drawing happens in a single render pass
329 * on a single command buffer.
330 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200331 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800332 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600333 }
334
335 return result;
336}
337
Karl Schultz6addd812016-02-02 17:17:23 -0700338VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600339 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600340
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200341 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800342 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200343 }
Tony Barbour300a6082015-04-07 13:44:53 -0600344
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800345 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600346
347 return result;
348}
349
Karl Schultz6addd812016-02-02 17:17:23 -0700350void VkLayerTest::VKTriangleTest(const char *vertShaderText,
351 const char *fragShaderText,
352 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500353 // Create identity matrix
354 int i;
355 struct vktriangle_vs_uniform data;
356
357 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700358 glm::mat4 View = glm::mat4(1.0f);
359 glm::mat4 Model = glm::mat4(1.0f);
360 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500361 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700362 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500363
364 memcpy(&data.mvp, &MVP[0][0], matrixSize);
365
Karl Schultz6addd812016-02-02 17:17:23 -0700366 static const Vertex tri_data[] = {
367 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
368 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
369 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500370 };
371
Karl Schultz6addd812016-02-02 17:17:23 -0700372 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500373 data.position[i][0] = tri_data[i].posX;
374 data.position[i][1] = tri_data[i].posY;
375 data.position[i][2] = tri_data[i].posZ;
376 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700377 data.color[i][0] = tri_data[i].r;
378 data.color[i][1] = tri_data[i].g;
379 data.color[i][2] = tri_data[i].b;
380 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500381 }
382
383 ASSERT_NO_FATAL_FAILURE(InitState());
384 ASSERT_NO_FATAL_FAILURE(InitViewport());
385
Karl Schultz6addd812016-02-02 17:17:23 -0700386 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
387 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500388
Karl Schultz6addd812016-02-02 17:17:23 -0700389 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
390 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
391 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500392
393 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800394 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500395 pipelineobj.AddShader(&vs);
396 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600397 if (failMask & BsoFailLineWidth) {
398 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600399 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
400 ia_state.sType =
401 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
402 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
403 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600404 }
405 if (failMask & BsoFailDepthBias) {
406 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600407 VkPipelineRasterizationStateCreateInfo rs_state = {};
408 rs_state.sType =
409 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
410 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600411 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600412 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600413 }
Karl Schultz6addd812016-02-02 17:17:23 -0700414 // Viewport and scissors must stay in synch or other errors will occur than
415 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600416 if (failMask & BsoFailViewport) {
417 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600418 m_viewports.clear();
419 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600420 }
421 if (failMask & BsoFailScissor) {
422 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600423 m_scissors.clear();
424 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600425 }
426 if (failMask & BsoFailBlend) {
427 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600428 VkPipelineColorBlendAttachmentState att_state = {};
429 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
430 att_state.blendEnable = VK_TRUE;
431 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600432 }
433 if (failMask & BsoFailDepthBounds) {
434 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
435 }
436 if (failMask & BsoFailStencilReadMask) {
437 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
438 }
439 if (failMask & BsoFailStencilWriteMask) {
440 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
441 }
442 if (failMask & BsoFailStencilReference) {
443 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
444 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500445
446 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700447 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
448 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500449
450 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600451 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500452
Tony Barbourfe3351b2015-07-28 10:17:20 -0600453 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500454
455 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600456 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500457
458 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600459 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500460
Tony Barbourfe3351b2015-07-28 10:17:20 -0600461 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500462}
463
Karl Schultz6addd812016-02-02 17:17:23 -0700464void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
465 VkPipelineObj &pipelineobj,
466 VkDescriptorSetObj &descriptorSet,
467 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500468 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700469 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
470 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500471 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700472 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
473 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500474 }
475
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800476 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700477 // Make sure depthWriteEnable is set so that Depth fail test will work
478 // correctly
479 // Make sure stencilTestEnable is set so that Stencil fail test will work
480 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600481 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800482 stencil.failOp = VK_STENCIL_OP_KEEP;
483 stencil.passOp = VK_STENCIL_OP_KEEP;
484 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
485 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600486
487 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
488 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600489 ds_ci.pNext = NULL;
490 ds_ci.depthTestEnable = VK_FALSE;
491 ds_ci.depthWriteEnable = VK_TRUE;
492 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
493 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600494 if (failMask & BsoFailDepthBounds) {
495 ds_ci.depthBoundsTestEnable = VK_TRUE;
496 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600497 ds_ci.stencilTestEnable = VK_TRUE;
498 ds_ci.front = stencil;
499 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600500
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600501 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600502 pipelineobj.SetViewport(m_viewports);
503 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800504 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700505 VkResult err = pipelineobj.CreateVKPipeline(
506 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600507 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800508 commandBuffer->BindPipeline(pipelineobj);
509 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500510}
511
512// ********************************************************************************************************************
513// ********************************************************************************************************************
514// ********************************************************************************************************************
515// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600516#if PARAMETER_VALIDATION_TESTS
517TEST_F(VkLayerTest, RequiredParameter) {
518 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
519 "pointer, array, and array count parameters");
520
521 ASSERT_NO_FATAL_FAILURE(InitState());
522
523 m_errorMonitor->SetDesiredFailureMsg(
524 VK_DEBUG_REPORT_ERROR_BIT_EXT,
525 "required parameter pFeatures specified as NULL");
526 // Specify NULL for a pointer to a handle
527 // Expected to trigger an error with
528 // parameter_validation::validate_required_pointer
529 vkGetPhysicalDeviceFeatures(gpu(), NULL);
530 m_errorMonitor->VerifyFound();
531
532 m_errorMonitor->SetDesiredFailureMsg(
533 VK_DEBUG_REPORT_ERROR_BIT_EXT,
534 "required parameter pPhysicalDeviceCount specified as NULL");
535 // Specify NULL for pointer to array count
536 // Expected to trigger an error with parameter_validation::validate_array
537 vkEnumeratePhysicalDevices(instance(), NULL, NULL);
538 m_errorMonitor->VerifyFound();
539
540 m_errorMonitor->SetDesiredFailureMsg(
541 VK_DEBUG_REPORT_ERROR_BIT_EXT,
542 "parameter viewportCount must be greater than 0");
543 // Specify 0 for a required array count
544 // Expected to trigger an error with parameter_validation::validate_array
545 VkViewport view_port = {};
546 m_commandBuffer->SetViewport(0, 0, &view_port);
547 m_errorMonitor->VerifyFound();
548
549 m_errorMonitor->SetDesiredFailureMsg(
550 VK_DEBUG_REPORT_ERROR_BIT_EXT,
551 "required parameter pViewports specified as NULL");
552 // Specify NULL for a required array
553 // Expected to trigger an error with parameter_validation::validate_array
554 m_commandBuffer->SetViewport(0, 1, NULL);
555 m_errorMonitor->VerifyFound();
556
557 m_errorMonitor->SetDesiredFailureMsg(
558 VK_DEBUG_REPORT_ERROR_BIT_EXT,
559 "required parameter memory specified as VK_NULL_HANDLE");
560 // Specify VK_NULL_HANDLE for a required handle
561 // Expected to trigger an error with
562 // parameter_validation::validate_required_handle
563 vkUnmapMemory(device(), VK_NULL_HANDLE);
564 m_errorMonitor->VerifyFound();
565
566 m_errorMonitor->SetDesiredFailureMsg(
567 VK_DEBUG_REPORT_ERROR_BIT_EXT,
568 "required parameter pFences[0] specified as VK_NULL_HANDLE");
569 // Specify VK_NULL_HANDLE for a required handle array entry
570 // Expected to trigger an error with
571 // parameter_validation::validate_required_handle_array
572 VkFence fence = VK_NULL_HANDLE;
573 vkResetFences(device(), 1, &fence);
574 m_errorMonitor->VerifyFound();
575
576 m_errorMonitor->SetDesiredFailureMsg(
577 VK_DEBUG_REPORT_ERROR_BIT_EXT,
578 "required parameter pAllocateInfo specified as NULL");
579 // Specify NULL for a required struct pointer
580 // Expected to trigger an error with
581 // parameter_validation::validate_struct_type
582 VkDeviceMemory memory = VK_NULL_HANDLE;
583 vkAllocateMemory(device(), NULL, NULL, &memory);
584 m_errorMonitor->VerifyFound();
585
586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
587 "value of faceMask must not be 0");
588 // Specify 0 for a required VkFlags parameter
589 // Expected to trigger an error with parameter_validation::validate_flags
590 m_commandBuffer->SetStencilReference(0, 0);
591 m_errorMonitor->VerifyFound();
592
593 m_errorMonitor->SetDesiredFailureMsg(
594 VK_DEBUG_REPORT_ERROR_BIT_EXT,
595 "value of pSubmits[i].pWaitDstStageMask[0] must not be 0");
596 // Specify 0 for a required VkFlags array entry
597 // Expected to trigger an error with
598 // parameter_validation::validate_flags_array
599 VkSemaphore semaphore = VK_NULL_HANDLE;
600 VkPipelineStageFlags stageFlags = 0;
601 VkSubmitInfo submitInfo = {};
602 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
603 submitInfo.waitSemaphoreCount = 1;
604 submitInfo.pWaitSemaphores = &semaphore;
605 submitInfo.pWaitDstStageMask = &stageFlags;
606 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
607 m_errorMonitor->VerifyFound();
608}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600609
Dustin Gravesfce74c02016-05-10 11:42:58 -0600610TEST_F(VkLayerTest, ReservedParameter) {
611 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
612
613 ASSERT_NO_FATAL_FAILURE(InitState());
614
615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
616 " must be 0");
617 // Specify 0 for a reserved VkFlags parameter
618 // Expected to trigger an error with
619 // parameter_validation::validate_reserved_flags
620 VkEvent event_handle = VK_NULL_HANDLE;
621 VkEventCreateInfo event_info = {};
622 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
623 event_info.flags = 1;
624 vkCreateEvent(device(), &event_info, NULL, &event_handle);
625 m_errorMonitor->VerifyFound();
626}
627
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600628TEST_F(VkLayerTest, InvalidStructSType) {
629 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
630 "structure's sType field");
631
632 ASSERT_NO_FATAL_FAILURE(InitState());
633
634 m_errorMonitor->SetDesiredFailureMsg(
635 VK_DEBUG_REPORT_ERROR_BIT_EXT,
636 "parameter pAllocateInfo->sType must be");
637 // Zero struct memory, effectively setting sType to
638 // VK_STRUCTURE_TYPE_APPLICATION_INFO
639 // Expected to trigger an error with
640 // parameter_validation::validate_struct_type
641 VkMemoryAllocateInfo alloc_info = {};
642 VkDeviceMemory memory = VK_NULL_HANDLE;
643 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
644 m_errorMonitor->VerifyFound();
645
646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
647 "parameter pSubmits[0].sType must be");
648 // Zero struct memory, effectively setting sType to
649 // VK_STRUCTURE_TYPE_APPLICATION_INFO
650 // Expected to trigger an error with
651 // parameter_validation::validate_struct_type_array
652 VkSubmitInfo submit_info = {};
653 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
654 m_errorMonitor->VerifyFound();
655}
656
657TEST_F(VkLayerTest, InvalidStructPNext) {
658 TEST_DESCRIPTION(
659 "Specify an invalid value for a Vulkan structure's pNext field");
660
661 ASSERT_NO_FATAL_FAILURE(InitState());
662
663 m_errorMonitor->SetDesiredFailureMsg(
664 VK_DEBUG_REPORT_ERROR_BIT_EXT,
665 "value of pAllocateInfo->pNext must be NULL");
666 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be
667 // NULL
668 // Expected to trigger an error with
669 // parameter_validation::validate_struct_pnext
670 VkDeviceMemory memory = VK_NULL_HANDLE;
671 // Zero-initialization will provide the correct sType
672 VkApplicationInfo app_info = {};
Dustin Graves47b6cba2016-05-10 17:34:38 -0600673 VkMemoryAllocateInfo memory_alloc_info = {};
674 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
675 memory_alloc_info.pNext = &app_info;
676 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600677 m_errorMonitor->VerifyFound();
678
Dustin Graves47b6cba2016-05-10 17:34:38 -0600679 m_errorMonitor->SetDesiredFailureMsg(
680 VK_DEBUG_REPORT_ERROR_BIT_EXT,
681 " chain includes a structure with unexpected VkStructureType ");
682 // Set VkGraphicsPipelineCreateInfo::VkPipelineRasterizationStateCreateInfo::pNext to an invalid structure, when pNext is allowed to be a non-NULL value
683 // Expected to trigger an error with
684 // parameter_validation::validate_struct_pnext
685 VkDescriptorPoolSize ds_type_count = {};
686 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
687 ds_type_count.descriptorCount = 1;
688
689 VkDescriptorPoolCreateInfo ds_pool_ci = {};
690 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
691 ds_pool_ci.pNext = NULL;
692 ds_pool_ci.maxSets = 1;
693 ds_pool_ci.poolSizeCount = 1;
694 ds_pool_ci.pPoolSizes = &ds_type_count;
695
696 VkDescriptorPool ds_pool;
697 VkResult err =
698 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
699 ASSERT_VK_SUCCESS(err);
700
701 VkDescriptorSetLayoutBinding dsl_binding = {};
702 dsl_binding.binding = 0;
703 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
704 dsl_binding.descriptorCount = 1;
705 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
706 dsl_binding.pImmutableSamplers = NULL;
707
708 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
709 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
710 ds_layout_ci.pNext = NULL;
711 ds_layout_ci.bindingCount = 1;
712 ds_layout_ci.pBindings = &dsl_binding;
713
714 VkDescriptorSetLayout ds_layout;
715 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
716 &ds_layout);
717 ASSERT_VK_SUCCESS(err);
718
719 VkDescriptorSet descriptorSet;
720 VkDescriptorSetAllocateInfo ds_alloc_info = {};
721 ds_alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
722 ds_alloc_info.descriptorSetCount = 1;
723 ds_alloc_info.descriptorPool = ds_pool;
724 ds_alloc_info.pSetLayouts = &ds_layout;
725 err = vkAllocateDescriptorSets(m_device->device(), &ds_alloc_info,
726 &descriptorSet);
727 ASSERT_VK_SUCCESS(err);
728
729 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
730 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
731 pipeline_layout_ci.setLayoutCount = 1;
732 pipeline_layout_ci.pSetLayouts = &ds_layout;
733
734 VkPipelineLayout pipeline_layout;
735 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
736 &pipeline_layout);
737 ASSERT_VK_SUCCESS(err);
738
739 VkViewport vp = {}; // Just need dummy vp to point to
740 VkRect2D sc = {}; // dummy scissor to point to
741
742 VkPipelineViewportStateCreateInfo vp_state_ci = {};
743 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
744 vp_state_ci.scissorCount = 1;
745 vp_state_ci.pScissors = &sc;
746 vp_state_ci.viewportCount = 1;
747 vp_state_ci.pViewports = &vp;
748
749 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
750 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
751 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
752 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
753 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
754 rs_state_ci.depthClampEnable = VK_FALSE;
755 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
756 rs_state_ci.depthBiasEnable = VK_FALSE;
757
758 VkGraphicsPipelineCreateInfo gp_ci = {};
759 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
760 gp_ci.pViewportState = &vp_state_ci;
761 gp_ci.pRasterizationState = &rs_state_ci;
762 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
763 gp_ci.layout = pipeline_layout;
764 gp_ci.renderPass = renderPass();
765
766 VkPipelineCacheCreateInfo pc_ci = {};
767 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
768 pc_ci.initialDataSize = 0;
769 pc_ci.pInitialData = 0;
770
771 VkPipeline pipeline;
772 VkPipelineCache pipelineCache;
773
774 err =
775 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
776 ASSERT_VK_SUCCESS(err);
777
778 // Set VkPipelineRasterizationStateCreateInfo::pNext to an invalid value
779 VkApplicationInfo invalid_pnext_struct = {};
780 rs_state_ci.pNext = &invalid_pnext_struct;
781
782 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
783 &gp_ci, NULL, &pipeline);
784 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600785}
Dustin Graves5d33d532016-05-09 16:21:12 -0600786
787TEST_F(VkLayerTest, UnrecognizedValue) {
788 TEST_DESCRIPTION(
789 "Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
790
791 ASSERT_NO_FATAL_FAILURE(InitState());
792
793 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
794 "does not fall within the begin..end "
795 "range of the core VkFormat "
796 "enumeration tokens");
797 // Specify an invalid VkFormat value
798 // Expected to trigger an error with
799 // parameter_validation::validate_ranged_enum
800 VkFormatProperties format_properties;
801 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000),
802 &format_properties);
803 m_errorMonitor->VerifyFound();
804
805 m_errorMonitor->SetDesiredFailureMsg(
806 VK_DEBUG_REPORT_ERROR_BIT_EXT,
807 "contains flag bits that are not recognized members of");
808 // Specify an invalid VkFlags bitmask value
809 // Expected to trigger an error with parameter_validation::validate_flags
810 VkImageFormatProperties image_format_properties;
811 vkGetPhysicalDeviceImageFormatProperties(
812 gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D,
813 VK_IMAGE_TILING_OPTIMAL, static_cast<VkImageUsageFlags>(1 << 25), 0,
814 &image_format_properties);
815 m_errorMonitor->VerifyFound();
816
817 m_errorMonitor->SetDesiredFailureMsg(
818 VK_DEBUG_REPORT_ERROR_BIT_EXT,
819 "contains flag bits that are not recognized members of");
820 // Specify an invalid VkFlags array entry
821 // Expected to trigger an error with
822 // parameter_validation::validate_flags_array
823 VkSemaphore semaphore = VK_NULL_HANDLE;
824 VkPipelineStageFlags stage_flags =
825 static_cast<VkPipelineStageFlags>(1 << 25);
826 VkSubmitInfo submit_info = {};
827 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
828 submit_info.waitSemaphoreCount = 1;
829 submit_info.pWaitSemaphores = &semaphore;
830 submit_info.pWaitDstStageMask = &stage_flags;
831 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
832 m_errorMonitor->VerifyFound();
833
834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
835 "is neither VK_TRUE nor VK_FALSE");
836 // Specify an invalid VkBool32 value
837 // Expected to trigger a warning with
838 // parameter_validation::validate_bool32
839 VkSampler sampler = VK_NULL_HANDLE;
840 VkSamplerCreateInfo sampler_info = {};
841 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
842 sampler_info.pNext = NULL;
843 sampler_info.magFilter = VK_FILTER_NEAREST;
844 sampler_info.minFilter = VK_FILTER_NEAREST;
845 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
846 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
847 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
848 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
849 sampler_info.mipLodBias = 1.0;
850 sampler_info.maxAnisotropy = 1;
851 sampler_info.compareEnable = VK_FALSE;
852 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
853 sampler_info.minLod = 1.0;
854 sampler_info.maxLod = 1.0;
855 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
856 sampler_info.unnormalizedCoordinates = VK_FALSE;
857 // Not VK_TRUE or VK_FALSE
858 sampler_info.anisotropyEnable = 3;
859 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
860 m_errorMonitor->VerifyFound();
861}
Dustin Gravesfce74c02016-05-10 11:42:58 -0600862
863TEST_F(VkLayerTest, FailedReturnValue) {
864 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
865
866 ASSERT_NO_FATAL_FAILURE(InitState());
867
868 m_errorMonitor->SetDesiredFailureMsg(
869 VK_DEBUG_REPORT_WARNING_BIT_EXT,
870 "the requested format is not supported on this device");
871 // Specify invalid VkFormat value to generate a
872 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
873 // Expected to trigger a warning from parameter_validation::validate_result
874 VkImageFormatProperties image_format_properties;
875 VkResult err = vkGetPhysicalDeviceImageFormatProperties(
876 gpu(), static_cast<VkFormat>(0x8000), VK_IMAGE_TYPE_2D,
877 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0,
878 &image_format_properties);
879 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
880 m_errorMonitor->VerifyFound();
881}
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600882#endif // PARAMETER_VALIDATION_TESTS
883
Tobin Ehlis0788f522015-05-26 16:11:58 -0600884#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700885#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800886TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500887{
888 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500889 VkFenceCreateInfo fenceInfo = {};
890 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
891 fenceInfo.pNext = NULL;
892 fenceInfo.flags = 0;
893
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700894 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600895
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500896 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600897
898 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
899 vk_testing::Buffer buffer;
900 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500901
Tony Barbourfe3351b2015-07-28 10:17:20 -0600902 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800903 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600904 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500905
906 testFence.init(*m_device, fenceInfo);
907
908 // Bypass framework since it does the waits automatically
909 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600910 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800911 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
912 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800913 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600914 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700915 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800916 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800917 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800918 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600919 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600920
921 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500922 ASSERT_VK_SUCCESS( err );
923
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500924 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800925 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500926
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200927 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500928}
929
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800930TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500931{
932 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500933 VkFenceCreateInfo fenceInfo = {};
934 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
935 fenceInfo.pNext = NULL;
936 fenceInfo.flags = 0;
937
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600939
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500940 ASSERT_NO_FATAL_FAILURE(InitState());
941 ASSERT_NO_FATAL_FAILURE(InitViewport());
942 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
943
Tony Barbourfe3351b2015-07-28 10:17:20 -0600944 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800945 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600946 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500947
948 testFence.init(*m_device, fenceInfo);
949
950 // Bypass framework since it does the waits automatically
951 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600952 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800953 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
954 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800955 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600956 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700957 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800958 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800959 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800960 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600961 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600962
963 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500964 ASSERT_VK_SUCCESS( err );
965
Jon Ashburnf19916e2016-01-11 13:12:43 -0700966 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800967 VkCommandBufferBeginInfo info = {};
968 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
969 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600970 info.renderPass = VK_NULL_HANDLE;
971 info.subpass = 0;
972 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800973 info.occlusionQueryEnable = VK_FALSE;
974 info.queryFlags = 0;
975 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600976
977 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800978 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500979
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200980 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500981}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700982#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200983
Mark Lobodzinski152fe252016-05-03 16:49:15 -0600984// This is a positive test. No failures are expected.
985TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
986 VkResult err;
987 bool pass;
988
989 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
990 "the buffer, create an image, and bind the same memory to "
991 "it");
992
993 m_errorMonitor->ExpectSuccess();
994
995 ASSERT_NO_FATAL_FAILURE(InitState());
996
997 VkBuffer buffer;
998 VkImage image;
999 VkDeviceMemory mem;
1000 VkMemoryRequirements mem_reqs;
1001
1002 VkBufferCreateInfo buf_info = {};
1003 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1004 buf_info.pNext = NULL;
1005 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1006 buf_info.size = 256;
1007 buf_info.queueFamilyIndexCount = 0;
1008 buf_info.pQueueFamilyIndices = NULL;
1009 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1010 buf_info.flags = 0;
1011 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1012 ASSERT_VK_SUCCESS(err);
1013
1014 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1015
1016 VkMemoryAllocateInfo alloc_info = {};
1017 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1018 alloc_info.pNext = NULL;
1019 alloc_info.memoryTypeIndex = 0;
1020
1021 // Ensure memory is big enough for both bindings
1022 alloc_info.allocationSize = 0x10000;
1023
1024 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1025 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1026 if (!pass) {
1027 vkDestroyBuffer(m_device->device(), buffer, NULL);
1028 return;
1029 }
1030
1031 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1032 ASSERT_VK_SUCCESS(err);
1033
1034 uint8_t *pData;
1035 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1036 (void **)&pData);
1037 ASSERT_VK_SUCCESS(err);
1038
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001039 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001040
1041 vkUnmapMemory(m_device->device(), mem);
1042
1043 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1044 ASSERT_VK_SUCCESS(err);
1045
1046 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1047 // memory. In fact, it was never used by the GPU.
1048 // Just be be sure, wait for idle.
1049 vkDestroyBuffer(m_device->device(), buffer, NULL);
1050 vkDeviceWaitIdle(m_device->device());
1051
1052 VkImageCreateInfo image_create_info = {};
1053 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1054 image_create_info.pNext = NULL;
1055 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1056 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1057 image_create_info.extent.width = 64;
1058 image_create_info.extent.height = 64;
1059 image_create_info.extent.depth = 1;
1060 image_create_info.mipLevels = 1;
1061 image_create_info.arrayLayers = 1;
1062 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1063 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1064 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1065 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1066 image_create_info.queueFamilyIndexCount = 0;
1067 image_create_info.pQueueFamilyIndices = NULL;
1068 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1069 image_create_info.flags = 0;
1070
1071 VkMemoryAllocateInfo mem_alloc = {};
1072 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1073 mem_alloc.pNext = NULL;
1074 mem_alloc.allocationSize = 0;
1075 mem_alloc.memoryTypeIndex = 0;
1076
1077 /* Create a mappable image. It will be the texture if linear images are ok
1078 * to be textures or it will be the staging image if they are not.
1079 */
1080 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1081 ASSERT_VK_SUCCESS(err);
1082
1083 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1084
1085 mem_alloc.allocationSize = mem_reqs.size;
1086
1087 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
1088 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1089 if (!pass) {
1090 vkDestroyImage(m_device->device(), image, NULL);
1091 return;
1092 }
1093
1094 // VALDIATION FAILURE:
1095 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1096 ASSERT_VK_SUCCESS(err);
1097
1098 m_errorMonitor->VerifyNotFound();
1099
1100 vkDestroyBuffer(m_device->device(), buffer, NULL);
1101 vkDestroyImage(m_device->device(), image, NULL);
1102}
1103
Ian Elliott1c32c772016-04-28 14:47:13 -06001104TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1105 VkResult err;
1106 bool pass;
1107
Ian Elliott489eec02016-05-05 14:12:44 -06001108// FIXME: After we turn on this code for non-Linux platforms, uncomment the
1109// following declaration (which is temporarily being moved below):
1110// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001111 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
1112 VkSwapchainCreateInfoKHR swapchain_create_info = {};
1113 uint32_t swapchain_image_count = 0;
1114// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
1115 uint32_t image_index = 0;
1116// VkPresentInfoKHR present_info = {};
1117
1118 ASSERT_NO_FATAL_FAILURE(InitState());
1119
Ian Elliott3f06ce52016-04-29 14:46:21 -06001120#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1121#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1122 // Use the functions from the VK_KHR_android_surface extension without
1123 // enabling that extension:
1124
1125 // Create a surface:
1126 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
1127#if 0
1128#endif
1129 m_errorMonitor->SetDesiredFailureMsg(
1130 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1131 "extension was not enabled for this");
1132 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
1133 &surface);
1134 pass = (err != VK_SUCCESS);
1135 ASSERT_TRUE(pass);
1136 m_errorMonitor->VerifyFound();
1137#endif // VK_USE_PLATFORM_ANDROID_KHR
1138
1139
1140#if defined(VK_USE_PLATFORM_MIR_KHR)
1141 // Use the functions from the VK_KHR_mir_surface extension without enabling
1142 // that extension:
1143
1144 // Create a surface:
1145 VkMirSurfaceCreateInfoKHR mir_create_info = {};
1146#if 0
1147#endif
1148 m_errorMonitor->SetDesiredFailureMsg(
1149 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1150 "extension was not enabled for this");
1151 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1152 pass = (err != VK_SUCCESS);
1153 ASSERT_TRUE(pass);
1154 m_errorMonitor->VerifyFound();
1155
1156 // Tell whether an mir_connection supports presentation:
1157 MirConnection *mir_connection = NULL;
1158 m_errorMonitor->SetDesiredFailureMsg(
1159 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1160 "extension was not enabled for this");
1161 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
1162 visual_id);
1163 m_errorMonitor->VerifyFound();
1164#endif // VK_USE_PLATFORM_MIR_KHR
1165
1166
1167#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1168 // Use the functions from the VK_KHR_wayland_surface extension without
1169 // enabling that extension:
1170
1171 // Create a surface:
1172 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
1173#if 0
1174#endif
1175 m_errorMonitor->SetDesiredFailureMsg(
1176 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1177 "extension was not enabled for this");
1178 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
1179 &surface);
1180 pass = (err != VK_SUCCESS);
1181 ASSERT_TRUE(pass);
1182 m_errorMonitor->VerifyFound();
1183
1184 // Tell whether an wayland_display supports presentation:
1185 struct wl_display wayland_display = {};
1186 m_errorMonitor->SetDesiredFailureMsg(
1187 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1188 "extension was not enabled for this");
1189 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
1190 &wayland_display);
1191 m_errorMonitor->VerifyFound();
1192#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06001193#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001194
1195
1196#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06001197// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1198// TO NON-LINUX PLATFORMS:
1199VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001200 // Use the functions from the VK_KHR_win32_surface extension without
1201 // enabling that extension:
1202
1203 // Create a surface:
1204 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
1205#if 0
1206#endif
1207 m_errorMonitor->SetDesiredFailureMsg(
1208 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1209 "extension was not enabled for this");
1210 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
1211 &surface);
1212 pass = (err != VK_SUCCESS);
1213 ASSERT_TRUE(pass);
1214 m_errorMonitor->VerifyFound();
1215
1216 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001217 m_errorMonitor->SetDesiredFailureMsg(
1218 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1219 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001220 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001221 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001222// Set this (for now, until all platforms are supported and tested):
1223#define NEED_TO_TEST_THIS_ON_PLATFORM
1224#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001225
1226
Ian Elliott1c32c772016-04-28 14:47:13 -06001227#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06001228// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1229// TO NON-LINUX PLATFORMS:
1230VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001231 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1232 // that extension:
1233
1234 // Create a surface:
1235 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
1236#if 0
1237#endif
1238 m_errorMonitor->SetDesiredFailureMsg(
1239 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1240 "extension was not enabled for this");
1241 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1242 pass = (err != VK_SUCCESS);
1243 ASSERT_TRUE(pass);
1244 m_errorMonitor->VerifyFound();
1245
1246 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001247 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001248 xcb_visualid_t visual_id = 0;
1249 m_errorMonitor->SetDesiredFailureMsg(
1250 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1251 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001252 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06001253 visual_id);
1254 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001255// Set this (for now, until all platforms are supported and tested):
1256#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001257#endif // VK_USE_PLATFORM_XCB_KHR
1258
1259
Ian Elliott12630812016-04-29 14:35:43 -06001260#if defined(VK_USE_PLATFORM_XLIB_KHR)
1261 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1262 // that extension:
1263
1264 // Create a surface:
1265 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
1266#if 0
1267#endif
1268 m_errorMonitor->SetDesiredFailureMsg(
1269 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1270 "extension was not enabled for this");
1271 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1272 pass = (err != VK_SUCCESS);
1273 ASSERT_TRUE(pass);
1274 m_errorMonitor->VerifyFound();
1275
1276 // Tell whether an Xlib VisualID supports presentation:
1277 Display *dpy = NULL;
1278 VisualID visual = 0;
1279 m_errorMonitor->SetDesiredFailureMsg(
1280 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1281 "extension was not enabled for this");
1282 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1283 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001284// Set this (for now, until all platforms are supported and tested):
1285#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06001286#endif // VK_USE_PLATFORM_XLIB_KHR
1287
1288
Ian Elliott1c32c772016-04-28 14:47:13 -06001289 // Use the functions from the VK_KHR_surface extension without enabling
1290 // that extension:
1291
Ian Elliott489eec02016-05-05 14:12:44 -06001292#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001293 // Destroy a surface:
1294 m_errorMonitor->SetDesiredFailureMsg(
1295 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1296 "extension was not enabled for this");
1297 vkDestroySurfaceKHR(instance(), surface, NULL);
1298 m_errorMonitor->VerifyFound();
1299
1300 // Check if surface supports presentation:
1301 VkBool32 supported = false;
1302 m_errorMonitor->SetDesiredFailureMsg(
1303 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1304 "extension was not enabled for this");
1305 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1306 pass = (err != VK_SUCCESS);
1307 ASSERT_TRUE(pass);
1308 m_errorMonitor->VerifyFound();
1309
1310 // Check surface capabilities:
1311 VkSurfaceCapabilitiesKHR capabilities = {};
1312 m_errorMonitor->SetDesiredFailureMsg(
1313 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1314 "extension was not enabled for this");
1315 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
1316 &capabilities);
1317 pass = (err != VK_SUCCESS);
1318 ASSERT_TRUE(pass);
1319 m_errorMonitor->VerifyFound();
1320
1321 // Check surface formats:
1322 uint32_t format_count = 0;
1323 VkSurfaceFormatKHR *formats = NULL;
1324 m_errorMonitor->SetDesiredFailureMsg(
1325 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1326 "extension was not enabled for this");
1327 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1328 &format_count, formats);
1329 pass = (err != VK_SUCCESS);
1330 ASSERT_TRUE(pass);
1331 m_errorMonitor->VerifyFound();
1332
1333 // Check surface present modes:
1334 uint32_t present_mode_count = 0;
1335 VkSurfaceFormatKHR *present_modes = NULL;
1336 m_errorMonitor->SetDesiredFailureMsg(
1337 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1338 "extension was not enabled for this");
1339 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1340 &present_mode_count, present_modes);
1341 pass = (err != VK_SUCCESS);
1342 ASSERT_TRUE(pass);
1343 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001344#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001345
1346
1347 // Use the functions from the VK_KHR_swapchain extension without enabling
1348 // that extension:
1349
1350 // Create a swapchain:
1351 m_errorMonitor->SetDesiredFailureMsg(
1352 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1353 "extension was not enabled for this");
1354 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1355 swapchain_create_info.pNext = NULL;
1356#if 0
1357 swapchain_create_info.flags = 0;
1358 swapchain_create_info.surface = 0;
1359 swapchain_create_info.minImageCount = 0;
1360 swapchain_create_info.imageFormat = 0;
1361 swapchain_create_info.imageColorSpace = 0;
1362 swapchain_create_info.imageExtent.width = 0;
1363 swapchain_create_info.imageExtent.height = 0;
1364 swapchain_create_info.imageArrayLayers = 0;
1365 swapchain_create_info.imageUsage = 0;
1366 swapchain_create_info.imageSharingMode = 0;
1367 swapchain_create_info.queueFamilyIndexCount = 0;
1368 swapchain_create_info.preTransform = 0;
1369 swapchain_create_info.compositeAlpha = 0;
1370 swapchain_create_info.presentMode = 0;
1371 swapchain_create_info.clipped = 0;
1372 swapchain_create_info.oldSwapchain = NULL;
1373#endif
1374 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1375 NULL, &swapchain);
1376 pass = (err != VK_SUCCESS);
1377 ASSERT_TRUE(pass);
1378 m_errorMonitor->VerifyFound();
1379
1380 // Get the images from the swapchain:
1381 m_errorMonitor->SetDesiredFailureMsg(
1382 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1383 "extension was not enabled for this");
1384 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
1385 &swapchain_image_count, NULL);
1386 pass = (err != VK_SUCCESS);
1387 ASSERT_TRUE(pass);
1388 m_errorMonitor->VerifyFound();
1389
1390 // Try to acquire an image:
1391 m_errorMonitor->SetDesiredFailureMsg(
1392 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1393 "extension was not enabled for this");
1394 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
1395 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
1396 pass = (err != VK_SUCCESS);
1397 ASSERT_TRUE(pass);
1398 m_errorMonitor->VerifyFound();
1399
1400 // Try to present an image:
1401#if 0 // NOTE: Currently can't test this because a real swapchain is needed
1402 // (as opposed to the fake one we created) in order for the layer to
1403 // lookup the VkDevice used to enable the extension:
1404 m_errorMonitor->SetDesiredFailureMsg(
1405 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1406 "extension was not enabled for this");
1407 present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
1408 present_info.pNext = NULL;
1409#if 0
1410#endif
1411 err = vkQueuePresentKHR(m_device->m_queue, &present_info);
1412 pass = (err != VK_SUCCESS);
1413 ASSERT_TRUE(pass);
1414 m_errorMonitor->VerifyFound();
1415#endif
1416
1417 // Destroy the swapchain:
1418 m_errorMonitor->SetDesiredFailureMsg(
1419 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1420 "extension was not enabled for this");
1421 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1422 m_errorMonitor->VerifyFound();
1423}
1424
Karl Schultz6addd812016-02-02 17:17:23 -07001425TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1426 VkResult err;
1427 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001428
Karl Schultz6addd812016-02-02 17:17:23 -07001429 m_errorMonitor->SetDesiredFailureMsg(
1430 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001431 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
1432
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001433 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001434
1435 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001436 VkImage image;
1437 VkDeviceMemory mem;
1438 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001439
Karl Schultz6addd812016-02-02 17:17:23 -07001440 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1441 const int32_t tex_width = 32;
1442 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001443
Tony Barboureb254902015-07-15 12:50:33 -06001444 VkImageCreateInfo image_create_info = {};
1445 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001446 image_create_info.pNext = NULL;
1447 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1448 image_create_info.format = tex_format;
1449 image_create_info.extent.width = tex_width;
1450 image_create_info.extent.height = tex_height;
1451 image_create_info.extent.depth = 1;
1452 image_create_info.mipLevels = 1;
1453 image_create_info.arrayLayers = 1;
1454 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1455 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1456 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1457 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001458
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001459 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001460 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001461 mem_alloc.pNext = NULL;
1462 mem_alloc.allocationSize = 0;
1463 // Introduce failure, do NOT set memProps to
1464 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
1465 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001466
Chia-I Wuf7458c52015-10-26 21:10:41 +08001467 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001468 ASSERT_VK_SUCCESS(err);
1469
Karl Schultz6addd812016-02-02 17:17:23 -07001470 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001471
Mark Lobodzinski23065352015-05-29 09:32:35 -05001472 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001473
Karl Schultz6addd812016-02-02 17:17:23 -07001474 pass =
1475 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
1476 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1477 if (!pass) { // If we can't find any unmappable memory this test doesn't
1478 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08001479 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06001480 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06001481 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06001482
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001483 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001484 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001485 ASSERT_VK_SUCCESS(err);
1486
1487 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06001488 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001489 ASSERT_VK_SUCCESS(err);
1490
1491 // Map memory as if to initialize the image
1492 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07001493 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
1494 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001495
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001496 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001497
Chia-I Wuf7458c52015-10-26 21:10:41 +08001498 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001499}
1500
Karl Schultz6addd812016-02-02 17:17:23 -07001501TEST_F(VkLayerTest, RebindMemory) {
1502 VkResult err;
1503 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001504
Karl Schultz6addd812016-02-02 17:17:23 -07001505 m_errorMonitor->SetDesiredFailureMsg(
1506 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001507 "which has already been bound to mem object");
1508
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001509 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001510
1511 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001512 VkImage image;
1513 VkDeviceMemory mem1;
1514 VkDeviceMemory mem2;
1515 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001516
Karl Schultz6addd812016-02-02 17:17:23 -07001517 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1518 const int32_t tex_width = 32;
1519 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001520
Tony Barboureb254902015-07-15 12:50:33 -06001521 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001522 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1523 image_create_info.pNext = NULL;
1524 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1525 image_create_info.format = tex_format;
1526 image_create_info.extent.width = tex_width;
1527 image_create_info.extent.height = tex_height;
1528 image_create_info.extent.depth = 1;
1529 image_create_info.mipLevels = 1;
1530 image_create_info.arrayLayers = 1;
1531 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1532 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1533 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1534 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001535
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001536 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001537 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1538 mem_alloc.pNext = NULL;
1539 mem_alloc.allocationSize = 0;
1540 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06001541
Karl Schultz6addd812016-02-02 17:17:23 -07001542 // Introduce failure, do NOT set memProps to
1543 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06001544 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001545 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001546 ASSERT_VK_SUCCESS(err);
1547
Karl Schultz6addd812016-02-02 17:17:23 -07001548 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001549
1550 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001551 pass =
1552 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001553 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001554
1555 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001556 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001557 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001558 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001559 ASSERT_VK_SUCCESS(err);
1560
1561 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06001562 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001563 ASSERT_VK_SUCCESS(err);
1564
Karl Schultz6addd812016-02-02 17:17:23 -07001565 // Introduce validation failure, try to bind a different memory object to
1566 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06001567 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001568
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001569 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001570
Chia-I Wuf7458c52015-10-26 21:10:41 +08001571 vkDestroyImage(m_device->device(), image, NULL);
1572 vkFreeMemory(m_device->device(), mem1, NULL);
1573 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001574}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001575
Karl Schultz6addd812016-02-02 17:17:23 -07001576TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001577 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001578
Karl Schultz6addd812016-02-02 17:17:23 -07001579 m_errorMonitor->SetDesiredFailureMsg(
1580 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
1581 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001582
1583 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001584 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1585 fenceInfo.pNext = NULL;
1586 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06001587
Tony Barbour300a6082015-04-07 13:44:53 -06001588 ASSERT_NO_FATAL_FAILURE(InitState());
1589 ASSERT_NO_FATAL_FAILURE(InitViewport());
1590 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1591
Tony Barbourfe3351b2015-07-28 10:17:20 -06001592 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001593 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1594 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001595 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06001596
1597 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001598
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001599 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001600 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1601 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001602 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001603 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001604 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001605 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001606 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001607 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001608 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001609
1610 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001611 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001612
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001613 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001614}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001615// This is a positive test. We used to expect error in this case but spec now
1616// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07001617TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001618 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001619 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001620 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001621 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1622 fenceInfo.pNext = NULL;
1623
Tony Barbour0b4d9562015-04-09 10:48:04 -06001624 ASSERT_NO_FATAL_FAILURE(InitState());
1625 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08001626 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001627 VkResult result = vkResetFences(m_device->device(), 1, fences);
1628 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06001629
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001630 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06001631}
Tobin Ehlis41376e12015-07-03 08:45:14 -06001632
1633TEST_F(VkLayerTest, InvalidUsageBits)
1634{
Tony Barbourf92621a2016-05-02 14:28:12 -06001635 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001636 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06001637 "Initialize buffer with wrong usage then perform copy expecting errors "
1638 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001639 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001640 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001641
1642 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06001643 VkImageObj image(m_device);
1644 // Initialize image with USAGE_INPUT_ATTACHMENT
1645 image.init(128, 128, VK_FORMAT_D32_SFLOAT_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001646 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1647 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06001648
Tony Barbourf92621a2016-05-02 14:28:12 -06001649 VkImageView dsv;
1650 VkImageViewCreateInfo dsvci = {};
1651 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1652 dsvci.image = image.handle();
1653 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
1654 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
1655 dsvci.subresourceRange.layerCount = 1;
1656 dsvci.subresourceRange.baseMipLevel = 0;
1657 dsvci.subresourceRange.levelCount = 1;
1658 dsvci.subresourceRange.aspectMask =
1659 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06001660
Tony Barbourf92621a2016-05-02 14:28:12 -06001661 // Create a view with depth / stencil aspect for image with different usage
1662 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001663
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001664 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06001665
1666 // Initialize buffer with TRANSFER_DST usage
1667 vk_testing::Buffer buffer;
1668 VkMemoryPropertyFlags reqs = 0;
1669 buffer.init_as_dst(*m_device, 128 * 128, reqs);
1670 VkBufferImageCopy region = {};
1671 region.bufferRowLength = 128;
1672 region.bufferImageHeight = 128;
1673 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1674 region.imageSubresource.layerCount = 1;
1675 region.imageExtent.height = 16;
1676 region.imageExtent.width = 16;
1677 region.imageExtent.depth = 1;
1678
1679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1680 "Invalid usage flag for buffer ");
1681 // Buffer usage not set to TRANSFER_SRC and image usage not set to
1682 // TRANSFER_DST
1683 BeginCommandBuffer();
1684 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1685 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1686 1, &region);
1687 m_errorMonitor->VerifyFound();
1688
1689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1690 "Invalid usage flag for image ");
1691 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1692 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1693 1, &region);
1694 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06001695}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001696#endif // MEM_TRACKER_TESTS
1697
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06001698#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06001699
1700TEST_F(VkLayerTest, LeakAnObject) {
1701 VkResult err;
1702
1703 TEST_DESCRIPTION(
1704 "Create a fence and destroy its device without first destroying the fence.");
1705
1706 // Note that we have to create a new device since destroying the
1707 // framework's device causes Teardown() to fail and just calling Teardown
1708 // will destroy the errorMonitor.
1709
1710 m_errorMonitor->SetDesiredFailureMsg(
1711 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1712 "OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT object");
1713
1714 ASSERT_NO_FATAL_FAILURE(InitState());
1715
1716 const std::vector<VkQueueFamilyProperties> queue_props =
1717 m_device->queue_props;
1718 std::vector<VkDeviceQueueCreateInfo> queue_info;
1719 queue_info.reserve(queue_props.size());
1720 std::vector<std::vector<float>> queue_priorities;
1721 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
1722 VkDeviceQueueCreateInfo qi = {};
1723 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
1724 qi.pNext = NULL;
1725 qi.queueFamilyIndex = i;
1726 qi.queueCount = queue_props[i].queueCount;
1727 queue_priorities.emplace_back(qi.queueCount, 0.0f);
1728 qi.pQueuePriorities = queue_priorities[i].data();
1729 queue_info.push_back(qi);
1730 }
1731
1732 std::vector<const char *> device_layer_names;
1733 std::vector<const char *> device_extension_names;
1734 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
1735 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
1736 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
1737 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
1738 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
1739 device_layer_names.push_back("VK_LAYER_LUNARG_image");
1740 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
1741
1742 // The sacrificial device object
1743 VkDevice testDevice;
1744 VkDeviceCreateInfo device_create_info = {};
1745 auto features = m_device->phy().features();
1746 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
1747 device_create_info.pNext = NULL;
1748 device_create_info.queueCreateInfoCount = queue_info.size();
1749 device_create_info.pQueueCreateInfos = queue_info.data();
1750 device_create_info.enabledLayerCount = device_layer_names.size();
1751 device_create_info.ppEnabledLayerNames = device_layer_names.data();
1752 device_create_info.pEnabledFeatures = &features;
1753 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
1754 ASSERT_VK_SUCCESS(err);
1755
1756 VkFence fence;
1757 VkFenceCreateInfo fence_create_info = {};
1758 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1759 fence_create_info.pNext = NULL;
1760 fence_create_info.flags = 0;
1761 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
1762 ASSERT_VK_SUCCESS(err);
1763
1764 // Induce failure by not calling vkDestroyFence
1765 vkDestroyDevice(testDevice, NULL);
1766 m_errorMonitor->VerifyFound();
1767}
1768
1769TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
1770
1771 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
1772 "attempt to delete them from another.");
1773
1774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1775 "FreeCommandBuffers is attempting to free Command Buffer");
1776
1777 VkCommandPool command_pool_one;
1778 VkCommandPool command_pool_two;
1779
1780 VkCommandPoolCreateInfo pool_create_info{};
1781 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1782 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1783 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1784
1785 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1786 &command_pool_one);
1787
1788 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1789 &command_pool_two);
1790
1791 VkCommandBuffer command_buffer[9];
1792 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1793 command_buffer_allocate_info.sType =
1794 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1795 command_buffer_allocate_info.commandPool = command_pool_one;
1796 command_buffer_allocate_info.commandBufferCount = 9;
1797 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1798 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1799 command_buffer);
1800
1801 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
1802 &command_buffer[3]);
1803
1804 m_errorMonitor->VerifyFound();
1805
1806 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
1807 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
1808}
1809
1810TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
1811 VkResult err;
1812
1813 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
1814 "attempt to delete them from another.");
1815
1816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1817 "FreeDescriptorSets is attempting to free descriptorSet");
1818
1819 ASSERT_NO_FATAL_FAILURE(InitState());
1820 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1821
1822 VkDescriptorPoolSize ds_type_count = {};
1823 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
1824 ds_type_count.descriptorCount = 1;
1825
1826 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1827 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1828 ds_pool_ci.pNext = NULL;
1829 ds_pool_ci.flags = 0;
1830 ds_pool_ci.maxSets = 1;
1831 ds_pool_ci.poolSizeCount = 1;
1832 ds_pool_ci.pPoolSizes = &ds_type_count;
1833
1834 VkDescriptorPool ds_pool_one;
1835 err =
1836 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
1837 ASSERT_VK_SUCCESS(err);
1838
1839 // Create a second descriptor pool
1840 VkDescriptorPool ds_pool_two;
1841 err =
1842 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
1843 ASSERT_VK_SUCCESS(err);
1844
1845 VkDescriptorSetLayoutBinding dsl_binding = {};
1846 dsl_binding.binding = 0;
1847 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1848 dsl_binding.descriptorCount = 1;
1849 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1850 dsl_binding.pImmutableSamplers = NULL;
1851
1852 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1853 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1854 ds_layout_ci.pNext = NULL;
1855 ds_layout_ci.bindingCount = 1;
1856 ds_layout_ci.pBindings = &dsl_binding;
1857
1858 VkDescriptorSetLayout ds_layout;
1859 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1860 &ds_layout);
1861 ASSERT_VK_SUCCESS(err);
1862
1863 VkDescriptorSet descriptorSet;
1864 VkDescriptorSetAllocateInfo alloc_info = {};
1865 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1866 alloc_info.descriptorSetCount = 1;
1867 alloc_info.descriptorPool = ds_pool_one;
1868 alloc_info.pSetLayouts = &ds_layout;
1869 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1870 &descriptorSet);
1871 ASSERT_VK_SUCCESS(err);
1872
1873 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
1874
1875 m_errorMonitor->VerifyFound();
1876
1877 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1878 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
1879 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
1880}
1881
1882TEST_F(VkLayerTest, CreateUnknownObject) {
1883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1884 "Invalid VkImage Object ");
1885
1886 TEST_DESCRIPTION(
1887 "Pass an invalid image object handle into a Vulkan API call.");
1888
1889 ASSERT_NO_FATAL_FAILURE(InitState());
1890
1891 // Pass bogus handle into GetImageMemoryRequirements
1892 VkMemoryRequirements mem_reqs;
1893 uint64_t fakeImageHandle = 0xCADECADE;
1894 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
1895
1896 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
1897
1898 m_errorMonitor->VerifyFound();
1899}
1900
Karl Schultz6addd812016-02-02 17:17:23 -07001901TEST_F(VkLayerTest, PipelineNotBound) {
1902 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001903
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06001904 TEST_DESCRIPTION(
1905 "Pass in an invalid pipeline object handle into a Vulkan API call.");
1906
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001908 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001909
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001910 ASSERT_NO_FATAL_FAILURE(InitState());
1911 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001912
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001913 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001914 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1915 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001916
1917 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001918 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1919 ds_pool_ci.pNext = NULL;
1920 ds_pool_ci.maxSets = 1;
1921 ds_pool_ci.poolSizeCount = 1;
1922 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001923
1924 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001925 err =
1926 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001927 ASSERT_VK_SUCCESS(err);
1928
1929 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001930 dsl_binding.binding = 0;
1931 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1932 dsl_binding.descriptorCount = 1;
1933 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1934 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001935
1936 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001937 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1938 ds_layout_ci.pNext = NULL;
1939 ds_layout_ci.bindingCount = 1;
1940 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001941
1942 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001943 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1944 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001945 ASSERT_VK_SUCCESS(err);
1946
1947 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001948 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001949 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001950 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001951 alloc_info.descriptorPool = ds_pool;
1952 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001953 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1954 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001955 ASSERT_VK_SUCCESS(err);
1956
1957 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001958 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1959 pipeline_layout_ci.pNext = NULL;
1960 pipeline_layout_ci.setLayoutCount = 1;
1961 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001962
1963 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001964 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1965 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001966 ASSERT_VK_SUCCESS(err);
1967
Mark Youngad779052016-01-06 14:26:04 -07001968 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001969
1970 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001971 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1972 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001973
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001974 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001975
Chia-I Wuf7458c52015-10-26 21:10:41 +08001976 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1977 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1978 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001979}
1980
Karl Schultz6addd812016-02-02 17:17:23 -07001981TEST_F(VkLayerTest, BindInvalidMemory) {
1982 VkResult err;
1983 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001984
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001986 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001987
Tobin Ehlisec598302015-09-15 15:02:17 -06001988 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001989
1990 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001991 VkImage image;
1992 VkDeviceMemory mem;
1993 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001994
Karl Schultz6addd812016-02-02 17:17:23 -07001995 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1996 const int32_t tex_width = 32;
1997 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001998
1999 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002000 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2001 image_create_info.pNext = NULL;
2002 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2003 image_create_info.format = tex_format;
2004 image_create_info.extent.width = tex_width;
2005 image_create_info.extent.height = tex_height;
2006 image_create_info.extent.depth = 1;
2007 image_create_info.mipLevels = 1;
2008 image_create_info.arrayLayers = 1;
2009 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2010 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2011 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2012 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002013
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002014 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002015 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2016 mem_alloc.pNext = NULL;
2017 mem_alloc.allocationSize = 0;
2018 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002019
Chia-I Wuf7458c52015-10-26 21:10:41 +08002020 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002021 ASSERT_VK_SUCCESS(err);
2022
Karl Schultz6addd812016-02-02 17:17:23 -07002023 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002024
2025 mem_alloc.allocationSize = mem_reqs.size;
2026
Karl Schultz6addd812016-02-02 17:17:23 -07002027 pass =
2028 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002029 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002030
2031 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002032 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002033 ASSERT_VK_SUCCESS(err);
2034
2035 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002036 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002037
2038 // Try to bind free memory that has been freed
2039 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2040 // This may very well return an error.
2041 (void)err;
2042
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002043 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002044
Chia-I Wuf7458c52015-10-26 21:10:41 +08002045 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002046}
2047
Karl Schultz6addd812016-02-02 17:17:23 -07002048TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2049 VkResult err;
2050 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002051
Karl Schultz6addd812016-02-02 17:17:23 -07002052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2053 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002054
Tobin Ehlisec598302015-09-15 15:02:17 -06002055 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002056
Karl Schultz6addd812016-02-02 17:17:23 -07002057 // Create an image object, allocate memory, destroy the object and then try
2058 // to bind it
2059 VkImage image;
2060 VkDeviceMemory mem;
2061 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002062
Karl Schultz6addd812016-02-02 17:17:23 -07002063 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2064 const int32_t tex_width = 32;
2065 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002066
2067 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002068 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2069 image_create_info.pNext = NULL;
2070 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2071 image_create_info.format = tex_format;
2072 image_create_info.extent.width = tex_width;
2073 image_create_info.extent.height = tex_height;
2074 image_create_info.extent.depth = 1;
2075 image_create_info.mipLevels = 1;
2076 image_create_info.arrayLayers = 1;
2077 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2078 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2079 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2080 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002081
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002082 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002083 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2084 mem_alloc.pNext = NULL;
2085 mem_alloc.allocationSize = 0;
2086 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002087
Chia-I Wuf7458c52015-10-26 21:10:41 +08002088 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002089 ASSERT_VK_SUCCESS(err);
2090
Karl Schultz6addd812016-02-02 17:17:23 -07002091 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002092
2093 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002094 pass =
2095 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002096 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002097
2098 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002099 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002100 ASSERT_VK_SUCCESS(err);
2101
2102 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002103 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002104 ASSERT_VK_SUCCESS(err);
2105
2106 // Now Try to bind memory to this destroyed object
2107 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2108 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002109 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002110
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002111 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002112
Chia-I Wuf7458c52015-10-26 21:10:41 +08002113 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002114}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002115
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002116#endif // OBJ_TRACKER_TESTS
2117
Tobin Ehlis0788f522015-05-26 16:11:58 -06002118#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002119
2120// This is a positive test. No errors should be generated.
2121TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
2122
2123 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2124 "submitted on separate queues followed by a QueueWaitIdle.");
2125
Dustin Graves48458142016-04-29 16:11:55 -06002126 if ((m_device->queue_props.empty()) ||
2127 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002128 return;
2129
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002130 m_errorMonitor->ExpectSuccess();
2131
2132 VkSemaphore semaphore;
2133 VkSemaphoreCreateInfo semaphore_create_info{};
2134 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2135 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2136 &semaphore);
2137
2138 VkCommandPool command_pool;
2139 VkCommandPoolCreateInfo pool_create_info{};
2140 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2141 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2142 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2143 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2144 &command_pool);
2145
2146 VkCommandBuffer command_buffer[2];
2147 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2148 command_buffer_allocate_info.sType =
2149 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2150 command_buffer_allocate_info.commandPool = command_pool;
2151 command_buffer_allocate_info.commandBufferCount = 2;
2152 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2153 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2154 command_buffer);
2155
2156 VkQueue queue = VK_NULL_HANDLE;
2157 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2158 1, &queue);
2159
2160 {
2161 VkCommandBufferBeginInfo begin_info{};
2162 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2163 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2164
2165 vkCmdPipelineBarrier(command_buffer[0],
2166 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2167 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2168 0, nullptr, 0, nullptr);
2169
2170 VkViewport viewport{};
2171 viewport.maxDepth = 1.0f;
2172 viewport.minDepth = 0.0f;
2173 viewport.width = 512;
2174 viewport.height = 512;
2175 viewport.x = 0;
2176 viewport.y = 0;
2177 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2178 vkEndCommandBuffer(command_buffer[0]);
2179 }
2180 {
2181 VkCommandBufferBeginInfo begin_info{};
2182 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2183 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2184
2185 VkViewport viewport{};
2186 viewport.maxDepth = 1.0f;
2187 viewport.minDepth = 0.0f;
2188 viewport.width = 512;
2189 viewport.height = 512;
2190 viewport.x = 0;
2191 viewport.y = 0;
2192 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2193 vkEndCommandBuffer(command_buffer[1]);
2194 }
2195 {
2196 VkSubmitInfo submit_info{};
2197 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2198 submit_info.commandBufferCount = 1;
2199 submit_info.pCommandBuffers = &command_buffer[0];
2200 submit_info.signalSemaphoreCount = 1;
2201 submit_info.pSignalSemaphores = &semaphore;
2202 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2203 }
2204 {
2205 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2206 VkSubmitInfo submit_info{};
2207 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2208 submit_info.commandBufferCount = 1;
2209 submit_info.pCommandBuffers = &command_buffer[1];
2210 submit_info.waitSemaphoreCount = 1;
2211 submit_info.pWaitSemaphores = &semaphore;
2212 submit_info.pWaitDstStageMask = flags;
2213 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2214 }
2215
2216 vkQueueWaitIdle(m_device->m_queue);
2217
2218 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2219 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2220 &command_buffer[0]);
2221 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2222
2223 m_errorMonitor->VerifyNotFound();
2224}
2225
2226// This is a positive test. No errors should be generated.
2227TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
2228
2229 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2230 "submitted on separate queues, the second having a fence"
2231 "followed by a QueueWaitIdle.");
2232
Dustin Graves48458142016-04-29 16:11:55 -06002233 if ((m_device->queue_props.empty()) ||
2234 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002235 return;
2236
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002237 m_errorMonitor->ExpectSuccess();
2238
2239 VkFence fence;
2240 VkFenceCreateInfo fence_create_info{};
2241 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2242 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2243
2244 VkSemaphore semaphore;
2245 VkSemaphoreCreateInfo semaphore_create_info{};
2246 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2247 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2248 &semaphore);
2249
2250 VkCommandPool command_pool;
2251 VkCommandPoolCreateInfo pool_create_info{};
2252 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2253 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2254 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2255 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2256 &command_pool);
2257
2258 VkCommandBuffer command_buffer[2];
2259 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2260 command_buffer_allocate_info.sType =
2261 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2262 command_buffer_allocate_info.commandPool = command_pool;
2263 command_buffer_allocate_info.commandBufferCount = 2;
2264 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2265 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2266 command_buffer);
2267
2268 VkQueue queue = VK_NULL_HANDLE;
2269 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2270 1, &queue);
2271
2272 {
2273 VkCommandBufferBeginInfo begin_info{};
2274 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2275 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2276
2277 vkCmdPipelineBarrier(command_buffer[0],
2278 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2279 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2280 0, nullptr, 0, nullptr);
2281
2282 VkViewport viewport{};
2283 viewport.maxDepth = 1.0f;
2284 viewport.minDepth = 0.0f;
2285 viewport.width = 512;
2286 viewport.height = 512;
2287 viewport.x = 0;
2288 viewport.y = 0;
2289 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2290 vkEndCommandBuffer(command_buffer[0]);
2291 }
2292 {
2293 VkCommandBufferBeginInfo begin_info{};
2294 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2295 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2296
2297 VkViewport viewport{};
2298 viewport.maxDepth = 1.0f;
2299 viewport.minDepth = 0.0f;
2300 viewport.width = 512;
2301 viewport.height = 512;
2302 viewport.x = 0;
2303 viewport.y = 0;
2304 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2305 vkEndCommandBuffer(command_buffer[1]);
2306 }
2307 {
2308 VkSubmitInfo submit_info{};
2309 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2310 submit_info.commandBufferCount = 1;
2311 submit_info.pCommandBuffers = &command_buffer[0];
2312 submit_info.signalSemaphoreCount = 1;
2313 submit_info.pSignalSemaphores = &semaphore;
2314 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2315 }
2316 {
2317 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2318 VkSubmitInfo submit_info{};
2319 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2320 submit_info.commandBufferCount = 1;
2321 submit_info.pCommandBuffers = &command_buffer[1];
2322 submit_info.waitSemaphoreCount = 1;
2323 submit_info.pWaitSemaphores = &semaphore;
2324 submit_info.pWaitDstStageMask = flags;
2325 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2326 }
2327
2328 vkQueueWaitIdle(m_device->m_queue);
2329
2330 vkDestroyFence(m_device->device(), fence, nullptr);
2331 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2332 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2333 &command_buffer[0]);
2334 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2335
2336 m_errorMonitor->VerifyNotFound();
2337}
2338
2339// This is a positive test. No errors should be generated.
2340TEST_F(VkLayerTest,
2341 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
2342
2343 TEST_DESCRIPTION(
2344 "Two command buffers, each in a separate QueueSubmit call "
2345 "submitted on separate queues, the second having a fence"
2346 "followed by two consecutive WaitForFences calls on the same fence.");
2347
Dustin Graves48458142016-04-29 16:11:55 -06002348 if ((m_device->queue_props.empty()) ||
2349 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002350 return;
2351
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002352 m_errorMonitor->ExpectSuccess();
2353
2354 VkFence fence;
2355 VkFenceCreateInfo fence_create_info{};
2356 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2357 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2358
2359 VkSemaphore semaphore;
2360 VkSemaphoreCreateInfo semaphore_create_info{};
2361 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2362 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2363 &semaphore);
2364
2365 VkCommandPool command_pool;
2366 VkCommandPoolCreateInfo pool_create_info{};
2367 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2368 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2369 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2370 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2371 &command_pool);
2372
2373 VkCommandBuffer command_buffer[2];
2374 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2375 command_buffer_allocate_info.sType =
2376 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2377 command_buffer_allocate_info.commandPool = command_pool;
2378 command_buffer_allocate_info.commandBufferCount = 2;
2379 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2380 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2381 command_buffer);
2382
2383 VkQueue queue = VK_NULL_HANDLE;
2384 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2385 1, &queue);
2386
2387 {
2388 VkCommandBufferBeginInfo begin_info{};
2389 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2390 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2391
2392 vkCmdPipelineBarrier(command_buffer[0],
2393 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2394 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2395 0, nullptr, 0, nullptr);
2396
2397 VkViewport viewport{};
2398 viewport.maxDepth = 1.0f;
2399 viewport.minDepth = 0.0f;
2400 viewport.width = 512;
2401 viewport.height = 512;
2402 viewport.x = 0;
2403 viewport.y = 0;
2404 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2405 vkEndCommandBuffer(command_buffer[0]);
2406 }
2407 {
2408 VkCommandBufferBeginInfo begin_info{};
2409 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2410 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2411
2412 VkViewport viewport{};
2413 viewport.maxDepth = 1.0f;
2414 viewport.minDepth = 0.0f;
2415 viewport.width = 512;
2416 viewport.height = 512;
2417 viewport.x = 0;
2418 viewport.y = 0;
2419 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2420 vkEndCommandBuffer(command_buffer[1]);
2421 }
2422 {
2423 VkSubmitInfo submit_info{};
2424 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2425 submit_info.commandBufferCount = 1;
2426 submit_info.pCommandBuffers = &command_buffer[0];
2427 submit_info.signalSemaphoreCount = 1;
2428 submit_info.pSignalSemaphores = &semaphore;
2429 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2430 }
2431 {
2432 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2433 VkSubmitInfo submit_info{};
2434 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2435 submit_info.commandBufferCount = 1;
2436 submit_info.pCommandBuffers = &command_buffer[1];
2437 submit_info.waitSemaphoreCount = 1;
2438 submit_info.pWaitSemaphores = &semaphore;
2439 submit_info.pWaitDstStageMask = flags;
2440 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2441 }
2442
2443 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2444 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2445
2446 vkDestroyFence(m_device->device(), fence, nullptr);
2447 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2448 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2449 &command_buffer[0]);
2450 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2451
2452 m_errorMonitor->VerifyNotFound();
2453}
2454
2455// This is a positive test. No errors should be generated.
2456TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
2457
2458 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2459 "submitted on separate queues, the second having a fence, "
2460 "followed by a WaitForFences call.");
2461
Dustin Graves48458142016-04-29 16:11:55 -06002462 if ((m_device->queue_props.empty()) ||
2463 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002464 return;
2465
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002466 m_errorMonitor->ExpectSuccess();
2467
2468 VkFence fence;
2469 VkFenceCreateInfo fence_create_info{};
2470 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2471 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2472
2473 VkSemaphore semaphore;
2474 VkSemaphoreCreateInfo semaphore_create_info{};
2475 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2476 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2477 &semaphore);
2478
2479 VkCommandPool command_pool;
2480 VkCommandPoolCreateInfo pool_create_info{};
2481 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2482 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2483 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2484 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2485 &command_pool);
2486
2487 VkCommandBuffer command_buffer[2];
2488 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2489 command_buffer_allocate_info.sType =
2490 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2491 command_buffer_allocate_info.commandPool = command_pool;
2492 command_buffer_allocate_info.commandBufferCount = 2;
2493 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2494 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2495 command_buffer);
2496
2497 VkQueue queue = VK_NULL_HANDLE;
2498 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2499 1, &queue);
2500
2501
2502 {
2503 VkCommandBufferBeginInfo begin_info{};
2504 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2505 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2506
2507 vkCmdPipelineBarrier(command_buffer[0],
2508 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2509 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2510 0, nullptr, 0, nullptr);
2511
2512 VkViewport viewport{};
2513 viewport.maxDepth = 1.0f;
2514 viewport.minDepth = 0.0f;
2515 viewport.width = 512;
2516 viewport.height = 512;
2517 viewport.x = 0;
2518 viewport.y = 0;
2519 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2520 vkEndCommandBuffer(command_buffer[0]);
2521 }
2522 {
2523 VkCommandBufferBeginInfo begin_info{};
2524 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2525 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2526
2527 VkViewport viewport{};
2528 viewport.maxDepth = 1.0f;
2529 viewport.minDepth = 0.0f;
2530 viewport.width = 512;
2531 viewport.height = 512;
2532 viewport.x = 0;
2533 viewport.y = 0;
2534 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2535 vkEndCommandBuffer(command_buffer[1]);
2536 }
2537 {
2538 VkSubmitInfo submit_info{};
2539 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2540 submit_info.commandBufferCount = 1;
2541 submit_info.pCommandBuffers = &command_buffer[0];
2542 submit_info.signalSemaphoreCount = 1;
2543 submit_info.pSignalSemaphores = &semaphore;
2544 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2545 }
2546 {
2547 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2548 VkSubmitInfo submit_info{};
2549 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2550 submit_info.commandBufferCount = 1;
2551 submit_info.pCommandBuffers = &command_buffer[1];
2552 submit_info.waitSemaphoreCount = 1;
2553 submit_info.pWaitSemaphores = &semaphore;
2554 submit_info.pWaitDstStageMask = flags;
2555 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2556 }
2557
2558 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2559
2560 vkDestroyFence(m_device->device(), fence, nullptr);
2561 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2562 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2563 &command_buffer[0]);
2564 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2565
2566 m_errorMonitor->VerifyNotFound();
2567}
2568
2569// This is a positive test. No errors should be generated.
2570TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
2571
2572 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2573 "on the same queue, sharing a signal/wait semaphore, the "
2574 "second having a fence, "
2575 "followed by a WaitForFences call.");
2576
2577 m_errorMonitor->ExpectSuccess();
2578
2579 VkFence fence;
2580 VkFenceCreateInfo fence_create_info{};
2581 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2582 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2583
2584 VkSemaphore semaphore;
2585 VkSemaphoreCreateInfo semaphore_create_info{};
2586 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2587 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2588 &semaphore);
2589
2590 VkCommandPool command_pool;
2591 VkCommandPoolCreateInfo pool_create_info{};
2592 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2593 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2594 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2595 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2596 &command_pool);
2597
2598 VkCommandBuffer command_buffer[2];
2599 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2600 command_buffer_allocate_info.sType =
2601 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2602 command_buffer_allocate_info.commandPool = command_pool;
2603 command_buffer_allocate_info.commandBufferCount = 2;
2604 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2605 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2606 command_buffer);
2607
2608 {
2609 VkCommandBufferBeginInfo begin_info{};
2610 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2611 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2612
2613 vkCmdPipelineBarrier(command_buffer[0],
2614 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2615 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2616 0, nullptr, 0, nullptr);
2617
2618 VkViewport viewport{};
2619 viewport.maxDepth = 1.0f;
2620 viewport.minDepth = 0.0f;
2621 viewport.width = 512;
2622 viewport.height = 512;
2623 viewport.x = 0;
2624 viewport.y = 0;
2625 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2626 vkEndCommandBuffer(command_buffer[0]);
2627 }
2628 {
2629 VkCommandBufferBeginInfo begin_info{};
2630 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2631 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2632
2633 VkViewport viewport{};
2634 viewport.maxDepth = 1.0f;
2635 viewport.minDepth = 0.0f;
2636 viewport.width = 512;
2637 viewport.height = 512;
2638 viewport.x = 0;
2639 viewport.y = 0;
2640 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2641 vkEndCommandBuffer(command_buffer[1]);
2642 }
2643 {
2644 VkSubmitInfo submit_info{};
2645 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2646 submit_info.commandBufferCount = 1;
2647 submit_info.pCommandBuffers = &command_buffer[0];
2648 submit_info.signalSemaphoreCount = 1;
2649 submit_info.pSignalSemaphores = &semaphore;
2650 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2651 }
2652 {
2653 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2654 VkSubmitInfo submit_info{};
2655 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2656 submit_info.commandBufferCount = 1;
2657 submit_info.pCommandBuffers = &command_buffer[1];
2658 submit_info.waitSemaphoreCount = 1;
2659 submit_info.pWaitSemaphores = &semaphore;
2660 submit_info.pWaitDstStageMask = flags;
2661 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2662 }
2663
2664 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2665
2666 vkDestroyFence(m_device->device(), fence, nullptr);
2667 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2668 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2669 &command_buffer[0]);
2670 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2671
2672 m_errorMonitor->VerifyNotFound();
2673}
2674
2675// This is a positive test. No errors should be generated.
2676TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
2677
2678 TEST_DESCRIPTION(
2679 "Two command buffers, each in a separate QueueSubmit call "
2680 "on the same queue, no fences, followed by a third QueueSubmit with NO "
2681 "SubmitInfos but with a fence, followed by a WaitForFences call.");
2682
2683 m_errorMonitor->ExpectSuccess();
2684
2685 VkFence fence;
2686 VkFenceCreateInfo fence_create_info{};
2687 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2688 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2689
2690 VkCommandPool command_pool;
2691 VkCommandPoolCreateInfo pool_create_info{};
2692 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2693 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2694 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2695 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2696 &command_pool);
2697
2698 VkCommandBuffer command_buffer[2];
2699 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2700 command_buffer_allocate_info.sType =
2701 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2702 command_buffer_allocate_info.commandPool = command_pool;
2703 command_buffer_allocate_info.commandBufferCount = 2;
2704 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2705 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2706 command_buffer);
2707
2708 {
2709 VkCommandBufferBeginInfo begin_info{};
2710 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2711 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2712
2713 vkCmdPipelineBarrier(command_buffer[0],
2714 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2715 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2716 0, nullptr, 0, nullptr);
2717
2718 VkViewport viewport{};
2719 viewport.maxDepth = 1.0f;
2720 viewport.minDepth = 0.0f;
2721 viewport.width = 512;
2722 viewport.height = 512;
2723 viewport.x = 0;
2724 viewport.y = 0;
2725 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2726 vkEndCommandBuffer(command_buffer[0]);
2727 }
2728 {
2729 VkCommandBufferBeginInfo begin_info{};
2730 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2731 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2732
2733 VkViewport viewport{};
2734 viewport.maxDepth = 1.0f;
2735 viewport.minDepth = 0.0f;
2736 viewport.width = 512;
2737 viewport.height = 512;
2738 viewport.x = 0;
2739 viewport.y = 0;
2740 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2741 vkEndCommandBuffer(command_buffer[1]);
2742 }
2743 {
2744 VkSubmitInfo submit_info{};
2745 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2746 submit_info.commandBufferCount = 1;
2747 submit_info.pCommandBuffers = &command_buffer[0];
2748 submit_info.signalSemaphoreCount = 0;
2749 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2750 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2751 }
2752 {
2753 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2754 VkSubmitInfo submit_info{};
2755 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2756 submit_info.commandBufferCount = 1;
2757 submit_info.pCommandBuffers = &command_buffer[1];
2758 submit_info.waitSemaphoreCount = 0;
2759 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2760 submit_info.pWaitDstStageMask = flags;
2761 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2762 }
2763
2764 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
2765
2766 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2767
2768 vkDestroyFence(m_device->device(), fence, nullptr);
2769 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2770 &command_buffer[0]);
2771 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2772
2773 m_errorMonitor->VerifyNotFound();
2774}
2775
2776// This is a positive test. No errors should be generated.
2777TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
2778
2779 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2780 "on the same queue, the second having a fence, followed "
2781 "by a WaitForFences call.");
2782
2783 m_errorMonitor->ExpectSuccess();
2784
2785 VkFence fence;
2786 VkFenceCreateInfo fence_create_info{};
2787 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2788 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2789
2790 VkCommandPool command_pool;
2791 VkCommandPoolCreateInfo pool_create_info{};
2792 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2793 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2794 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2795 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2796 &command_pool);
2797
2798 VkCommandBuffer command_buffer[2];
2799 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2800 command_buffer_allocate_info.sType =
2801 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2802 command_buffer_allocate_info.commandPool = command_pool;
2803 command_buffer_allocate_info.commandBufferCount = 2;
2804 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2805 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2806 command_buffer);
2807
2808 {
2809 VkCommandBufferBeginInfo begin_info{};
2810 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2811 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2812
2813 vkCmdPipelineBarrier(command_buffer[0],
2814 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2815 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2816 0, nullptr, 0, nullptr);
2817
2818 VkViewport viewport{};
2819 viewport.maxDepth = 1.0f;
2820 viewport.minDepth = 0.0f;
2821 viewport.width = 512;
2822 viewport.height = 512;
2823 viewport.x = 0;
2824 viewport.y = 0;
2825 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2826 vkEndCommandBuffer(command_buffer[0]);
2827 }
2828 {
2829 VkCommandBufferBeginInfo begin_info{};
2830 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2831 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2832
2833 VkViewport viewport{};
2834 viewport.maxDepth = 1.0f;
2835 viewport.minDepth = 0.0f;
2836 viewport.width = 512;
2837 viewport.height = 512;
2838 viewport.x = 0;
2839 viewport.y = 0;
2840 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2841 vkEndCommandBuffer(command_buffer[1]);
2842 }
2843 {
2844 VkSubmitInfo submit_info{};
2845 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2846 submit_info.commandBufferCount = 1;
2847 submit_info.pCommandBuffers = &command_buffer[0];
2848 submit_info.signalSemaphoreCount = 0;
2849 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2850 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2851 }
2852 {
2853 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2854 VkSubmitInfo submit_info{};
2855 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2856 submit_info.commandBufferCount = 1;
2857 submit_info.pCommandBuffers = &command_buffer[1];
2858 submit_info.waitSemaphoreCount = 0;
2859 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2860 submit_info.pWaitDstStageMask = flags;
2861 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2862 }
2863
2864 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2865
2866 vkDestroyFence(m_device->device(), fence, nullptr);
2867 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2868 &command_buffer[0]);
2869 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2870
2871 m_errorMonitor->VerifyNotFound();
2872}
2873
2874// This is a positive test. No errors should be generated.
2875TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
2876
2877 TEST_DESCRIPTION(
2878 "Two command buffers each in a separate SubmitInfo sent in a single "
2879 "QueueSubmit call followed by a WaitForFences call.");
2880
2881 m_errorMonitor->ExpectSuccess();
2882
2883 VkFence fence;
2884 VkFenceCreateInfo fence_create_info{};
2885 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2886 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2887
2888 VkSemaphore semaphore;
2889 VkSemaphoreCreateInfo semaphore_create_info{};
2890 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2891 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2892 &semaphore);
2893
2894 VkCommandPool command_pool;
2895 VkCommandPoolCreateInfo pool_create_info{};
2896 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2897 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2898 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2899 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2900 &command_pool);
2901
2902 VkCommandBuffer command_buffer[2];
2903 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2904 command_buffer_allocate_info.sType =
2905 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2906 command_buffer_allocate_info.commandPool = command_pool;
2907 command_buffer_allocate_info.commandBufferCount = 2;
2908 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2909 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2910 command_buffer);
2911
2912 {
2913 VkCommandBufferBeginInfo begin_info{};
2914 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2915 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2916
2917 vkCmdPipelineBarrier(command_buffer[0],
2918 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2919 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2920 0, nullptr, 0, nullptr);
2921
2922 VkViewport viewport{};
2923 viewport.maxDepth = 1.0f;
2924 viewport.minDepth = 0.0f;
2925 viewport.width = 512;
2926 viewport.height = 512;
2927 viewport.x = 0;
2928 viewport.y = 0;
2929 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2930 vkEndCommandBuffer(command_buffer[0]);
2931 }
2932 {
2933 VkCommandBufferBeginInfo begin_info{};
2934 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2935 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2936
2937 VkViewport viewport{};
2938 viewport.maxDepth = 1.0f;
2939 viewport.minDepth = 0.0f;
2940 viewport.width = 512;
2941 viewport.height = 512;
2942 viewport.x = 0;
2943 viewport.y = 0;
2944 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2945 vkEndCommandBuffer(command_buffer[1]);
2946 }
2947 {
2948 VkSubmitInfo submit_info[2];
2949 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2950
2951 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2952 submit_info[0].pNext = NULL;
2953 submit_info[0].commandBufferCount = 1;
2954 submit_info[0].pCommandBuffers = &command_buffer[0];
2955 submit_info[0].signalSemaphoreCount = 1;
2956 submit_info[0].pSignalSemaphores = &semaphore;
2957 submit_info[0].waitSemaphoreCount = 0;
2958 submit_info[0].pWaitSemaphores = NULL;
2959 submit_info[0].pWaitDstStageMask = 0;
2960
2961 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2962 submit_info[1].pNext = NULL;
2963 submit_info[1].commandBufferCount = 1;
2964 submit_info[1].pCommandBuffers = &command_buffer[1];
2965 submit_info[1].waitSemaphoreCount = 1;
2966 submit_info[1].pWaitSemaphores = &semaphore;
2967 submit_info[1].pWaitDstStageMask = flags;
2968 submit_info[1].signalSemaphoreCount = 0;
2969 submit_info[1].pSignalSemaphores = NULL;
2970 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
2971 }
2972
2973 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2974
2975 vkDestroyFence(m_device->device(), fence, nullptr);
2976 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2977 &command_buffer[0]);
2978 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2979
2980 m_errorMonitor->VerifyNotFound();
2981}
2982
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002983TEST_F(VkLayerTest, DynamicStatesNotBound) {
2984 TEST_DESCRIPTION(
2985 "Run a series of simple draw calls to validate all the different "
2986 "failure cases that can occur when dynamic state is required but not "
2987 "correctly bound."
2988 "Here are the different dynamic state cases verified by this test:\n"
2989 "-Line Width\n-Depth Bias\n-Viewport State\n-Scissor State\n-Blend "
2990 "State\n-Depth Bounds\n-Stencil Read Mask\n-Stencil Write "
2991 "Mask\n-Stencil Reference");
2992
2993 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07002994 m_errorMonitor->SetDesiredFailureMsg(
2995 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002996 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002997 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2998 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002999 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003000 // Dynamic depth bias
Karl Schultz6addd812016-02-02 17:17:23 -07003001 m_errorMonitor->SetDesiredFailureMsg(
3002 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003003 "Dynamic depth bias state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003004 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3005 BsoFailDepthBias);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003006 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003007 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07003008 m_errorMonitor->SetDesiredFailureMsg(
3009 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003010 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003011 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3012 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003013 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003014 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07003015 m_errorMonitor->SetDesiredFailureMsg(
3016 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003017 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003018 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3019 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003020 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003021 // Dynamic blend state
Karl Schultz6addd812016-02-02 17:17:23 -07003022 m_errorMonitor->SetDesiredFailureMsg(
3023 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003024 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003025 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3026 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003027 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003028 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07003029 m_errorMonitor->SetDesiredFailureMsg(
3030 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003031 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003032 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3033 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003034 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003035 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07003036 m_errorMonitor->SetDesiredFailureMsg(
3037 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003038 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003039 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3040 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003041 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003042 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07003043 m_errorMonitor->SetDesiredFailureMsg(
3044 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003045 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003046 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3047 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003048 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06003049}
3050
Karl Schultz6addd812016-02-02 17:17:23 -07003051TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003052 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003053
Karl Schultz6addd812016-02-02 17:17:23 -07003054 m_errorMonitor->SetDesiredFailureMsg(
3055 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3056 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
3057 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003058
3059 VkFenceCreateInfo fenceInfo = {};
3060 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3061 fenceInfo.pNext = NULL;
3062 fenceInfo.flags = 0;
3063
3064 ASSERT_NO_FATAL_FAILURE(InitState());
3065 ASSERT_NO_FATAL_FAILURE(InitViewport());
3066 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3067
Karl Schultz6addd812016-02-02 17:17:23 -07003068 // We luck out b/c by default the framework creates CB w/ the
3069 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003070 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003071 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
3072 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003073 EndCommandBuffer();
3074
3075 testFence.init(*m_device, fenceInfo);
3076
3077 // Bypass framework since it does the waits automatically
3078 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003079 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003080 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3081 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003082 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003083 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003084 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003085 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003086 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003087 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003088 submit_info.pSignalSemaphores = NULL;
3089
Karl Schultz6addd812016-02-02 17:17:23 -07003090 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
3091 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003092
Karl Schultz6addd812016-02-02 17:17:23 -07003093 // Cause validation error by re-submitting cmd buffer that should only be
3094 // submitted once
3095 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003096
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003097 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003098}
3099
Karl Schultz6addd812016-02-02 17:17:23 -07003100TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003101 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07003102 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003103
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003105 "Unable to allocate 1 descriptors of "
3106 "type "
3107 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003108
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003109 ASSERT_NO_FATAL_FAILURE(InitState());
3110 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003111
Karl Schultz6addd812016-02-02 17:17:23 -07003112 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
3113 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003114 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003115 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3116 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003117
3118 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003119 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3120 ds_pool_ci.pNext = NULL;
3121 ds_pool_ci.flags = 0;
3122 ds_pool_ci.maxSets = 1;
3123 ds_pool_ci.poolSizeCount = 1;
3124 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003125
3126 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003127 err =
3128 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003129 ASSERT_VK_SUCCESS(err);
3130
3131 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003132 dsl_binding.binding = 0;
3133 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3134 dsl_binding.descriptorCount = 1;
3135 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3136 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003137
3138 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003139 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3140 ds_layout_ci.pNext = NULL;
3141 ds_layout_ci.bindingCount = 1;
3142 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003143
3144 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003145 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3146 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003147 ASSERT_VK_SUCCESS(err);
3148
3149 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003150 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003151 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003152 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003153 alloc_info.descriptorPool = ds_pool;
3154 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003155 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3156 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003157
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003158 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003159
Chia-I Wuf7458c52015-10-26 21:10:41 +08003160 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3161 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003162}
3163
Karl Schultz6addd812016-02-02 17:17:23 -07003164TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
3165 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06003166
Karl Schultz6addd812016-02-02 17:17:23 -07003167 m_errorMonitor->SetDesiredFailureMsg(
3168 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3169 "It is invalid to call vkFreeDescriptorSets() with a pool created "
3170 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003171
Tobin Ehlise735c692015-10-08 13:13:50 -06003172 ASSERT_NO_FATAL_FAILURE(InitState());
3173 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06003174
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003175 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003176 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3177 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06003178
3179 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003180 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3181 ds_pool_ci.pNext = NULL;
3182 ds_pool_ci.maxSets = 1;
3183 ds_pool_ci.poolSizeCount = 1;
3184 ds_pool_ci.flags = 0;
3185 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
3186 // app can only call vkResetDescriptorPool on this pool.;
3187 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06003188
3189 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003190 err =
3191 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06003192 ASSERT_VK_SUCCESS(err);
3193
3194 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003195 dsl_binding.binding = 0;
3196 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3197 dsl_binding.descriptorCount = 1;
3198 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3199 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06003200
3201 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003202 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3203 ds_layout_ci.pNext = NULL;
3204 ds_layout_ci.bindingCount = 1;
3205 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06003206
3207 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003208 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3209 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06003210 ASSERT_VK_SUCCESS(err);
3211
3212 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003213 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003214 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003215 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003216 alloc_info.descriptorPool = ds_pool;
3217 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003218 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3219 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06003220 ASSERT_VK_SUCCESS(err);
3221
3222 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003223 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06003224
Chia-I Wuf7458c52015-10-26 21:10:41 +08003225 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3226 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06003227}
3228
Karl Schultz6addd812016-02-02 17:17:23 -07003229TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003230 // Attempt to clear Descriptor Pool with bad object.
3231 // ObjectTracker should catch this.
3232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3233 "Invalid VkDescriptorPool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003234 uint64_t fake_pool_handle = 0xbaad6001;
3235 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
3236 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06003237 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003238}
3239
Karl Schultz6addd812016-02-02 17:17:23 -07003240TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003241 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
3242 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003243 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06003244 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003245
3246 uint64_t fake_set_handle = 0xbaad6001;
3247 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003248 VkResult err;
3249 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3250 "Invalid VkDescriptorSet Object 0xbaad6001");
3251
3252 ASSERT_NO_FATAL_FAILURE(InitState());
3253
3254 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
3255 layout_bindings[0].binding = 0;
3256 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3257 layout_bindings[0].descriptorCount = 1;
3258 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3259 layout_bindings[0].pImmutableSamplers = NULL;
3260
3261 VkDescriptorSetLayout descriptor_set_layout;
3262 VkDescriptorSetLayoutCreateInfo dslci = {};
3263 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3264 dslci.pNext = NULL;
3265 dslci.bindingCount = 1;
3266 dslci.pBindings = layout_bindings;
3267 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003268 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003269
3270 VkPipelineLayout pipeline_layout;
3271 VkPipelineLayoutCreateInfo plci = {};
3272 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3273 plci.pNext = NULL;
3274 plci.setLayoutCount = 1;
3275 plci.pSetLayouts = &descriptor_set_layout;
3276 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003277 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003278
3279 BeginCommandBuffer();
3280 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003281 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06003282 m_errorMonitor->VerifyFound();
3283 EndCommandBuffer();
3284 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
3285 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003286}
3287
Karl Schultz6addd812016-02-02 17:17:23 -07003288TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003289 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
3290 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003291 uint64_t fake_layout_handle = 0xbaad6001;
3292 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3294 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
3295
3296 VkPipelineLayout pipeline_layout;
3297 VkPipelineLayoutCreateInfo plci = {};
3298 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3299 plci.pNext = NULL;
3300 plci.setLayoutCount = 1;
3301 plci.pSetLayouts = &bad_layout;
3302 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
3303
3304 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003305}
3306
Karl Schultz6addd812016-02-02 17:17:23 -07003307TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003308 // Attempt to bind an invalid Pipeline to a valid Command Buffer
3309 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003310 // Create a valid cmd buffer
3311 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003312 uint64_t fake_pipeline_handle = 0xbaad6001;
3313 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3315 "Invalid VkPipeline Object 0xbaad6001");
3316 ASSERT_NO_FATAL_FAILURE(InitState());
3317 BeginCommandBuffer();
3318 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3319 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
3320 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06003321
3322 // Now issue a draw call with no pipeline bound
3323 m_errorMonitor->SetDesiredFailureMsg(
3324 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3325 "At Draw/Dispatch time no valid VkPipeline is bound!");
3326 ASSERT_NO_FATAL_FAILURE(InitState());
3327 BeginCommandBuffer();
3328 Draw(1, 0, 0, 0);
3329 m_errorMonitor->VerifyFound();
3330 // Finally same check once more but with Dispatch/Compute
3331 m_errorMonitor->SetDesiredFailureMsg(
3332 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3333 "At Draw/Dispatch time no valid VkPipeline is bound!");
3334 ASSERT_NO_FATAL_FAILURE(InitState());
3335 BeginCommandBuffer();
3336 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
3337 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003338}
3339
Karl Schultz6addd812016-02-02 17:17:23 -07003340TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
3341 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
3342 // CommandBuffer
3343 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003344
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003346 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003347
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003348 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06003349 ASSERT_NO_FATAL_FAILURE(InitViewport());
3350 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003351 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003352 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3353 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003354
3355 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003356 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3357 ds_pool_ci.pNext = NULL;
3358 ds_pool_ci.maxSets = 1;
3359 ds_pool_ci.poolSizeCount = 1;
3360 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06003361
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003362 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003363 err =
3364 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003365 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003366
Tony Barboureb254902015-07-15 12:50:33 -06003367 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003368 dsl_binding.binding = 0;
3369 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3370 dsl_binding.descriptorCount = 1;
3371 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3372 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003373
Tony Barboureb254902015-07-15 12:50:33 -06003374 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003375 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3376 ds_layout_ci.pNext = NULL;
3377 ds_layout_ci.bindingCount = 1;
3378 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003379 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003380 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3381 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003382 ASSERT_VK_SUCCESS(err);
3383
3384 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003385 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003386 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003387 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003388 alloc_info.descriptorPool = ds_pool;
3389 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003390 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3391 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003392 ASSERT_VK_SUCCESS(err);
3393
Tony Barboureb254902015-07-15 12:50:33 -06003394 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003395 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3396 pipeline_layout_ci.pNext = NULL;
3397 pipeline_layout_ci.setLayoutCount = 1;
3398 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003399
3400 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003401 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3402 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003403 ASSERT_VK_SUCCESS(err);
3404
Karl Schultz6addd812016-02-02 17:17:23 -07003405 VkShaderObj vs(m_device, bindStateVertShaderText,
3406 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06003407 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07003408 // on more devices
3409 VkShaderObj fs(m_device, bindStateFragShaderText,
3410 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003411
Tony Barbourc95e4ac2015-08-04 17:05:26 -06003412 VkPipelineObj pipe(m_device);
3413 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06003414 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06003415 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06003416 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06003417
3418 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003419 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3420 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3421 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3422 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3423 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003424
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003425 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003426
Chia-I Wuf7458c52015-10-26 21:10:41 +08003427 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3428 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3429 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003430}
3431
Karl Schultz6addd812016-02-02 17:17:23 -07003432TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003433 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07003434 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003435
Karl Schultz6addd812016-02-02 17:17:23 -07003436 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003437 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
3438 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003439
3440 ASSERT_NO_FATAL_FAILURE(InitState());
3441 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003442 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3443 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003444
3445 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003446 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3447 ds_pool_ci.pNext = NULL;
3448 ds_pool_ci.maxSets = 1;
3449 ds_pool_ci.poolSizeCount = 1;
3450 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003451
3452 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003453 err =
3454 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003455 ASSERT_VK_SUCCESS(err);
3456
3457 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003458 dsl_binding.binding = 0;
3459 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3460 dsl_binding.descriptorCount = 1;
3461 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3462 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003463
3464 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003465 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3466 ds_layout_ci.pNext = NULL;
3467 ds_layout_ci.bindingCount = 1;
3468 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003469 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003470 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3471 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003472 ASSERT_VK_SUCCESS(err);
3473
3474 VkDescriptorSet descriptorSet;
3475 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003476 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003477 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003478 alloc_info.descriptorPool = ds_pool;
3479 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003480 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3481 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003482 ASSERT_VK_SUCCESS(err);
3483
Karl Schultz6addd812016-02-02 17:17:23 -07003484 VkBufferView view =
3485 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003486 VkWriteDescriptorSet descriptor_write;
3487 memset(&descriptor_write, 0, sizeof(descriptor_write));
3488 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3489 descriptor_write.dstSet = descriptorSet;
3490 descriptor_write.dstBinding = 0;
3491 descriptor_write.descriptorCount = 1;
3492 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3493 descriptor_write.pTexelBufferView = &view;
3494
3495 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3496
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003497 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003498
3499 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3500 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3501}
3502
Karl Schultz6addd812016-02-02 17:17:23 -07003503TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
3504 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
3505 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07003506 // 1. No dynamicOffset supplied
3507 // 2. Too many dynamicOffsets supplied
3508 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07003509 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003511 " requires 1 dynamicOffsets, but only "
3512 "0 dynamicOffsets are left in "
3513 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003514
3515 ASSERT_NO_FATAL_FAILURE(InitState());
3516 ASSERT_NO_FATAL_FAILURE(InitViewport());
3517 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3518
3519 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003520 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3521 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003522
3523 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003524 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3525 ds_pool_ci.pNext = NULL;
3526 ds_pool_ci.maxSets = 1;
3527 ds_pool_ci.poolSizeCount = 1;
3528 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003529
3530 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003531 err =
3532 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003533 ASSERT_VK_SUCCESS(err);
3534
3535 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003536 dsl_binding.binding = 0;
3537 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3538 dsl_binding.descriptorCount = 1;
3539 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3540 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003541
3542 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003543 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3544 ds_layout_ci.pNext = NULL;
3545 ds_layout_ci.bindingCount = 1;
3546 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003547 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003548 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3549 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003550 ASSERT_VK_SUCCESS(err);
3551
3552 VkDescriptorSet descriptorSet;
3553 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003554 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003555 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003556 alloc_info.descriptorPool = ds_pool;
3557 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003558 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3559 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003560 ASSERT_VK_SUCCESS(err);
3561
3562 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003563 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3564 pipeline_layout_ci.pNext = NULL;
3565 pipeline_layout_ci.setLayoutCount = 1;
3566 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003567
3568 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003569 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3570 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003571 ASSERT_VK_SUCCESS(err);
3572
3573 // Create a buffer to update the descriptor with
3574 uint32_t qfi = 0;
3575 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003576 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3577 buffCI.size = 1024;
3578 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3579 buffCI.queueFamilyIndexCount = 1;
3580 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003581
3582 VkBuffer dyub;
3583 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3584 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003585 // Allocate memory and bind to buffer so we can make it to the appropriate
3586 // error
3587 VkMemoryAllocateInfo mem_alloc = {};
3588 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3589 mem_alloc.pNext = NULL;
3590 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12003591 mem_alloc.memoryTypeIndex = 0;
3592
3593 VkMemoryRequirements memReqs;
3594 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
3595 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
3596 0);
3597 if (!pass) {
3598 vkDestroyBuffer(m_device->device(), dyub, NULL);
3599 return;
3600 }
3601
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003602 VkDeviceMemory mem;
3603 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3604 ASSERT_VK_SUCCESS(err);
3605 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
3606 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003607 // Correctly update descriptor to avoid "NOT_UPDATED" error
3608 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003609 buffInfo.buffer = dyub;
3610 buffInfo.offset = 0;
3611 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003612
3613 VkWriteDescriptorSet descriptor_write;
3614 memset(&descriptor_write, 0, sizeof(descriptor_write));
3615 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3616 descriptor_write.dstSet = descriptorSet;
3617 descriptor_write.dstBinding = 0;
3618 descriptor_write.descriptorCount = 1;
3619 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3620 descriptor_write.pBufferInfo = &buffInfo;
3621
3622 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3623
3624 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003625 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3626 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3627 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003628 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003629 uint32_t pDynOff[2] = {512, 756};
3630 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07003631 m_errorMonitor->SetDesiredFailureMsg(
3632 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07003633 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07003634 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3635 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3636 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12003637 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003638 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003639 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3640 " dynamic offset 512 combined with "
3641 "offset 0 and range 1024 that "
3642 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07003643 // Create PSO to be used for draw-time errors below
3644 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003645 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003646 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003647 "out gl_PerVertex { \n"
3648 " vec4 gl_Position;\n"
3649 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003650 "void main(){\n"
3651 " gl_Position = vec4(1);\n"
3652 "}\n";
3653 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003654 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003655 "\n"
3656 "layout(location=0) out vec4 x;\n"
3657 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3658 "void main(){\n"
3659 " x = vec4(bar.y);\n"
3660 "}\n";
3661 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3662 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3663 VkPipelineObj pipe(m_device);
3664 pipe.AddShader(&vs);
3665 pipe.AddShader(&fs);
3666 pipe.AddColorAttachment();
3667 pipe.CreateVKPipeline(pipeline_layout, renderPass());
3668
Karl Schultz6addd812016-02-02 17:17:23 -07003669 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3670 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3671 // This update should succeed, but offset size of 512 will overstep buffer
3672 // /w range 1024 & size 1024
3673 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3674 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3675 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07003676 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003677 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003678
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003679 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06003680 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003681
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003682 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3683 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3684}
3685
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003686TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003687 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003688 ASSERT_NO_FATAL_FAILURE(InitState());
3689 ASSERT_NO_FATAL_FAILURE(InitViewport());
3690 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3691
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003692 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003693 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003694 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3695 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3696 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3697 pipeline_layout_ci.pushConstantRangeCount = 1;
3698 pipeline_layout_ci.pPushConstantRanges = &pc_range;
3699
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003700 //
3701 // Check for invalid push constant ranges in pipeline layouts.
3702 //
3703 struct PipelineLayoutTestCase {
3704 uint32_t const offset;
3705 uint32_t const size;
3706 char const *msg;
3707 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003708
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003709 const uint32_t tooBig = m_device->props.limits.maxPushConstantsSize + 0x4;
3710 const std::array<PipelineLayoutTestCase, 10> rangeTests = {{
3711 {0, 0, "vkCreatePipelineLayout() call has push constants index 0 with "
3712 "size 0."},
3713 {0, 1, "vkCreatePipelineLayout() call has push constants index 0 with "
3714 "size 1."},
3715 {1, 1, "vkCreatePipelineLayout() call has push constants index 0 with "
3716 "size 1."},
3717 {1, 0, "vkCreatePipelineLayout() call has push constants index 0 with "
3718 "size 0."},
3719 {1, 4, "vkCreatePipelineLayout() call has push constants index 0 with "
3720 "offset 1. Offset must"},
3721 {0, tooBig, "vkCreatePipelineLayout() call has push constants index 0 "
3722 "with offset "},
3723 {tooBig, tooBig, "vkCreatePipelineLayout() call has push constants "
3724 "index 0 with offset "},
3725 {tooBig, 0, "vkCreatePipelineLayout() call has push constants index 0 "
3726 "with offset "},
3727 {0xFFFFFFF0, 0x00000020, "vkCreatePipelineLayout() call has push "
3728 "constants index 0 with offset "},
3729 {0x00000020, 0xFFFFFFF0, "vkCreatePipelineLayout() call has push "
3730 "constants index 0 with offset "},
3731 }};
3732
3733 // Check for invalid offset and size
3734 for (const auto &iter : rangeTests) {
3735 pc_range.offset = iter.offset;
3736 pc_range.size = iter.size;
3737 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3738 iter.msg);
3739 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
3740 NULL, &pipeline_layout);
3741 m_errorMonitor->VerifyFound();
3742 if (VK_SUCCESS == err) {
3743 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3744 }
3745 }
3746
3747 // Check for invalid stage flag
3748 pc_range.offset = 0;
3749 pc_range.size = 16;
3750 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003751 m_errorMonitor->SetDesiredFailureMsg(
3752 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003753 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003754 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3755 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003756 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003757 if (VK_SUCCESS == err) {
3758 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3759 }
3760
3761 // Check for overlapping ranges
3762 const uint32_t rangesPerTest = 5;
3763 struct OverlappingRangeTestCase {
3764 VkPushConstantRange ranges[rangesPerTest];
3765 char const *msg;
3766 };
3767
3768 const std::array<OverlappingRangeTestCase, 5> orTests = {
3769 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
3770 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
3771 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
3772 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
3773 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
3774 "vkCreatePipelineLayout() call has push constants with overlapping "
3775 "ranges: 0:[0, 4), 1:[0, 4)"},
3776 {
3777 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
3778 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
3779 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
3780 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
3781 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
3782 "vkCreatePipelineLayout() call has push constants with "
3783 "overlapping "
3784 "ranges: 3:[12, 20), 4:[16, 20)",
3785 },
3786 {
3787 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
3788 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
3789 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
3790 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
3791 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
3792 "vkCreatePipelineLayout() call has push constants with "
3793 "overlapping "
3794 "ranges: 0:[16, 20), 1:[12, 20)",
3795 },
3796 {
3797 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
3798 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
3799 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
3800 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
3801 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
3802 "vkCreatePipelineLayout() call has push constants with "
3803 "overlapping "
3804 "ranges: 0:[16, 20), 3:[12, 20)",
3805 },
3806 {
3807 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
3808 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
3809 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
3810 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
3811 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
3812 "vkCreatePipelineLayout() call has push constants with "
3813 "overlapping "
3814 "ranges: 0:[16, 20), 2:[4, 100)",
3815 }}};
3816 pipeline_layout_ci.pushConstantRangeCount = rangesPerTest;
3817
3818 for (const auto &iter : orTests) {
3819 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
3820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3821 iter.msg);
3822 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
3823 NULL, &pipeline_layout);
3824 m_errorMonitor->VerifyFound();
3825 if (VK_SUCCESS == err) {
3826 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3827 }
3828 }
3829
3830 // Run some positive tests to make sure overlap checking in the layer is OK
3831 const std::array<OverlappingRangeTestCase, 2> orPosTests = {
3832 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
3833 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
3834 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
3835 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
3836 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
3837 ""},
3838 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
3839 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
3840 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
3841 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
3842 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
3843 ""}}};
3844 for (const auto &iter : orPosTests) {
3845 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
3846 m_errorMonitor->ExpectSuccess();
3847 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
3848 NULL, &pipeline_layout);
3849 m_errorMonitor->VerifyNotFound();
3850 if (VK_SUCCESS == err) {
3851 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3852 }
3853 }
3854
3855 //
3856 // CmdPushConstants tests
3857 //
3858
3859 // Check for invalid offset and size and if range is within layout range(s)
3860 std::array<PipelineLayoutTestCase, 13> cmdRangeTests = {{
3861 {0, 0, "vkCmdPushConstants() call has push constants with size 0. Size "
3862 "must be greater than zero and a multiple of 4."},
3863 {0, 1, "vkCmdPushConstants() call has push constants with size 1. Size "
3864 "must be greater than zero and a multiple of 4."},
3865 {1, 1, "vkCmdPushConstants() call has push constants with size 1. Size "
3866 "must be greater than zero and a multiple of 4."},
3867 {1, 0, "vkCmdPushConstants() call has push constants with offset 1. "
3868 "Offset must be a multiple of 4."},
3869 {1, 4, "vkCmdPushConstants() call has push constants with offset 1. "
3870 "Offset must be a multiple of 4."},
3871 {0, 20, "vkCmdPushConstants() Push constant range [0, 20) not within "
3872 "any of the ranges in pipeline layout"},
3873 {60, 8, "vkCmdPushConstants() Push constant range [60, 68) not within "
3874 "any of the ranges in pipeline layout"},
3875 {76, 8, "vkCmdPushConstants() Push constant range [76, 84) not within "
3876 "any of the ranges in pipeline layout"},
3877 {0, tooBig,
3878 "vkCmdPushConstants() call has push constants with offset "},
3879 {tooBig, tooBig,
3880 "vkCmdPushConstants() call has push constants with offset "},
3881 {tooBig, 0,
3882 "vkCmdPushConstants() call has push constants with offset "},
3883 {0xFFFFFFF0, 0x00000020,
3884 "vkCmdPushConstants() call has push constants with offset "},
3885 {0x00000020, 0xFFFFFFF0,
3886 "vkCmdPushConstants() call has push constants with offset "},
3887 }};
3888
3889 // Two ranges for testing robustness
3890 VkPushConstantRange pc_range2[] = {
3891 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
3892 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
3893 };
3894 pipeline_layout_ci.pushConstantRangeCount = 2;
3895 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003896 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3897 &pipeline_layout);
3898 ASSERT_VK_SUCCESS(err);
3899 BeginCommandBuffer();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003900 for (const auto &iter : cmdRangeTests) {
3901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3902 iter.msg);
3903 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
3904 VK_SHADER_STAGE_VERTEX_BIT, iter.offset, iter.size,
3905 NULL);
3906 m_errorMonitor->VerifyFound();
3907 }
3908
3909 // Check for invalid stage flag
3910 m_errorMonitor->SetDesiredFailureMsg(
3911 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3912 "vkCmdPushConstants() call has no stageFlags set.");
3913 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
3914 0, 16, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003915 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06003916
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003917 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3918}
3919
Karl Schultz6addd812016-02-02 17:17:23 -07003920TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003921 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07003922 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003923
3924 ASSERT_NO_FATAL_FAILURE(InitState());
3925 ASSERT_NO_FATAL_FAILURE(InitViewport());
3926 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3927
3928 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
3929 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003930 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3931 ds_type_count[0].descriptorCount = 10;
3932 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3933 ds_type_count[1].descriptorCount = 2;
3934 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3935 ds_type_count[2].descriptorCount = 2;
3936 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
3937 ds_type_count[3].descriptorCount = 5;
3938 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
3939 // type
3940 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3941 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
3942 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003943
3944 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003945 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3946 ds_pool_ci.pNext = NULL;
3947 ds_pool_ci.maxSets = 5;
3948 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
3949 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003950
3951 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003952 err =
3953 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003954 ASSERT_VK_SUCCESS(err);
3955
3956 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
3957 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003958 dsl_binding[0].binding = 0;
3959 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3960 dsl_binding[0].descriptorCount = 5;
3961 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3962 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003963
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003964 // Create layout identical to set0 layout but w/ different stageFlags
3965 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003966 dsl_fs_stage_only.binding = 0;
3967 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3968 dsl_fs_stage_only.descriptorCount = 5;
3969 dsl_fs_stage_only.stageFlags =
3970 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
3971 // bind time
3972 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003973 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003974 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3975 ds_layout_ci.pNext = NULL;
3976 ds_layout_ci.bindingCount = 1;
3977 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003978 static const uint32_t NUM_LAYOUTS = 4;
3979 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003980 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003981 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
3982 // layout for error case
3983 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3984 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003985 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003986 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003987 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3988 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003989 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003990 dsl_binding[0].binding = 0;
3991 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003992 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003993 dsl_binding[1].binding = 1;
3994 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3995 dsl_binding[1].descriptorCount = 2;
3996 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
3997 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003998 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003999 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07004000 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4001 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004002 ASSERT_VK_SUCCESS(err);
4003 dsl_binding[0].binding = 0;
4004 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004005 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004006 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07004007 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4008 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004009 ASSERT_VK_SUCCESS(err);
4010 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004011 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07004012 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4013 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004014 ASSERT_VK_SUCCESS(err);
4015
4016 static const uint32_t NUM_SETS = 4;
4017 VkDescriptorSet descriptorSet[NUM_SETS] = {};
4018 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004019 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004020 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004021 alloc_info.descriptorPool = ds_pool;
4022 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004023 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4024 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004025 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004026 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07004027 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004028 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07004029 err =
4030 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004031 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004032
4033 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004034 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4035 pipeline_layout_ci.pNext = NULL;
4036 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
4037 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004038
4039 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004040 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4041 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004042 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004043 // Create pipelineLayout with only one setLayout
4044 pipeline_layout_ci.setLayoutCount = 1;
4045 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004046 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4047 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004048 ASSERT_VK_SUCCESS(err);
4049 // Create pipelineLayout with 2 descriptor setLayout at index 0
4050 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
4051 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07004052 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4053 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004054 ASSERT_VK_SUCCESS(err);
4055 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
4056 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
4057 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07004058 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4059 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004060 ASSERT_VK_SUCCESS(err);
4061 // Create pipelineLayout with UB type, but stageFlags for FS only
4062 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
4063 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07004064 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4065 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004066 ASSERT_VK_SUCCESS(err);
4067 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
4068 VkDescriptorSetLayout pl_bad_s0[2] = {};
4069 pl_bad_s0[0] = ds_layout_fs_only;
4070 pl_bad_s0[1] = ds_layout[1];
4071 pipeline_layout_ci.setLayoutCount = 2;
4072 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
4073 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07004074 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4075 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004076 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004077
4078 // Create a buffer to update the descriptor with
4079 uint32_t qfi = 0;
4080 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004081 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4082 buffCI.size = 1024;
4083 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4084 buffCI.queueFamilyIndexCount = 1;
4085 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004086
4087 VkBuffer dyub;
4088 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4089 ASSERT_VK_SUCCESS(err);
4090 // Correctly update descriptor to avoid "NOT_UPDATED" error
4091 static const uint32_t NUM_BUFFS = 5;
4092 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004093 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07004094 buffInfo[i].buffer = dyub;
4095 buffInfo[i].offset = 0;
4096 buffInfo[i].range = 1024;
4097 }
Karl Schultz6addd812016-02-02 17:17:23 -07004098 VkImage image;
4099 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4100 const int32_t tex_width = 32;
4101 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004102 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004103 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4104 image_create_info.pNext = NULL;
4105 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4106 image_create_info.format = tex_format;
4107 image_create_info.extent.width = tex_width;
4108 image_create_info.extent.height = tex_height;
4109 image_create_info.extent.depth = 1;
4110 image_create_info.mipLevels = 1;
4111 image_create_info.arrayLayers = 1;
4112 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4113 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4114 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4115 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004116 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
4117 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004118
Karl Schultz6addd812016-02-02 17:17:23 -07004119 VkMemoryRequirements memReqs;
4120 VkDeviceMemory imageMem;
4121 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004122 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004123 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4124 memAlloc.pNext = NULL;
4125 memAlloc.allocationSize = 0;
4126 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004127 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
4128 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07004129 pass =
4130 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004131 ASSERT_TRUE(pass);
4132 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
4133 ASSERT_VK_SUCCESS(err);
4134 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
4135 ASSERT_VK_SUCCESS(err);
4136
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004137 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004138 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4139 image_view_create_info.image = image;
4140 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
4141 image_view_create_info.format = tex_format;
4142 image_view_create_info.subresourceRange.layerCount = 1;
4143 image_view_create_info.subresourceRange.baseMipLevel = 0;
4144 image_view_create_info.subresourceRange.levelCount = 1;
4145 image_view_create_info.subresourceRange.aspectMask =
4146 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004147
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004148 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07004149 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
4150 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004151 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004152 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004153 imageInfo[0].imageView = view;
4154 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4155 imageInfo[1].imageView = view;
4156 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004157 imageInfo[2].imageView = view;
4158 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4159 imageInfo[3].imageView = view;
4160 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004161
4162 static const uint32_t NUM_SET_UPDATES = 3;
4163 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
4164 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4165 descriptor_write[0].dstSet = descriptorSet[0];
4166 descriptor_write[0].dstBinding = 0;
4167 descriptor_write[0].descriptorCount = 5;
4168 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4169 descriptor_write[0].pBufferInfo = buffInfo;
4170 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4171 descriptor_write[1].dstSet = descriptorSet[1];
4172 descriptor_write[1].dstBinding = 0;
4173 descriptor_write[1].descriptorCount = 2;
4174 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
4175 descriptor_write[1].pImageInfo = imageInfo;
4176 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4177 descriptor_write[2].dstSet = descriptorSet[1];
4178 descriptor_write[2].dstBinding = 1;
4179 descriptor_write[2].descriptorCount = 2;
4180 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004181 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004182
4183 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004184
Tobin Ehlis88452832015-12-03 09:40:56 -07004185 // Create PSO to be used for draw-time errors below
4186 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004187 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004188 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07004189 "out gl_PerVertex {\n"
4190 " vec4 gl_Position;\n"
4191 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004192 "void main(){\n"
4193 " gl_Position = vec4(1);\n"
4194 "}\n";
4195 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004196 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004197 "\n"
4198 "layout(location=0) out vec4 x;\n"
4199 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
4200 "void main(){\n"
4201 " x = vec4(bar.y);\n"
4202 "}\n";
4203 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4204 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004205 VkPipelineObj pipe(m_device);
4206 pipe.AddShader(&vs);
4207 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07004208 pipe.AddColorAttachment();
4209 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07004210
4211 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07004212
Karl Schultz6addd812016-02-02 17:17:23 -07004213 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4214 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4215 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
4216 // of PSO
4217 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
4218 // cmd_pipeline.c
4219 // due to the fact that cmd_alloc_dset_data() has not been called in
4220 // cmd_bind_graphics_pipeline()
4221 // TODO : Want to cause various binding incompatibility issues here to test
4222 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07004223 // First cause various verify_layout_compatibility() fails
4224 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004225 // verify_set_layout_compatibility fail cases:
4226 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07004227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4228 " due to: invalid VkPipelineLayout ");
4229 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4230 VK_PIPELINE_BIND_POINT_GRAPHICS,
4231 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
4232 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004233 m_errorMonitor->VerifyFound();
4234
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004235 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07004236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4237 " attempting to bind set to index 1");
4238 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4239 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
4240 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004241 m_errorMonitor->VerifyFound();
4242
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004243 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004244 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
4245 // descriptors
4246 m_errorMonitor->SetDesiredFailureMsg(
4247 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06004248 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07004249 vkCmdBindDescriptorSets(
4250 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4251 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004252 m_errorMonitor->VerifyFound();
4253
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004254 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
4255 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07004256 m_errorMonitor->SetDesiredFailureMsg(
4257 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06004258 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07004259 vkCmdBindDescriptorSets(
4260 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4261 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004262 m_errorMonitor->VerifyFound();
4263
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004264 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
4265 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07004266 m_errorMonitor->SetDesiredFailureMsg(
4267 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06004268 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07004269 vkCmdBindDescriptorSets(
4270 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4271 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004272 m_errorMonitor->VerifyFound();
4273
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004274 // Cause INFO messages due to disturbing previously bound Sets
4275 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07004276 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4277 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4278 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004279 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07004280 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004281 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004282 " previously bound as set #0 was disturbed ");
4283 vkCmdBindDescriptorSets(
4284 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4285 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004286 m_errorMonitor->VerifyFound();
4287
Karl Schultz6addd812016-02-02 17:17:23 -07004288 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4289 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4290 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004291 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004293 " newly bound as set #0 so set #1 and "
4294 "any subsequent sets were disturbed ");
4295 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4296 VK_PIPELINE_BIND_POINT_GRAPHICS,
4297 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004298 m_errorMonitor->VerifyFound();
4299
Tobin Ehlis88452832015-12-03 09:40:56 -07004300 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07004301 // 1. Error due to not binding required set (we actually use same code as
4302 // above to disturb set0)
4303 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4304 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4305 2, &descriptorSet[0], 0, NULL);
4306 vkCmdBindDescriptorSets(
4307 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
4308 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
4309 m_errorMonitor->SetDesiredFailureMsg(
4310 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4311 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07004312 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004313 m_errorMonitor->VerifyFound();
4314
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004315 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004316 // 2. Error due to bound set not being compatible with PSO's
4317 // VkPipelineLayout (diff stageFlags in this case)
4318 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4319 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4320 2, &descriptorSet[0], 0, NULL);
4321 m_errorMonitor->SetDesiredFailureMsg(
4322 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4323 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07004324 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004325 m_errorMonitor->VerifyFound();
4326
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004327 // Remaining clean-up
4328 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004329 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004330 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
4331 }
4332 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06004333 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
4334 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004335 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004336 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4337 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4338}
Tobin Ehlis559c6382015-11-05 09:52:49 -07004339
Karl Schultz6addd812016-02-02 17:17:23 -07004340TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004341
Karl Schultz6addd812016-02-02 17:17:23 -07004342 m_errorMonitor->SetDesiredFailureMsg(
4343 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004344 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004345
4346 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004347 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004348 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004349 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004350
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004351 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004352}
4353
Karl Schultz6addd812016-02-02 17:17:23 -07004354TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
4355 VkResult err;
4356 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004357
Karl Schultz6addd812016-02-02 17:17:23 -07004358 m_errorMonitor->SetDesiredFailureMsg(
4359 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07004360 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004361
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004362 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004363
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004364 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004365 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06004366 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004367 cmd.commandPool = m_commandPool;
4368 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004369 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06004370
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004371 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06004372 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004373
4374 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004375 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07004376 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004377 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06004378 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07004379 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
4380 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004381 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004382
4383 // The error should be caught by validation of the BeginCommandBuffer call
4384 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
4385
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004386 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004387 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06004388}
4389
Karl Schultz6addd812016-02-02 17:17:23 -07004390TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004391 // Cause error due to Begin while recording CB
4392 // Then cause 2 errors for attempting to reset CB w/o having
4393 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
4394 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004396 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004397
4398 ASSERT_NO_FATAL_FAILURE(InitState());
4399
4400 // Calls AllocateCommandBuffers
4401 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
4402
Karl Schultz6addd812016-02-02 17:17:23 -07004403 // Force the failure by setting the Renderpass and Framebuffer fields with
4404 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004405 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07004406 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004407 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4408 cmd_buf_info.pNext = NULL;
4409 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004410 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004411
4412 // Begin CB to transition to recording state
4413 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
4414 // Can't re-begin. This should trigger error
4415 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004416 m_errorMonitor->VerifyFound();
4417
Karl Schultz6addd812016-02-02 17:17:23 -07004418 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4419 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004420 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
4421 // Reset attempt will trigger error due to incorrect CommandPool state
4422 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004423 m_errorMonitor->VerifyFound();
4424
Karl Schultz6addd812016-02-02 17:17:23 -07004425 m_errorMonitor->SetDesiredFailureMsg(
4426 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4427 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004428 // Transition CB to RECORDED state
4429 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
4430 // Now attempting to Begin will implicitly reset, which triggers error
4431 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004432 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07004433}
4434
Karl Schultz6addd812016-02-02 17:17:23 -07004435TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004436 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07004437 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004438
Karl Schultz6addd812016-02-02 17:17:23 -07004439 m_errorMonitor->SetDesiredFailureMsg(
4440 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004441 "Invalid Pipeline CreateInfo State: Vtx Shader required");
4442
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004443 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06004444 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004445
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004446 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004447 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4448 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004449
4450 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004451 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4452 ds_pool_ci.pNext = NULL;
4453 ds_pool_ci.maxSets = 1;
4454 ds_pool_ci.poolSizeCount = 1;
4455 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004456
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004457 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004458 err =
4459 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004460 ASSERT_VK_SUCCESS(err);
4461
Tony Barboureb254902015-07-15 12:50:33 -06004462 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004463 dsl_binding.binding = 0;
4464 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4465 dsl_binding.descriptorCount = 1;
4466 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4467 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004468
Tony Barboureb254902015-07-15 12:50:33 -06004469 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004470 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4471 ds_layout_ci.pNext = NULL;
4472 ds_layout_ci.bindingCount = 1;
4473 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004474
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004475 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004476 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4477 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004478 ASSERT_VK_SUCCESS(err);
4479
4480 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004481 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004482 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004483 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004484 alloc_info.descriptorPool = ds_pool;
4485 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004486 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4487 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004488 ASSERT_VK_SUCCESS(err);
4489
Tony Barboureb254902015-07-15 12:50:33 -06004490 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004491 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4492 pipeline_layout_ci.setLayoutCount = 1;
4493 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004494
4495 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004496 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4497 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004498 ASSERT_VK_SUCCESS(err);
4499
Tobin Ehlise68360f2015-10-01 11:15:13 -06004500 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07004501 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06004502
4503 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004504 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4505 vp_state_ci.scissorCount = 1;
4506 vp_state_ci.pScissors = &sc;
4507 vp_state_ci.viewportCount = 1;
4508 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004509
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004510 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4511 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4512 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4513 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4514 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4515 rs_state_ci.depthClampEnable = VK_FALSE;
4516 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4517 rs_state_ci.depthBiasEnable = VK_FALSE;
4518
Tony Barboureb254902015-07-15 12:50:33 -06004519 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004520 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4521 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004522 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004523 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4524 gp_ci.layout = pipeline_layout;
4525 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06004526
4527 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004528 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4529 pc_ci.initialDataSize = 0;
4530 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004531
4532 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06004533 VkPipelineCache pipelineCache;
4534
Karl Schultz6addd812016-02-02 17:17:23 -07004535 err =
4536 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06004537 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004538 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4539 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004540
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004541 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004542
Chia-I Wuf7458c52015-10-26 21:10:41 +08004543 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4544 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4545 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4546 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004547}
Tobin Ehlis912df022015-09-17 08:46:18 -06004548/*// TODO : This test should be good, but needs Tess support in compiler to run
4549TEST_F(VkLayerTest, InvalidPatchControlPoints)
4550{
4551 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06004552 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004553
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004555 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
4556primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004557
Tobin Ehlis912df022015-09-17 08:46:18 -06004558 ASSERT_NO_FATAL_FAILURE(InitState());
4559 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06004560
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004561 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06004562 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004563 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004564
4565 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4566 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4567 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004568 ds_pool_ci.poolSizeCount = 1;
4569 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06004570
4571 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004572 err = vkCreateDescriptorPool(m_device->device(),
4573VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06004574 ASSERT_VK_SUCCESS(err);
4575
4576 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08004577 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06004578 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08004579 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004580 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4581 dsl_binding.pImmutableSamplers = NULL;
4582
4583 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004584 ds_layout_ci.sType =
4585VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06004586 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004587 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004588 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06004589
4590 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004591 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4592&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06004593 ASSERT_VK_SUCCESS(err);
4594
4595 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004596 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
4597VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06004598 ASSERT_VK_SUCCESS(err);
4599
4600 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004601 pipeline_layout_ci.sType =
4602VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06004603 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004604 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004605 pipeline_layout_ci.pSetLayouts = &ds_layout;
4606
4607 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004608 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4609&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06004610 ASSERT_VK_SUCCESS(err);
4611
4612 VkPipelineShaderStageCreateInfo shaderStages[3];
4613 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
4614
Karl Schultz6addd812016-02-02 17:17:23 -07004615 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
4616this);
Tobin Ehlis912df022015-09-17 08:46:18 -06004617 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07004618 VkShaderObj
4619tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
4620this);
4621 VkShaderObj
4622te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
4623this);
Tobin Ehlis912df022015-09-17 08:46:18 -06004624
Karl Schultz6addd812016-02-02 17:17:23 -07004625 shaderStages[0].sType =
4626VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004627 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004628 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07004629 shaderStages[1].sType =
4630VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004631 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004632 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07004633 shaderStages[2].sType =
4634VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004635 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004636 shaderStages[2].shader = te.handle();
4637
4638 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004639 iaCI.sType =
4640VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08004641 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06004642
4643 VkPipelineTessellationStateCreateInfo tsCI = {};
4644 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
4645 tsCI.patchControlPoints = 0; // This will cause an error
4646
4647 VkGraphicsPipelineCreateInfo gp_ci = {};
4648 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4649 gp_ci.pNext = NULL;
4650 gp_ci.stageCount = 3;
4651 gp_ci.pStages = shaderStages;
4652 gp_ci.pVertexInputState = NULL;
4653 gp_ci.pInputAssemblyState = &iaCI;
4654 gp_ci.pTessellationState = &tsCI;
4655 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004656 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06004657 gp_ci.pMultisampleState = NULL;
4658 gp_ci.pDepthStencilState = NULL;
4659 gp_ci.pColorBlendState = NULL;
4660 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4661 gp_ci.layout = pipeline_layout;
4662 gp_ci.renderPass = renderPass();
4663
4664 VkPipelineCacheCreateInfo pc_ci = {};
4665 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4666 pc_ci.pNext = NULL;
4667 pc_ci.initialSize = 0;
4668 pc_ci.initialData = 0;
4669 pc_ci.maxSize = 0;
4670
4671 VkPipeline pipeline;
4672 VkPipelineCache pipelineCache;
4673
Karl Schultz6addd812016-02-02 17:17:23 -07004674 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
4675&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06004676 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004677 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4678&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06004679
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004680 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004681
Chia-I Wuf7458c52015-10-26 21:10:41 +08004682 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4683 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4684 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4685 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06004686}
4687*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06004688// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07004689TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07004690 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004691
Karl Schultz6addd812016-02-02 17:17:23 -07004692 m_errorMonitor->SetDesiredFailureMsg(
4693 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004694 "Gfx Pipeline viewport count (1) must match scissor count (0).");
4695
Tobin Ehlise68360f2015-10-01 11:15:13 -06004696 ASSERT_NO_FATAL_FAILURE(InitState());
4697 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004698
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004699 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004700 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4701 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004702
4703 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004704 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4705 ds_pool_ci.maxSets = 1;
4706 ds_pool_ci.poolSizeCount = 1;
4707 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004708
4709 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004710 err =
4711 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004712 ASSERT_VK_SUCCESS(err);
4713
4714 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004715 dsl_binding.binding = 0;
4716 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4717 dsl_binding.descriptorCount = 1;
4718 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004719
4720 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004721 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4722 ds_layout_ci.bindingCount = 1;
4723 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004724
4725 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004726 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4727 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004728 ASSERT_VK_SUCCESS(err);
4729
4730 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004731 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004732 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004733 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004734 alloc_info.descriptorPool = ds_pool;
4735 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004736 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4737 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004738 ASSERT_VK_SUCCESS(err);
4739
4740 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004741 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4742 pipeline_layout_ci.setLayoutCount = 1;
4743 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004744
4745 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004746 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4747 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004748 ASSERT_VK_SUCCESS(err);
4749
4750 VkViewport vp = {}; // Just need dummy vp to point to
4751
4752 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004753 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4754 vp_state_ci.scissorCount = 0;
4755 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
4756 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004757
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004758 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4759 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4760 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4761 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4762 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4763 rs_state_ci.depthClampEnable = VK_FALSE;
4764 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4765 rs_state_ci.depthBiasEnable = VK_FALSE;
4766
Cody Northropeb3a6c12015-10-05 14:44:45 -06004767 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004768 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004769
Karl Schultz6addd812016-02-02 17:17:23 -07004770 VkShaderObj vs(m_device, bindStateVertShaderText,
4771 VK_SHADER_STAGE_VERTEX_BIT, this);
4772 VkShaderObj fs(m_device, bindStateFragShaderText,
4773 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004774 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004775 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004776 shaderStages[0] = vs.GetStageCreateInfo();
4777 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004778
4779 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004780 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4781 gp_ci.stageCount = 2;
4782 gp_ci.pStages = shaderStages;
4783 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004784 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004785 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4786 gp_ci.layout = pipeline_layout;
4787 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004788
4789 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004790 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004791
4792 VkPipeline pipeline;
4793 VkPipelineCache pipelineCache;
4794
Karl Schultz6addd812016-02-02 17:17:23 -07004795 err =
4796 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004797 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004798 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4799 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004800
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004801 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004802
Chia-I Wuf7458c52015-10-26 21:10:41 +08004803 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4804 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4805 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4806 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004807}
Karl Schultz6addd812016-02-02 17:17:23 -07004808// Don't set viewport state in PSO. This is an error b/c we always need this
4809// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06004810// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07004811TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06004812 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07004813 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004814
Karl Schultz6addd812016-02-02 17:17:23 -07004815 m_errorMonitor->SetDesiredFailureMsg(
4816 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004817 "Gfx Pipeline pViewportState is null. Even if ");
4818
Tobin Ehlise68360f2015-10-01 11:15:13 -06004819 ASSERT_NO_FATAL_FAILURE(InitState());
4820 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004821
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004822 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004823 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4824 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004825
4826 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004827 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4828 ds_pool_ci.maxSets = 1;
4829 ds_pool_ci.poolSizeCount = 1;
4830 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004831
4832 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004833 err =
4834 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004835 ASSERT_VK_SUCCESS(err);
4836
4837 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004838 dsl_binding.binding = 0;
4839 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4840 dsl_binding.descriptorCount = 1;
4841 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004842
4843 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004844 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4845 ds_layout_ci.bindingCount = 1;
4846 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004847
4848 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004849 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4850 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004851 ASSERT_VK_SUCCESS(err);
4852
4853 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004854 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004855 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004856 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004857 alloc_info.descriptorPool = ds_pool;
4858 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004859 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4860 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004861 ASSERT_VK_SUCCESS(err);
4862
4863 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004864 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4865 pipeline_layout_ci.setLayoutCount = 1;
4866 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004867
4868 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004869 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4870 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004871 ASSERT_VK_SUCCESS(err);
4872
4873 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4874 // Set scissor as dynamic to avoid second error
4875 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004876 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4877 dyn_state_ci.dynamicStateCount = 1;
4878 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004879
Cody Northropeb3a6c12015-10-05 14:44:45 -06004880 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004881 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004882
Karl Schultz6addd812016-02-02 17:17:23 -07004883 VkShaderObj vs(m_device, bindStateVertShaderText,
4884 VK_SHADER_STAGE_VERTEX_BIT, this);
4885 VkShaderObj fs(m_device, bindStateFragShaderText,
4886 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004887 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004888 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004889 shaderStages[0] = vs.GetStageCreateInfo();
4890 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004891
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004892
4893 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4894 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4895 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4896 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4897 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4898 rs_state_ci.depthClampEnable = VK_FALSE;
4899 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4900 rs_state_ci.depthBiasEnable = VK_FALSE;
4901
Tobin Ehlise68360f2015-10-01 11:15:13 -06004902 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004903 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4904 gp_ci.stageCount = 2;
4905 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004906 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004907 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
4908 // should cause validation error
4909 gp_ci.pDynamicState = &dyn_state_ci;
4910 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4911 gp_ci.layout = pipeline_layout;
4912 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004913
4914 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004915 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004916
4917 VkPipeline pipeline;
4918 VkPipelineCache pipelineCache;
4919
Karl Schultz6addd812016-02-02 17:17:23 -07004920 err =
4921 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004922 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004923 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4924 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004925
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004926 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004927
Chia-I Wuf7458c52015-10-26 21:10:41 +08004928 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4929 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4930 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4931 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004932}
4933// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07004934// Then run second test where dynamic scissor count doesn't match PSO scissor
4935// count
4936TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
4937 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004938
Karl Schultz6addd812016-02-02 17:17:23 -07004939 m_errorMonitor->SetDesiredFailureMsg(
4940 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004941 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
4942
Tobin Ehlise68360f2015-10-01 11:15:13 -06004943 ASSERT_NO_FATAL_FAILURE(InitState());
4944 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004945
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004946 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004947 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4948 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004949
4950 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004951 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4952 ds_pool_ci.maxSets = 1;
4953 ds_pool_ci.poolSizeCount = 1;
4954 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004955
4956 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004957 err =
4958 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004959 ASSERT_VK_SUCCESS(err);
4960
4961 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004962 dsl_binding.binding = 0;
4963 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4964 dsl_binding.descriptorCount = 1;
4965 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004966
4967 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004968 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4969 ds_layout_ci.bindingCount = 1;
4970 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004971
4972 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004973 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4974 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004975 ASSERT_VK_SUCCESS(err);
4976
4977 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004978 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004979 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004980 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004981 alloc_info.descriptorPool = ds_pool;
4982 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004983 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4984 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004985 ASSERT_VK_SUCCESS(err);
4986
4987 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004988 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4989 pipeline_layout_ci.setLayoutCount = 1;
4990 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004991
4992 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004993 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4994 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004995 ASSERT_VK_SUCCESS(err);
4996
4997 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004998 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4999 vp_state_ci.viewportCount = 1;
5000 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
5001 vp_state_ci.scissorCount = 1;
5002 vp_state_ci.pScissors =
5003 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06005004
5005 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
5006 // Set scissor as dynamic to avoid that error
5007 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005008 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5009 dyn_state_ci.dynamicStateCount = 1;
5010 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005011
Cody Northropeb3a6c12015-10-05 14:44:45 -06005012 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07005013 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06005014
Karl Schultz6addd812016-02-02 17:17:23 -07005015 VkShaderObj vs(m_device, bindStateVertShaderText,
5016 VK_SHADER_STAGE_VERTEX_BIT, this);
5017 VkShaderObj fs(m_device, bindStateFragShaderText,
5018 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005019 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005020 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08005021 shaderStages[0] = vs.GetStageCreateInfo();
5022 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005023
Cody Northropf6622dc2015-10-06 10:33:21 -06005024 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5025 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5026 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005027 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06005028 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005029 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06005030 vi_ci.pVertexAttributeDescriptions = nullptr;
5031
5032 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5033 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5034 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5035
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005036 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005037 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06005038 rs_ci.pNext = nullptr;
5039
Mark Youngc89c6312016-03-31 16:03:20 -06005040 VkPipelineColorBlendAttachmentState att = {};
5041 att.blendEnable = VK_FALSE;
5042 att.colorWriteMask = 0xf;
5043
Cody Northropf6622dc2015-10-06 10:33:21 -06005044 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5045 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5046 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06005047 cb_ci.attachmentCount = 1;
5048 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06005049
Tobin Ehlise68360f2015-10-01 11:15:13 -06005050 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005051 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5052 gp_ci.stageCount = 2;
5053 gp_ci.pStages = shaderStages;
5054 gp_ci.pVertexInputState = &vi_ci;
5055 gp_ci.pInputAssemblyState = &ia_ci;
5056 gp_ci.pViewportState = &vp_state_ci;
5057 gp_ci.pRasterizationState = &rs_ci;
5058 gp_ci.pColorBlendState = &cb_ci;
5059 gp_ci.pDynamicState = &dyn_state_ci;
5060 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5061 gp_ci.layout = pipeline_layout;
5062 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005063
5064 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005065 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005066
5067 VkPipeline pipeline;
5068 VkPipelineCache pipelineCache;
5069
Karl Schultz6addd812016-02-02 17:17:23 -07005070 err =
5071 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005072 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005073 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5074 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005075
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005076 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005077
Tobin Ehlisd332f282015-10-02 11:00:56 -06005078 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07005079 // First need to successfully create the PSO from above by setting
5080 // pViewports
5081 m_errorMonitor->SetDesiredFailureMsg(
5082 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5083 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
5084 "scissorCount is 1. These counts must match.");
5085
5086 VkViewport vp = {}; // Just need dummy vp to point to
5087 vp_state_ci.pViewports = &vp;
5088 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5089 &gp_ci, NULL, &pipeline);
5090 ASSERT_VK_SUCCESS(err);
5091 BeginCommandBuffer();
5092 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5093 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5094 VkRect2D scissors[2] = {}; // don't care about data
5095 // Count of 2 doesn't match PSO count of 1
5096 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
5097 Draw(1, 0, 0, 0);
5098
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005099 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07005100
5101 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5102 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5103 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5104 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5105}
5106// Create PSO w/o non-zero scissorCount but no scissor data
5107// Then run second test where dynamic viewportCount doesn't match PSO
5108// viewportCount
5109TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
5110 VkResult err;
5111
5112 m_errorMonitor->SetDesiredFailureMsg(
5113 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5114 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
5115
5116 ASSERT_NO_FATAL_FAILURE(InitState());
5117 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5118
5119 VkDescriptorPoolSize ds_type_count = {};
5120 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5121 ds_type_count.descriptorCount = 1;
5122
5123 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5124 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5125 ds_pool_ci.maxSets = 1;
5126 ds_pool_ci.poolSizeCount = 1;
5127 ds_pool_ci.pPoolSizes = &ds_type_count;
5128
5129 VkDescriptorPool ds_pool;
5130 err =
5131 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5132 ASSERT_VK_SUCCESS(err);
5133
5134 VkDescriptorSetLayoutBinding dsl_binding = {};
5135 dsl_binding.binding = 0;
5136 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5137 dsl_binding.descriptorCount = 1;
5138 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5139
5140 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5141 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5142 ds_layout_ci.bindingCount = 1;
5143 ds_layout_ci.pBindings = &dsl_binding;
5144
5145 VkDescriptorSetLayout ds_layout;
5146 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5147 &ds_layout);
5148 ASSERT_VK_SUCCESS(err);
5149
5150 VkDescriptorSet descriptorSet;
5151 VkDescriptorSetAllocateInfo alloc_info = {};
5152 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5153 alloc_info.descriptorSetCount = 1;
5154 alloc_info.descriptorPool = ds_pool;
5155 alloc_info.pSetLayouts = &ds_layout;
5156 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5157 &descriptorSet);
5158 ASSERT_VK_SUCCESS(err);
5159
5160 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5161 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5162 pipeline_layout_ci.setLayoutCount = 1;
5163 pipeline_layout_ci.pSetLayouts = &ds_layout;
5164
5165 VkPipelineLayout pipeline_layout;
5166 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5167 &pipeline_layout);
5168 ASSERT_VK_SUCCESS(err);
5169
5170 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5171 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5172 vp_state_ci.scissorCount = 1;
5173 vp_state_ci.pScissors =
5174 NULL; // Null scissor w/ count of 1 should cause error
5175 vp_state_ci.viewportCount = 1;
5176 vp_state_ci.pViewports =
5177 NULL; // vp is dynamic (below) so this won't cause error
5178
5179 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
5180 // Set scissor as dynamic to avoid that error
5181 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5182 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5183 dyn_state_ci.dynamicStateCount = 1;
5184 dyn_state_ci.pDynamicStates = &vp_state;
5185
5186 VkPipelineShaderStageCreateInfo shaderStages[2];
5187 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5188
5189 VkShaderObj vs(m_device, bindStateVertShaderText,
5190 VK_SHADER_STAGE_VERTEX_BIT, this);
5191 VkShaderObj fs(m_device, bindStateFragShaderText,
5192 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005193 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005194 // but add it to be able to run on more devices
5195 shaderStages[0] = vs.GetStageCreateInfo();
5196 shaderStages[1] = fs.GetStageCreateInfo();
5197
5198 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5199 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5200 vi_ci.pNext = nullptr;
5201 vi_ci.vertexBindingDescriptionCount = 0;
5202 vi_ci.pVertexBindingDescriptions = nullptr;
5203 vi_ci.vertexAttributeDescriptionCount = 0;
5204 vi_ci.pVertexAttributeDescriptions = nullptr;
5205
5206 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5207 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5208 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5209
5210 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5211 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5212 rs_ci.pNext = nullptr;
5213
Mark Youngc89c6312016-03-31 16:03:20 -06005214 VkPipelineColorBlendAttachmentState att = {};
5215 att.blendEnable = VK_FALSE;
5216 att.colorWriteMask = 0xf;
5217
Karl Schultz6addd812016-02-02 17:17:23 -07005218 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5219 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5220 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06005221 cb_ci.attachmentCount = 1;
5222 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07005223
5224 VkGraphicsPipelineCreateInfo gp_ci = {};
5225 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5226 gp_ci.stageCount = 2;
5227 gp_ci.pStages = shaderStages;
5228 gp_ci.pVertexInputState = &vi_ci;
5229 gp_ci.pInputAssemblyState = &ia_ci;
5230 gp_ci.pViewportState = &vp_state_ci;
5231 gp_ci.pRasterizationState = &rs_ci;
5232 gp_ci.pColorBlendState = &cb_ci;
5233 gp_ci.pDynamicState = &dyn_state_ci;
5234 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5235 gp_ci.layout = pipeline_layout;
5236 gp_ci.renderPass = renderPass();
5237
5238 VkPipelineCacheCreateInfo pc_ci = {};
5239 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5240
5241 VkPipeline pipeline;
5242 VkPipelineCache pipelineCache;
5243
5244 err =
5245 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5246 ASSERT_VK_SUCCESS(err);
5247 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5248 &gp_ci, NULL, &pipeline);
5249
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005250 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07005251
5252 // Now hit second fail case where we set scissor w/ different count than PSO
5253 // First need to successfully create the PSO from above by setting
5254 // pViewports
5255 m_errorMonitor->SetDesiredFailureMsg(
5256 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5257 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
5258 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005259
Tobin Ehlisd332f282015-10-02 11:00:56 -06005260 VkRect2D sc = {}; // Just need dummy vp to point to
5261 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07005262 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5263 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005264 ASSERT_VK_SUCCESS(err);
5265 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005266 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5267 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005268 VkViewport viewports[2] = {}; // don't care about data
5269 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07005270 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005271 Draw(1, 0, 0, 0);
5272
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005273 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005274
Chia-I Wuf7458c52015-10-26 21:10:41 +08005275 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5276 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5277 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5278 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005279}
5280
Mark Young7394fdd2016-03-31 14:56:43 -06005281TEST_F(VkLayerTest, PSOLineWidthInvalid) {
5282 VkResult err;
5283
5284 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06005285 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06005286
5287 ASSERT_NO_FATAL_FAILURE(InitState());
5288 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5289
5290 VkDescriptorPoolSize ds_type_count = {};
5291 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5292 ds_type_count.descriptorCount = 1;
5293
5294 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5295 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5296 ds_pool_ci.maxSets = 1;
5297 ds_pool_ci.poolSizeCount = 1;
5298 ds_pool_ci.pPoolSizes = &ds_type_count;
5299
5300 VkDescriptorPool ds_pool;
5301 err =
5302 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5303 ASSERT_VK_SUCCESS(err);
5304
5305 VkDescriptorSetLayoutBinding dsl_binding = {};
5306 dsl_binding.binding = 0;
5307 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5308 dsl_binding.descriptorCount = 1;
5309 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5310
5311 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5312 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5313 ds_layout_ci.bindingCount = 1;
5314 ds_layout_ci.pBindings = &dsl_binding;
5315
5316 VkDescriptorSetLayout ds_layout;
5317 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5318 &ds_layout);
5319 ASSERT_VK_SUCCESS(err);
5320
5321 VkDescriptorSet descriptorSet;
5322 VkDescriptorSetAllocateInfo alloc_info = {};
5323 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5324 alloc_info.descriptorSetCount = 1;
5325 alloc_info.descriptorPool = ds_pool;
5326 alloc_info.pSetLayouts = &ds_layout;
5327 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5328 &descriptorSet);
5329 ASSERT_VK_SUCCESS(err);
5330
5331 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5332 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5333 pipeline_layout_ci.setLayoutCount = 1;
5334 pipeline_layout_ci.pSetLayouts = &ds_layout;
5335
5336 VkPipelineLayout pipeline_layout;
5337 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5338 &pipeline_layout);
5339 ASSERT_VK_SUCCESS(err);
5340
5341 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5342 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5343 vp_state_ci.scissorCount = 1;
5344 vp_state_ci.pScissors = NULL;
5345 vp_state_ci.viewportCount = 1;
5346 vp_state_ci.pViewports = NULL;
5347
5348 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
5349 VK_DYNAMIC_STATE_SCISSOR,
5350 VK_DYNAMIC_STATE_LINE_WIDTH};
5351 // Set scissor as dynamic to avoid that error
5352 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5353 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5354 dyn_state_ci.dynamicStateCount = 2;
5355 dyn_state_ci.pDynamicStates = dynamic_states;
5356
5357 VkPipelineShaderStageCreateInfo shaderStages[2];
5358 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5359
5360 VkShaderObj vs(m_device, bindStateVertShaderText,
5361 VK_SHADER_STAGE_VERTEX_BIT, this);
5362 VkShaderObj fs(m_device, bindStateFragShaderText,
5363 VK_SHADER_STAGE_FRAGMENT_BIT,
5364 this); // TODO - We shouldn't need a fragment shader
5365 // but add it to be able to run on more devices
5366 shaderStages[0] = vs.GetStageCreateInfo();
5367 shaderStages[1] = fs.GetStageCreateInfo();
5368
5369 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5370 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5371 vi_ci.pNext = nullptr;
5372 vi_ci.vertexBindingDescriptionCount = 0;
5373 vi_ci.pVertexBindingDescriptions = nullptr;
5374 vi_ci.vertexAttributeDescriptionCount = 0;
5375 vi_ci.pVertexAttributeDescriptions = nullptr;
5376
5377 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5378 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5379 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5380
5381 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5382 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5383 rs_ci.pNext = nullptr;
5384
Mark Young47107952016-05-02 15:59:55 -06005385 // Check too low (line width of -1.0f).
5386 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06005387
5388 VkPipelineColorBlendAttachmentState att = {};
5389 att.blendEnable = VK_FALSE;
5390 att.colorWriteMask = 0xf;
5391
5392 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5393 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5394 cb_ci.pNext = nullptr;
5395 cb_ci.attachmentCount = 1;
5396 cb_ci.pAttachments = &att;
5397
5398 VkGraphicsPipelineCreateInfo gp_ci = {};
5399 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5400 gp_ci.stageCount = 2;
5401 gp_ci.pStages = shaderStages;
5402 gp_ci.pVertexInputState = &vi_ci;
5403 gp_ci.pInputAssemblyState = &ia_ci;
5404 gp_ci.pViewportState = &vp_state_ci;
5405 gp_ci.pRasterizationState = &rs_ci;
5406 gp_ci.pColorBlendState = &cb_ci;
5407 gp_ci.pDynamicState = &dyn_state_ci;
5408 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5409 gp_ci.layout = pipeline_layout;
5410 gp_ci.renderPass = renderPass();
5411
5412 VkPipelineCacheCreateInfo pc_ci = {};
5413 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5414
5415 VkPipeline pipeline;
5416 VkPipelineCache pipelineCache;
5417
5418 err =
5419 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5420 ASSERT_VK_SUCCESS(err);
5421 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5422 &gp_ci, NULL, &pipeline);
5423
5424 m_errorMonitor->VerifyFound();
5425
5426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5427 "Attempt to set lineWidth to 65536");
5428
5429 // Check too high (line width of 65536.0f).
5430 rs_ci.lineWidth = 65536.0f;
5431
5432 err =
5433 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5434 ASSERT_VK_SUCCESS(err);
5435 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5436 &gp_ci, NULL, &pipeline);
5437
5438 m_errorMonitor->VerifyFound();
5439
5440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06005441 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06005442
5443 dyn_state_ci.dynamicStateCount = 3;
5444
5445 rs_ci.lineWidth = 1.0f;
5446
5447 err =
5448 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
5449 ASSERT_VK_SUCCESS(err);
5450 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5451 &gp_ci, NULL, &pipeline);
5452 BeginCommandBuffer();
5453 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5454 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5455
5456 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06005457 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06005458 m_errorMonitor->VerifyFound();
5459
5460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5461 "Attempt to set lineWidth to 65536");
5462
5463 // Check too high with dynamic setting.
5464 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
5465 m_errorMonitor->VerifyFound();
5466 EndCommandBuffer();
5467
5468 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5469 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5470 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5471 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5472}
5473
Karl Schultz6addd812016-02-02 17:17:23 -07005474TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005475 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005476 m_errorMonitor->SetDesiredFailureMsg(
5477 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005478 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005479
5480 ASSERT_NO_FATAL_FAILURE(InitState());
5481 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005482
Tony Barbourfe3351b2015-07-28 10:17:20 -06005483 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005484 // Don't care about RenderPass handle b/c error should be flagged before
5485 // that
5486 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
5487 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005488
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005489 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06005490}
5491
Karl Schultz6addd812016-02-02 17:17:23 -07005492TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005493 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005494 m_errorMonitor->SetDesiredFailureMsg(
5495 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005496 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005497
5498 ASSERT_NO_FATAL_FAILURE(InitState());
5499 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005500
Tony Barbourfe3351b2015-07-28 10:17:20 -06005501 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005502 // Just create a dummy Renderpass that's non-NULL so we can get to the
5503 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06005504 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005505 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
5506 rp_begin.pNext = NULL;
5507 rp_begin.renderPass = renderPass();
5508 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005509
Karl Schultz6addd812016-02-02 17:17:23 -07005510 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
5511 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005512
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005513 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005514}
5515
Cody Northrop3bb4d962016-05-09 16:15:57 -06005516TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
5517
5518 TEST_DESCRIPTION("End a command buffer with an active render pass");
5519
5520 m_errorMonitor->SetDesiredFailureMsg(
5521 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5522 "It is invalid to issue this call inside an active render pass");
5523
5524 ASSERT_NO_FATAL_FAILURE(InitState());
5525 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5526
5527 // The framework's BeginCommandBuffer calls CreateRenderPass
5528 BeginCommandBuffer();
5529
5530 // Call directly into vkEndCommandBuffer instead of the
5531 // the framework's EndCommandBuffer, which inserts a
5532 // vkEndRenderPass
5533 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
5534
5535 m_errorMonitor->VerifyFound();
5536
5537 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
5538 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
5539}
5540
Karl Schultz6addd812016-02-02 17:17:23 -07005541TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005542 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07005543 m_errorMonitor->SetDesiredFailureMsg(
5544 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005545 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005546
5547 ASSERT_NO_FATAL_FAILURE(InitState());
5548 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005549
5550 // Renderpass is started here
5551 BeginCommandBuffer();
5552
5553 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005554 vk_testing::Buffer dstBuffer;
5555 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005556
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005557 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005558
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005559 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005560}
5561
Karl Schultz6addd812016-02-02 17:17:23 -07005562TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005563 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07005564 m_errorMonitor->SetDesiredFailureMsg(
5565 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005566 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005567
5568 ASSERT_NO_FATAL_FAILURE(InitState());
5569 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005570
5571 // Renderpass is started here
5572 BeginCommandBuffer();
5573
5574 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005575 vk_testing::Buffer dstBuffer;
5576 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005577
Karl Schultz6addd812016-02-02 17:17:23 -07005578 VkDeviceSize dstOffset = 0;
5579 VkDeviceSize dataSize = 1024;
5580 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005581
Karl Schultz6addd812016-02-02 17:17:23 -07005582 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
5583 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005584
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005585 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005586}
5587
Karl Schultz6addd812016-02-02 17:17:23 -07005588TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005589 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005590 m_errorMonitor->SetDesiredFailureMsg(
5591 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005592 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005593
5594 ASSERT_NO_FATAL_FAILURE(InitState());
5595 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005596
5597 // Renderpass is started here
5598 BeginCommandBuffer();
5599
Michael Lentine0a369f62016-02-03 16:51:46 -06005600 VkClearColorValue clear_color;
5601 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07005602 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
5603 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5604 const int32_t tex_width = 32;
5605 const int32_t tex_height = 32;
5606 VkImageCreateInfo image_create_info = {};
5607 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5608 image_create_info.pNext = NULL;
5609 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5610 image_create_info.format = tex_format;
5611 image_create_info.extent.width = tex_width;
5612 image_create_info.extent.height = tex_height;
5613 image_create_info.extent.depth = 1;
5614 image_create_info.mipLevels = 1;
5615 image_create_info.arrayLayers = 1;
5616 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5617 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
5618 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005619
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005620 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005621 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5622 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005623
Karl Schultz6addd812016-02-02 17:17:23 -07005624 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5625 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005626
Karl Schultz6addd812016-02-02 17:17:23 -07005627 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5628 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005629
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005630 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005631}
5632
Karl Schultz6addd812016-02-02 17:17:23 -07005633TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005634 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005635 m_errorMonitor->SetDesiredFailureMsg(
5636 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005637 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005638
5639 ASSERT_NO_FATAL_FAILURE(InitState());
5640 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005641
5642 // Renderpass is started here
5643 BeginCommandBuffer();
5644
5645 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07005646 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005647 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
5648 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5649 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
5650 image_create_info.extent.width = 64;
5651 image_create_info.extent.height = 64;
5652 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5653 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005654
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005655 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005656 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5657 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005658
Karl Schultz6addd812016-02-02 17:17:23 -07005659 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5660 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005661
Karl Schultz6addd812016-02-02 17:17:23 -07005662 vkCmdClearDepthStencilImage(
5663 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5664 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
5665 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005666
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005667 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005668}
5669
Karl Schultz6addd812016-02-02 17:17:23 -07005670TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005671 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005672 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005673
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005675 "vkCmdClearAttachments: This call "
5676 "must be issued inside an active "
5677 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005678
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005679 ASSERT_NO_FATAL_FAILURE(InitState());
5680 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005681
5682 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005683 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005684 ASSERT_VK_SUCCESS(err);
5685
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005686 VkClearAttachment color_attachment;
5687 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5688 color_attachment.clearValue.color.float32[0] = 0;
5689 color_attachment.clearValue.color.float32[1] = 0;
5690 color_attachment.clearValue.color.float32[2] = 0;
5691 color_attachment.clearValue.color.float32[3] = 0;
5692 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005693 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
5694 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5695 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005696
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005697 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005698}
5699
Karl Schultz9e66a292016-04-21 15:57:51 -06005700TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
5701 // Try to add a buffer memory barrier with no buffer.
5702 m_errorMonitor->SetDesiredFailureMsg(
5703 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5704 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
5705
5706 ASSERT_NO_FATAL_FAILURE(InitState());
5707 BeginCommandBuffer();
5708
5709 VkBufferMemoryBarrier buf_barrier = {};
5710 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5711 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5712 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5713 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5714 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5715 buf_barrier.buffer = VK_NULL_HANDLE;
5716 buf_barrier.offset = 0;
5717 buf_barrier.size = VK_WHOLE_SIZE;
5718 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5719 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
5720 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
5721
5722 m_errorMonitor->VerifyFound();
5723}
5724
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06005725TEST_F(VkLayerTest, InvalidBarriers) {
5726 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
5727
5728 m_errorMonitor->SetDesiredFailureMsg(
5729 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
5730
5731 ASSERT_NO_FATAL_FAILURE(InitState());
5732 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5733
5734 VkMemoryBarrier mem_barrier = {};
5735 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
5736 mem_barrier.pNext = NULL;
5737 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5738 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5739 BeginCommandBuffer();
5740 // BeginCommandBuffer() starts a render pass
5741 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5742 VK_PIPELINE_STAGE_HOST_BIT,
5743 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
5744 &mem_barrier, 0, nullptr, 0, nullptr);
5745 m_errorMonitor->VerifyFound();
5746
5747 m_errorMonitor->SetDesiredFailureMsg(
5748 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5749 "Image Layout cannot be transitioned to UNDEFINED");
5750 VkImageObj image(m_device);
5751 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
5752 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5753 ASSERT_TRUE(image.initialized());
5754 VkImageMemoryBarrier img_barrier = {};
5755 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
5756 img_barrier.pNext = NULL;
5757 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5758 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5759 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5760 // New layout can't be UNDEFINED
5761 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5762 img_barrier.image = image.handle();
5763 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5764 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5765 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5766 img_barrier.subresourceRange.baseArrayLayer = 0;
5767 img_barrier.subresourceRange.baseMipLevel = 0;
5768 img_barrier.subresourceRange.layerCount = 1;
5769 img_barrier.subresourceRange.levelCount = 1;
5770 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5771 VK_PIPELINE_STAGE_HOST_BIT,
5772 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5773 nullptr, 1, &img_barrier);
5774 m_errorMonitor->VerifyFound();
5775 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5776
5777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5778 "Subresource must have the sum of the "
5779 "baseArrayLayer");
5780 // baseArrayLayer + layerCount must be <= image's arrayLayers
5781 img_barrier.subresourceRange.baseArrayLayer = 1;
5782 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5783 VK_PIPELINE_STAGE_HOST_BIT,
5784 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5785 nullptr, 1, &img_barrier);
5786 m_errorMonitor->VerifyFound();
5787 img_barrier.subresourceRange.baseArrayLayer = 0;
5788
5789 m_errorMonitor->SetDesiredFailureMsg(
5790 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5791 "Subresource must have the sum of the baseMipLevel");
5792 // baseMipLevel + levelCount must be <= image's mipLevels
5793 img_barrier.subresourceRange.baseMipLevel = 1;
5794 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5795 VK_PIPELINE_STAGE_HOST_BIT,
5796 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5797 nullptr, 1, &img_barrier);
5798 m_errorMonitor->VerifyFound();
5799 img_barrier.subresourceRange.baseMipLevel = 0;
5800
5801 m_errorMonitor->SetDesiredFailureMsg(
5802 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5803 "Buffer Barriers cannot be used during a render pass");
5804 vk_testing::Buffer buffer;
5805 buffer.init(*m_device, 256);
5806 VkBufferMemoryBarrier buf_barrier = {};
5807 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5808 buf_barrier.pNext = NULL;
5809 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5810 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5811 buf_barrier.buffer = buffer.handle();
5812 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5813 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5814 buf_barrier.offset = 0;
5815 buf_barrier.size = VK_WHOLE_SIZE;
5816 // Can't send buffer barrier during a render pass
5817 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5818 VK_PIPELINE_STAGE_HOST_BIT,
5819 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5820 &buf_barrier, 0, nullptr);
5821 m_errorMonitor->VerifyFound();
5822 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
5823
5824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5825 "which is not less than total size");
5826 buf_barrier.offset = 257;
5827 // Offset greater than total size
5828 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5829 VK_PIPELINE_STAGE_HOST_BIT,
5830 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5831 &buf_barrier, 0, nullptr);
5832 m_errorMonitor->VerifyFound();
5833 buf_barrier.offset = 0;
5834
5835 m_errorMonitor->SetDesiredFailureMsg(
5836 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
5837 buf_barrier.size = 257;
5838 // Size greater than total size
5839 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5840 VK_PIPELINE_STAGE_HOST_BIT,
5841 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5842 &buf_barrier, 0, nullptr);
5843 m_errorMonitor->VerifyFound();
5844 buf_barrier.size = VK_WHOLE_SIZE;
5845
5846 m_errorMonitor->SetDesiredFailureMsg(
5847 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5848 "Image is a depth and stencil format and thus must "
5849 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
5850 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
5851 VkDepthStencilObj ds_image(m_device);
5852 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
5853 ASSERT_TRUE(ds_image.initialized());
5854 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5855 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
5856 img_barrier.image = ds_image.handle();
5857 // Leave aspectMask at COLOR on purpose
5858 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5859 VK_PIPELINE_STAGE_HOST_BIT,
5860 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5861 nullptr, 1, &img_barrier);
5862 m_errorMonitor->VerifyFound();
5863}
5864
Karl Schultz6addd812016-02-02 17:17:23 -07005865TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005866 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005867 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005868
Karl Schultz6addd812016-02-02 17:17:23 -07005869 m_errorMonitor->SetDesiredFailureMsg(
5870 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005871 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
5872
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005873 ASSERT_NO_FATAL_FAILURE(InitState());
5874 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005875 uint32_t qfi = 0;
5876 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005877 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5878 buffCI.size = 1024;
5879 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5880 buffCI.queueFamilyIndexCount = 1;
5881 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005882
5883 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005884 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005885 ASSERT_VK_SUCCESS(err);
5886
5887 BeginCommandBuffer();
5888 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005889 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5890 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005891 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07005892 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
5893 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005894
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005895 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005896
Chia-I Wuf7458c52015-10-26 21:10:41 +08005897 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005898}
5899
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005900TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
5901 // Create an out-of-range queueFamilyIndex
5902 m_errorMonitor->SetDesiredFailureMsg(
5903 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -06005904 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
5905 "of the indices specified when the device was created, via the "
5906 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005907
5908 ASSERT_NO_FATAL_FAILURE(InitState());
5909 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5910 VkBufferCreateInfo buffCI = {};
5911 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5912 buffCI.size = 1024;
5913 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5914 buffCI.queueFamilyIndexCount = 1;
5915 // Introduce failure by specifying invalid queue_family_index
5916 uint32_t qfi = 777;
5917 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06005918 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005919
5920 VkBuffer ib;
5921 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
5922
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005923 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005924}
5925
Karl Schultz6addd812016-02-02 17:17:23 -07005926TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
5927 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
5928 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005929
Karl Schultz6addd812016-02-02 17:17:23 -07005930 m_errorMonitor->SetDesiredFailureMsg(
5931 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005932 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005933
5934 ASSERT_NO_FATAL_FAILURE(InitState());
5935 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005936
5937 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005938 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005939 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
5940 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005941
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005942 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005943}
5944
Karl Schultz6addd812016-02-02 17:17:23 -07005945TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005946 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07005947 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005948
Karl Schultz6addd812016-02-02 17:17:23 -07005949 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005950 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5951 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
5952 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005953
Tobin Ehlis3b780662015-05-28 12:11:26 -06005954 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005955 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005956 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005957 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5958 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005959
5960 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005961 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5962 ds_pool_ci.pNext = NULL;
5963 ds_pool_ci.maxSets = 1;
5964 ds_pool_ci.poolSizeCount = 1;
5965 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005966
Tobin Ehlis3b780662015-05-28 12:11:26 -06005967 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005968 err =
5969 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005970 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005971 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005972 dsl_binding.binding = 0;
5973 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5974 dsl_binding.descriptorCount = 1;
5975 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5976 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005977
Tony Barboureb254902015-07-15 12:50:33 -06005978 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005979 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5980 ds_layout_ci.pNext = NULL;
5981 ds_layout_ci.bindingCount = 1;
5982 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005983
Tobin Ehlis3b780662015-05-28 12:11:26 -06005984 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005985 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5986 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005987 ASSERT_VK_SUCCESS(err);
5988
5989 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005990 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005991 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005992 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005993 alloc_info.descriptorPool = ds_pool;
5994 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005995 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5996 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005997 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005998
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005999 VkSamplerCreateInfo sampler_ci = {};
6000 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6001 sampler_ci.pNext = NULL;
6002 sampler_ci.magFilter = VK_FILTER_NEAREST;
6003 sampler_ci.minFilter = VK_FILTER_NEAREST;
6004 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6005 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6006 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6007 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6008 sampler_ci.mipLodBias = 1.0;
6009 sampler_ci.anisotropyEnable = VK_FALSE;
6010 sampler_ci.maxAnisotropy = 1;
6011 sampler_ci.compareEnable = VK_FALSE;
6012 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6013 sampler_ci.minLod = 1.0;
6014 sampler_ci.maxLod = 1.0;
6015 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6016 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6017 VkSampler sampler;
6018 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6019 ASSERT_VK_SUCCESS(err);
6020
6021 VkDescriptorImageInfo info = {};
6022 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006023
6024 VkWriteDescriptorSet descriptor_write;
6025 memset(&descriptor_write, 0, sizeof(descriptor_write));
6026 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006027 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006028 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006029 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006030 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006031 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006032
6033 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6034
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006035 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006036
Chia-I Wuf7458c52015-10-26 21:10:41 +08006037 vkDestroySampler(m_device->device(), sampler, NULL);
6038 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6039 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006040}
6041
Karl Schultz6addd812016-02-02 17:17:23 -07006042TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006043 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07006044 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006045
Karl Schultz6addd812016-02-02 17:17:23 -07006046 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006047 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6048 " binding #0 with 1 total descriptors but update of 1 descriptors "
6049 "starting at binding offset of 0 combined with update array element "
6050 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006051
Tobin Ehlis3b780662015-05-28 12:11:26 -06006052 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006053 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006054 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006055 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6056 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006057
6058 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006059 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6060 ds_pool_ci.pNext = NULL;
6061 ds_pool_ci.maxSets = 1;
6062 ds_pool_ci.poolSizeCount = 1;
6063 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006064
Tobin Ehlis3b780662015-05-28 12:11:26 -06006065 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006066 err =
6067 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006068 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006069
Tony Barboureb254902015-07-15 12:50:33 -06006070 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006071 dsl_binding.binding = 0;
6072 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6073 dsl_binding.descriptorCount = 1;
6074 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6075 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06006076
6077 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006078 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6079 ds_layout_ci.pNext = NULL;
6080 ds_layout_ci.bindingCount = 1;
6081 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006082
Tobin Ehlis3b780662015-05-28 12:11:26 -06006083 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006084 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6085 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006086 ASSERT_VK_SUCCESS(err);
6087
6088 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006089 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006090 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006091 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006092 alloc_info.descriptorPool = ds_pool;
6093 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006094 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6095 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006096 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006097
Tobin Ehlis30db8f82016-05-05 08:19:48 -06006098 // Correctly update descriptor to avoid "NOT_UPDATED" error
6099 VkDescriptorBufferInfo buff_info = {};
6100 buff_info.buffer =
6101 VkBuffer(0); // Don't care about buffer handle for this test
6102 buff_info.offset = 0;
6103 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006104
6105 VkWriteDescriptorSet descriptor_write;
6106 memset(&descriptor_write, 0, sizeof(descriptor_write));
6107 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006108 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006109 descriptor_write.dstArrayElement =
6110 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08006111 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006112 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6113 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006114
6115 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6116
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006117 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006118
Chia-I Wuf7458c52015-10-26 21:10:41 +08006119 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6120 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006121}
6122
Karl Schultz6addd812016-02-02 17:17:23 -07006123TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
6124 // Create layout w/ count of 1 and attempt update to that layout w/ binding
6125 // index 2
6126 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006127
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6129 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006130
Tobin Ehlis3b780662015-05-28 12:11:26 -06006131 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006132 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006133 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006134 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6135 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006136
6137 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006138 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6139 ds_pool_ci.pNext = NULL;
6140 ds_pool_ci.maxSets = 1;
6141 ds_pool_ci.poolSizeCount = 1;
6142 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006143
Tobin Ehlis3b780662015-05-28 12:11:26 -06006144 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006145 err =
6146 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006147 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006148
Tony Barboureb254902015-07-15 12:50:33 -06006149 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006150 dsl_binding.binding = 0;
6151 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6152 dsl_binding.descriptorCount = 1;
6153 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6154 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06006155
6156 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006157 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6158 ds_layout_ci.pNext = NULL;
6159 ds_layout_ci.bindingCount = 1;
6160 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006161 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006162 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6163 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006164 ASSERT_VK_SUCCESS(err);
6165
6166 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006167 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006168 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006169 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006170 alloc_info.descriptorPool = ds_pool;
6171 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006172 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6173 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006174 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006175
Tony Barboureb254902015-07-15 12:50:33 -06006176 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006177 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6178 sampler_ci.pNext = NULL;
6179 sampler_ci.magFilter = VK_FILTER_NEAREST;
6180 sampler_ci.minFilter = VK_FILTER_NEAREST;
6181 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6182 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6183 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6184 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6185 sampler_ci.mipLodBias = 1.0;
6186 sampler_ci.anisotropyEnable = VK_FALSE;
6187 sampler_ci.maxAnisotropy = 1;
6188 sampler_ci.compareEnable = VK_FALSE;
6189 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6190 sampler_ci.minLod = 1.0;
6191 sampler_ci.maxLod = 1.0;
6192 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6193 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06006194
Tobin Ehlis3b780662015-05-28 12:11:26 -06006195 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006196 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006197 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006198
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006199 VkDescriptorImageInfo info = {};
6200 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006201
6202 VkWriteDescriptorSet descriptor_write;
6203 memset(&descriptor_write, 0, sizeof(descriptor_write));
6204 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006205 descriptor_write.dstSet = descriptorSet;
6206 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006207 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006208 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006209 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006210 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006211
6212 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6213
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006214 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006215
Chia-I Wuf7458c52015-10-26 21:10:41 +08006216 vkDestroySampler(m_device->device(), sampler, NULL);
6217 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6218 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006219}
6220
Karl Schultz6addd812016-02-02 17:17:23 -07006221TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
6222 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
6223 // types
6224 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006225
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006227 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006228
Tobin Ehlis3b780662015-05-28 12:11:26 -06006229 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006230
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006231 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006232 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6233 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006234
6235 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006236 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6237 ds_pool_ci.pNext = NULL;
6238 ds_pool_ci.maxSets = 1;
6239 ds_pool_ci.poolSizeCount = 1;
6240 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006241
Tobin Ehlis3b780662015-05-28 12:11:26 -06006242 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006243 err =
6244 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006245 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06006246 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006247 dsl_binding.binding = 0;
6248 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6249 dsl_binding.descriptorCount = 1;
6250 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6251 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006252
Tony Barboureb254902015-07-15 12:50:33 -06006253 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006254 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6255 ds_layout_ci.pNext = NULL;
6256 ds_layout_ci.bindingCount = 1;
6257 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006258
Tobin Ehlis3b780662015-05-28 12:11:26 -06006259 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006260 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6261 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006262 ASSERT_VK_SUCCESS(err);
6263
6264 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006265 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006266 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006267 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006268 alloc_info.descriptorPool = ds_pool;
6269 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006270 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6271 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006272 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006273
Tony Barboureb254902015-07-15 12:50:33 -06006274 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006275 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6276 sampler_ci.pNext = NULL;
6277 sampler_ci.magFilter = VK_FILTER_NEAREST;
6278 sampler_ci.minFilter = VK_FILTER_NEAREST;
6279 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6280 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6281 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6282 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6283 sampler_ci.mipLodBias = 1.0;
6284 sampler_ci.anisotropyEnable = VK_FALSE;
6285 sampler_ci.maxAnisotropy = 1;
6286 sampler_ci.compareEnable = VK_FALSE;
6287 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6288 sampler_ci.minLod = 1.0;
6289 sampler_ci.maxLod = 1.0;
6290 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6291 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006292 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006293 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006294 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006295
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006296 VkDescriptorImageInfo info = {};
6297 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006298
6299 VkWriteDescriptorSet descriptor_write;
6300 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07006301 descriptor_write.sType =
6302 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006303 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006304 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006305 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006306 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006307 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006308
6309 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6310
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006311 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006312
Chia-I Wuf7458c52015-10-26 21:10:41 +08006313 vkDestroySampler(m_device->device(), sampler, NULL);
6314 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6315 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006316}
6317
Karl Schultz6addd812016-02-02 17:17:23 -07006318TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006319 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07006320 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006321
Karl Schultz6addd812016-02-02 17:17:23 -07006322 m_errorMonitor->SetDesiredFailureMsg(
6323 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006324 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006325
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006326 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006327 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
6328 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006329 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006330 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6331 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006332
6333 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006334 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6335 ds_pool_ci.pNext = NULL;
6336 ds_pool_ci.maxSets = 1;
6337 ds_pool_ci.poolSizeCount = 1;
6338 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006339
6340 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006341 err =
6342 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006343 ASSERT_VK_SUCCESS(err);
6344
6345 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006346 dsl_binding.binding = 0;
6347 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6348 dsl_binding.descriptorCount = 1;
6349 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6350 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006351
6352 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006353 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6354 ds_layout_ci.pNext = NULL;
6355 ds_layout_ci.bindingCount = 1;
6356 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006357 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006358 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6359 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006360 ASSERT_VK_SUCCESS(err);
6361
6362 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006363 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006364 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006365 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006366 alloc_info.descriptorPool = ds_pool;
6367 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006368 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6369 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006370 ASSERT_VK_SUCCESS(err);
6371
Karl Schultz6addd812016-02-02 17:17:23 -07006372 VkSampler sampler =
6373 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006374
6375 VkDescriptorImageInfo descriptor_info;
6376 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
6377 descriptor_info.sampler = sampler;
6378
6379 VkWriteDescriptorSet descriptor_write;
6380 memset(&descriptor_write, 0, sizeof(descriptor_write));
6381 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006382 descriptor_write.dstSet = descriptorSet;
6383 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006384 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006385 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6386 descriptor_write.pImageInfo = &descriptor_info;
6387
6388 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6389
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006390 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006391
Chia-I Wuf7458c52015-10-26 21:10:41 +08006392 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6393 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006394}
6395
Karl Schultz6addd812016-02-02 17:17:23 -07006396TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
6397 // Create a single combined Image/Sampler descriptor and send it an invalid
6398 // imageView
6399 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006400
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6402 "Attempted write update to combined "
6403 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -06006404 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006405
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006406 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006407 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006408 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6409 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006410
6411 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006412 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6413 ds_pool_ci.pNext = NULL;
6414 ds_pool_ci.maxSets = 1;
6415 ds_pool_ci.poolSizeCount = 1;
6416 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006417
6418 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006419 err =
6420 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006421 ASSERT_VK_SUCCESS(err);
6422
6423 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006424 dsl_binding.binding = 0;
6425 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6426 dsl_binding.descriptorCount = 1;
6427 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6428 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006429
6430 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006431 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6432 ds_layout_ci.pNext = NULL;
6433 ds_layout_ci.bindingCount = 1;
6434 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006435 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006436 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6437 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006438 ASSERT_VK_SUCCESS(err);
6439
6440 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006441 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006442 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006443 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006444 alloc_info.descriptorPool = ds_pool;
6445 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006446 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6447 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006448 ASSERT_VK_SUCCESS(err);
6449
6450 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006451 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6452 sampler_ci.pNext = NULL;
6453 sampler_ci.magFilter = VK_FILTER_NEAREST;
6454 sampler_ci.minFilter = VK_FILTER_NEAREST;
6455 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6456 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6457 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6458 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6459 sampler_ci.mipLodBias = 1.0;
6460 sampler_ci.anisotropyEnable = VK_FALSE;
6461 sampler_ci.maxAnisotropy = 1;
6462 sampler_ci.compareEnable = VK_FALSE;
6463 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6464 sampler_ci.minLod = 1.0;
6465 sampler_ci.maxLod = 1.0;
6466 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6467 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006468
6469 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006470 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006471 ASSERT_VK_SUCCESS(err);
6472
Karl Schultz6addd812016-02-02 17:17:23 -07006473 VkImageView view =
6474 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006475
6476 VkDescriptorImageInfo descriptor_info;
6477 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
6478 descriptor_info.sampler = sampler;
6479 descriptor_info.imageView = view;
6480
6481 VkWriteDescriptorSet descriptor_write;
6482 memset(&descriptor_write, 0, sizeof(descriptor_write));
6483 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006484 descriptor_write.dstSet = descriptorSet;
6485 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006486 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006487 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6488 descriptor_write.pImageInfo = &descriptor_info;
6489
6490 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6491
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006492 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006493
Chia-I Wuf7458c52015-10-26 21:10:41 +08006494 vkDestroySampler(m_device->device(), sampler, NULL);
6495 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6496 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006497}
6498
Karl Schultz6addd812016-02-02 17:17:23 -07006499TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
6500 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
6501 // into the other
6502 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006503
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006504 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6505 " binding #1 with type "
6506 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
6507 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006508
Tobin Ehlis04356f92015-10-27 16:35:27 -06006509 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006510 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006511 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006512 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6513 ds_type_count[0].descriptorCount = 1;
6514 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
6515 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006516
6517 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006518 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6519 ds_pool_ci.pNext = NULL;
6520 ds_pool_ci.maxSets = 1;
6521 ds_pool_ci.poolSizeCount = 2;
6522 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006523
6524 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006525 err =
6526 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006527 ASSERT_VK_SUCCESS(err);
6528 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006529 dsl_binding[0].binding = 0;
6530 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6531 dsl_binding[0].descriptorCount = 1;
6532 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6533 dsl_binding[0].pImmutableSamplers = NULL;
6534 dsl_binding[1].binding = 1;
6535 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6536 dsl_binding[1].descriptorCount = 1;
6537 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
6538 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006539
6540 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006541 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6542 ds_layout_ci.pNext = NULL;
6543 ds_layout_ci.bindingCount = 2;
6544 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006545
6546 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006547 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6548 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006549 ASSERT_VK_SUCCESS(err);
6550
6551 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006552 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006553 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006554 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006555 alloc_info.descriptorPool = ds_pool;
6556 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006557 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6558 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006559 ASSERT_VK_SUCCESS(err);
6560
6561 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006562 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6563 sampler_ci.pNext = NULL;
6564 sampler_ci.magFilter = VK_FILTER_NEAREST;
6565 sampler_ci.minFilter = VK_FILTER_NEAREST;
6566 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6567 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6568 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6569 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6570 sampler_ci.mipLodBias = 1.0;
6571 sampler_ci.anisotropyEnable = VK_FALSE;
6572 sampler_ci.maxAnisotropy = 1;
6573 sampler_ci.compareEnable = VK_FALSE;
6574 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6575 sampler_ci.minLod = 1.0;
6576 sampler_ci.maxLod = 1.0;
6577 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6578 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006579
6580 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006581 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006582 ASSERT_VK_SUCCESS(err);
6583
6584 VkDescriptorImageInfo info = {};
6585 info.sampler = sampler;
6586
6587 VkWriteDescriptorSet descriptor_write;
6588 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
6589 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006590 descriptor_write.dstSet = descriptorSet;
6591 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08006592 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006593 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6594 descriptor_write.pImageInfo = &info;
6595 // This write update should succeed
6596 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6597 // Now perform a copy update that fails due to type mismatch
6598 VkCopyDescriptorSet copy_ds_update;
6599 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6600 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6601 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06006602 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006603 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006604 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08006605 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006606 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6607
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006608 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006609 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006610 m_errorMonitor->SetDesiredFailureMsg(
6611 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006612 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -06006613 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6614 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6615 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006616 copy_ds_update.srcBinding =
6617 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006618 copy_ds_update.dstSet = descriptorSet;
6619 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06006620 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006621 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6622
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006623 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006624
Tobin Ehlis04356f92015-10-27 16:35:27 -06006625 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006626 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006627 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
6628 "update array offset of 0 and update of "
6629 "5 descriptors oversteps total number "
6630 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006631
Tobin Ehlis04356f92015-10-27 16:35:27 -06006632 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6633 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6634 copy_ds_update.srcSet = descriptorSet;
6635 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006636 copy_ds_update.dstSet = descriptorSet;
6637 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006638 copy_ds_update.descriptorCount =
6639 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06006640 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6641
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006642 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006643
Chia-I Wuf7458c52015-10-26 21:10:41 +08006644 vkDestroySampler(m_device->device(), sampler, NULL);
6645 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6646 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006647}
6648
Karl Schultz6addd812016-02-02 17:17:23 -07006649TEST_F(VkLayerTest, NumSamplesMismatch) {
6650 // Create CommandBuffer where MSAA samples doesn't match RenderPass
6651 // sampleCount
6652 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006653
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006655 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006656
Tobin Ehlis3b780662015-05-28 12:11:26 -06006657 ASSERT_NO_FATAL_FAILURE(InitState());
6658 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006659 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06006660 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006661 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006662
6663 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006664 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6665 ds_pool_ci.pNext = NULL;
6666 ds_pool_ci.maxSets = 1;
6667 ds_pool_ci.poolSizeCount = 1;
6668 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006669
Tobin Ehlis3b780662015-05-28 12:11:26 -06006670 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006671 err =
6672 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006673 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006674
Tony Barboureb254902015-07-15 12:50:33 -06006675 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08006676 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06006677 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08006678 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006679 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6680 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006681
Tony Barboureb254902015-07-15 12:50:33 -06006682 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6683 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6684 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006685 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006686 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006687
Tobin Ehlis3b780662015-05-28 12:11:26 -06006688 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006689 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6690 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006691 ASSERT_VK_SUCCESS(err);
6692
6693 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006694 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006695 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006696 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006697 alloc_info.descriptorPool = ds_pool;
6698 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006699 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6700 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006701 ASSERT_VK_SUCCESS(err);
6702
Tony Barboureb254902015-07-15 12:50:33 -06006703 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006704 pipe_ms_state_ci.sType =
6705 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6706 pipe_ms_state_ci.pNext = NULL;
6707 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6708 pipe_ms_state_ci.sampleShadingEnable = 0;
6709 pipe_ms_state_ci.minSampleShading = 1.0;
6710 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006711
Tony Barboureb254902015-07-15 12:50:33 -06006712 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006713 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6714 pipeline_layout_ci.pNext = NULL;
6715 pipeline_layout_ci.setLayoutCount = 1;
6716 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006717
6718 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006719 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6720 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006721 ASSERT_VK_SUCCESS(err);
6722
Karl Schultz6addd812016-02-02 17:17:23 -07006723 VkShaderObj vs(m_device, bindStateVertShaderText,
6724 VK_SHADER_STAGE_VERTEX_BIT, this);
6725 VkShaderObj fs(m_device, bindStateFragShaderText,
6726 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006727 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006728 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006729 VkPipelineObj pipe(m_device);
6730 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006731 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006732 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006733 pipe.SetMSAA(&pipe_ms_state_ci);
6734 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006735
Tony Barbourfe3351b2015-07-28 10:17:20 -06006736 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006737 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6738 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006739
Mark Young29927482016-05-04 14:38:51 -06006740 // Render triangle (the error should trigger on the attempt to draw).
6741 Draw(3, 1, 0, 0);
6742
6743 // Finalize recording of the command buffer
6744 EndCommandBuffer();
6745
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006746 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006747
Chia-I Wuf7458c52015-10-26 21:10:41 +08006748 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6749 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6750 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006751}
Mark Young29927482016-05-04 14:38:51 -06006752
Mark Youngc89c6312016-03-31 16:03:20 -06006753TEST_F(VkLayerTest, NumBlendAttachMismatch) {
6754 // Create Pipeline where the number of blend attachments doesn't match the
6755 // number of color attachments. In this case, we don't add any color
6756 // blend attachments even though we have a color attachment.
6757 VkResult err;
6758
6759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -06006760 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -06006761
6762 ASSERT_NO_FATAL_FAILURE(InitState());
6763 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6764 VkDescriptorPoolSize ds_type_count = {};
6765 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6766 ds_type_count.descriptorCount = 1;
6767
6768 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6769 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6770 ds_pool_ci.pNext = NULL;
6771 ds_pool_ci.maxSets = 1;
6772 ds_pool_ci.poolSizeCount = 1;
6773 ds_pool_ci.pPoolSizes = &ds_type_count;
6774
6775 VkDescriptorPool ds_pool;
6776 err =
6777 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6778 ASSERT_VK_SUCCESS(err);
6779
6780 VkDescriptorSetLayoutBinding dsl_binding = {};
6781 dsl_binding.binding = 0;
6782 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6783 dsl_binding.descriptorCount = 1;
6784 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6785 dsl_binding.pImmutableSamplers = NULL;
6786
6787 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6788 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6789 ds_layout_ci.pNext = NULL;
6790 ds_layout_ci.bindingCount = 1;
6791 ds_layout_ci.pBindings = &dsl_binding;
6792
6793 VkDescriptorSetLayout ds_layout;
6794 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6795 &ds_layout);
6796 ASSERT_VK_SUCCESS(err);
6797
6798 VkDescriptorSet descriptorSet;
6799 VkDescriptorSetAllocateInfo alloc_info = {};
6800 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6801 alloc_info.descriptorSetCount = 1;
6802 alloc_info.descriptorPool = ds_pool;
6803 alloc_info.pSetLayouts = &ds_layout;
6804 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6805 &descriptorSet);
6806 ASSERT_VK_SUCCESS(err);
6807
6808 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
6809 pipe_ms_state_ci.sType =
6810 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6811 pipe_ms_state_ci.pNext = NULL;
6812 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6813 pipe_ms_state_ci.sampleShadingEnable = 0;
6814 pipe_ms_state_ci.minSampleShading = 1.0;
6815 pipe_ms_state_ci.pSampleMask = NULL;
6816
6817 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6818 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6819 pipeline_layout_ci.pNext = NULL;
6820 pipeline_layout_ci.setLayoutCount = 1;
6821 pipeline_layout_ci.pSetLayouts = &ds_layout;
6822
6823 VkPipelineLayout pipeline_layout;
6824 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6825 &pipeline_layout);
6826 ASSERT_VK_SUCCESS(err);
6827
6828 VkShaderObj vs(m_device, bindStateVertShaderText,
6829 VK_SHADER_STAGE_VERTEX_BIT, this);
6830 VkShaderObj fs(m_device, bindStateFragShaderText,
6831 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006832 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06006833 // but add it to be able to run on more devices
6834 VkPipelineObj pipe(m_device);
6835 pipe.AddShader(&vs);
6836 pipe.AddShader(&fs);
6837 pipe.SetMSAA(&pipe_ms_state_ci);
6838 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6839
6840 BeginCommandBuffer();
6841 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6842 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6843
Mark Young29927482016-05-04 14:38:51 -06006844 // Render triangle (the error should trigger on the attempt to draw).
6845 Draw(3, 1, 0, 0);
6846
6847 // Finalize recording of the command buffer
6848 EndCommandBuffer();
6849
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006850 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06006851
6852 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6853 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6854 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6855}
Mark Young29927482016-05-04 14:38:51 -06006856
Karl Schultz6addd812016-02-02 17:17:23 -07006857TEST_F(VkLayerTest, ClearCmdNoDraw) {
6858 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
6859 // to issuing a Draw
6860 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006861
Karl Schultz6addd812016-02-02 17:17:23 -07006862 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07006863 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006864 "vkCmdClearAttachments() issued on CB object ");
6865
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006866 ASSERT_NO_FATAL_FAILURE(InitState());
6867 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006868
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006869 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006870 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6871 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006872
6873 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006874 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6875 ds_pool_ci.pNext = NULL;
6876 ds_pool_ci.maxSets = 1;
6877 ds_pool_ci.poolSizeCount = 1;
6878 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006879
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006880 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006881 err =
6882 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006883 ASSERT_VK_SUCCESS(err);
6884
Tony Barboureb254902015-07-15 12:50:33 -06006885 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006886 dsl_binding.binding = 0;
6887 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6888 dsl_binding.descriptorCount = 1;
6889 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6890 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006891
Tony Barboureb254902015-07-15 12:50:33 -06006892 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006893 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6894 ds_layout_ci.pNext = NULL;
6895 ds_layout_ci.bindingCount = 1;
6896 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006897
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006898 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006899 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6900 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006901 ASSERT_VK_SUCCESS(err);
6902
6903 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006904 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006905 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006906 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006907 alloc_info.descriptorPool = ds_pool;
6908 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006909 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6910 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006911 ASSERT_VK_SUCCESS(err);
6912
Tony Barboureb254902015-07-15 12:50:33 -06006913 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006914 pipe_ms_state_ci.sType =
6915 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6916 pipe_ms_state_ci.pNext = NULL;
6917 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6918 pipe_ms_state_ci.sampleShadingEnable = 0;
6919 pipe_ms_state_ci.minSampleShading = 1.0;
6920 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006921
Tony Barboureb254902015-07-15 12:50:33 -06006922 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006923 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6924 pipeline_layout_ci.pNext = NULL;
6925 pipeline_layout_ci.setLayoutCount = 1;
6926 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006927
6928 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006929 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6930 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006931 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006932
Karl Schultz6addd812016-02-02 17:17:23 -07006933 VkShaderObj vs(m_device, bindStateVertShaderText,
6934 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006935 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006936 // on more devices
6937 VkShaderObj fs(m_device, bindStateFragShaderText,
6938 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006939
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006940 VkPipelineObj pipe(m_device);
6941 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006942 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006943 pipe.SetMSAA(&pipe_ms_state_ci);
6944 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006945
6946 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006947
Karl Schultz6addd812016-02-02 17:17:23 -07006948 // Main thing we care about for this test is that the VkImage obj we're
6949 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006950 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006951 VkClearAttachment color_attachment;
6952 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6953 color_attachment.clearValue.color.float32[0] = 1.0;
6954 color_attachment.clearValue.color.float32[1] = 1.0;
6955 color_attachment.clearValue.color.float32[2] = 1.0;
6956 color_attachment.clearValue.color.float32[3] = 1.0;
6957 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006958 VkClearRect clear_rect = {
6959 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006960
Karl Schultz6addd812016-02-02 17:17:23 -07006961 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
6962 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006963
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006964 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006965
Chia-I Wuf7458c52015-10-26 21:10:41 +08006966 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6967 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6968 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006969}
6970
Karl Schultz6addd812016-02-02 17:17:23 -07006971TEST_F(VkLayerTest, VtxBufferBadIndex) {
6972 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006973
Karl Schultz6addd812016-02-02 17:17:23 -07006974 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006975 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07006976 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006977
Tobin Ehlis502480b2015-06-24 15:53:07 -06006978 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06006979 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06006980 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006981
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006982 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006983 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6984 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006985
6986 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006987 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6988 ds_pool_ci.pNext = NULL;
6989 ds_pool_ci.maxSets = 1;
6990 ds_pool_ci.poolSizeCount = 1;
6991 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006992
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006993 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006994 err =
6995 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006996 ASSERT_VK_SUCCESS(err);
6997
Tony Barboureb254902015-07-15 12:50:33 -06006998 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006999 dsl_binding.binding = 0;
7000 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7001 dsl_binding.descriptorCount = 1;
7002 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7003 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007004
Tony Barboureb254902015-07-15 12:50:33 -06007005 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007006 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7007 ds_layout_ci.pNext = NULL;
7008 ds_layout_ci.bindingCount = 1;
7009 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007010
Tobin Ehlis502480b2015-06-24 15:53:07 -06007011 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007012 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7013 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007014 ASSERT_VK_SUCCESS(err);
7015
7016 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007017 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007018 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007019 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007020 alloc_info.descriptorPool = ds_pool;
7021 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007022 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7023 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007024 ASSERT_VK_SUCCESS(err);
7025
Tony Barboureb254902015-07-15 12:50:33 -06007026 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007027 pipe_ms_state_ci.sType =
7028 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7029 pipe_ms_state_ci.pNext = NULL;
7030 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7031 pipe_ms_state_ci.sampleShadingEnable = 0;
7032 pipe_ms_state_ci.minSampleShading = 1.0;
7033 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007034
Tony Barboureb254902015-07-15 12:50:33 -06007035 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007036 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7037 pipeline_layout_ci.pNext = NULL;
7038 pipeline_layout_ci.setLayoutCount = 1;
7039 pipeline_layout_ci.pSetLayouts = &ds_layout;
7040 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007041
Karl Schultz6addd812016-02-02 17:17:23 -07007042 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7043 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007044 ASSERT_VK_SUCCESS(err);
7045
Karl Schultz6addd812016-02-02 17:17:23 -07007046 VkShaderObj vs(m_device, bindStateVertShaderText,
7047 VK_SHADER_STAGE_VERTEX_BIT, this);
7048 VkShaderObj fs(m_device, bindStateFragShaderText,
7049 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06007050 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07007051 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007052 VkPipelineObj pipe(m_device);
7053 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007054 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06007055 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007056 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007057 pipe.SetViewport(m_viewports);
7058 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007059 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007060
7061 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007062 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7063 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06007064 // Don't care about actual data, just need to get to draw to flag error
7065 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07007066 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
7067 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06007068 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06007069 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007070
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007071 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007072
Chia-I Wuf7458c52015-10-26 21:10:41 +08007073 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7074 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7075 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007076}
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06007077// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
7078TEST_F(VkLayerTest, InvalidImageLayout) {
7079 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
7080 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
7081 "images in the wrong layout when they're copied or transitioned.");
7082 // 3 in ValidateCmdBufImageLayouts
7083 // * -1 Attempt to submit cmd buf w/ deleted image
7084 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
7085 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
7086 m_errorMonitor->SetDesiredFailureMsg(
7087 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7088 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
7089
7090 ASSERT_NO_FATAL_FAILURE(InitState());
7091 // Create src & dst images to use for copy operations
7092 VkImage src_image;
7093 VkImage dst_image;
7094
7095 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7096 const int32_t tex_width = 32;
7097 const int32_t tex_height = 32;
7098
7099 VkImageCreateInfo image_create_info = {};
7100 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7101 image_create_info.pNext = NULL;
7102 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7103 image_create_info.format = tex_format;
7104 image_create_info.extent.width = tex_width;
7105 image_create_info.extent.height = tex_height;
7106 image_create_info.extent.depth = 1;
7107 image_create_info.mipLevels = 1;
7108 image_create_info.arrayLayers = 4;
7109 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7110 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7111 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7112 image_create_info.flags = 0;
7113
7114 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
7115 ASSERT_VK_SUCCESS(err);
7116 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
7117 ASSERT_VK_SUCCESS(err);
7118
7119 BeginCommandBuffer();
7120 VkImageCopy copyRegion;
7121 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7122 copyRegion.srcSubresource.mipLevel = 0;
7123 copyRegion.srcSubresource.baseArrayLayer = 0;
7124 copyRegion.srcSubresource.layerCount = 1;
7125 copyRegion.srcOffset.x = 0;
7126 copyRegion.srcOffset.y = 0;
7127 copyRegion.srcOffset.z = 0;
7128 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7129 copyRegion.dstSubresource.mipLevel = 0;
7130 copyRegion.dstSubresource.baseArrayLayer = 0;
7131 copyRegion.dstSubresource.layerCount = 1;
7132 copyRegion.dstOffset.x = 0;
7133 copyRegion.dstOffset.y = 0;
7134 copyRegion.dstOffset.z = 0;
7135 copyRegion.extent.width = 1;
7136 copyRegion.extent.height = 1;
7137 copyRegion.extent.depth = 1;
7138 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7139 m_errorMonitor->VerifyFound();
7140 // Now cause error due to src image layout changing
7141 m_errorMonitor->SetDesiredFailureMsg(
7142 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7143 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
7144 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7145 m_errorMonitor->VerifyFound();
7146 // Final src error is due to bad layout type
7147 m_errorMonitor->SetDesiredFailureMsg(
7148 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7149 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
7150 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7151 m_errorMonitor->VerifyFound();
7152 // Now verify same checks for dst
7153 m_errorMonitor->SetDesiredFailureMsg(
7154 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7155 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
7156 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7157 m_errorMonitor->VerifyFound();
7158 // Now cause error due to src image layout changing
7159 m_errorMonitor->SetDesiredFailureMsg(
7160 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7161 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
7162 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
7163 m_errorMonitor->VerifyFound();
7164 m_errorMonitor->SetDesiredFailureMsg(
7165 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7166 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
7167 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
7168 m_errorMonitor->VerifyFound();
7169 // Now cause error due to bad image layout transition in PipelineBarrier
7170 VkImageMemoryBarrier image_barrier[1] = {};
7171 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7172 image_barrier[0].image = src_image;
7173 image_barrier[0].subresourceRange.layerCount = 2;
7174 image_barrier[0].subresourceRange.levelCount = 2;
7175 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7176 m_errorMonitor->SetDesiredFailureMsg(
7177 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7178 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
7179 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
7180 m_errorMonitor->VerifyFound();
7181
7182 // Finally some layout errors at RenderPass create time
7183 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
7184 VkAttachmentReference attach = {};
7185 // perf warning for GENERAL layout w/ non-DS input attachment
7186 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7187 VkSubpassDescription subpass = {};
7188 subpass.inputAttachmentCount = 1;
7189 subpass.pInputAttachments = &attach;
7190 VkRenderPassCreateInfo rpci = {};
7191 rpci.subpassCount = 1;
7192 rpci.pSubpasses = &subpass;
7193 rpci.attachmentCount = 1;
7194 VkAttachmentDescription attach_desc = {};
7195 attach_desc.format = VK_FORMAT_UNDEFINED;
7196 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -06007197 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06007198 VkRenderPass rp;
7199 m_errorMonitor->SetDesiredFailureMsg(
7200 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7201 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
7202 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7203 m_errorMonitor->VerifyFound();
7204 // error w/ non-general layout
7205 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7206
7207 m_errorMonitor->SetDesiredFailureMsg(
7208 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7209 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
7210 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7211 m_errorMonitor->VerifyFound();
7212 subpass.inputAttachmentCount = 0;
7213 subpass.colorAttachmentCount = 1;
7214 subpass.pColorAttachments = &attach;
7215 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7216 // perf warning for GENERAL layout on color attachment
7217 m_errorMonitor->SetDesiredFailureMsg(
7218 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7219 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
7220 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7221 m_errorMonitor->VerifyFound();
7222 // error w/ non-color opt or GENERAL layout for color attachment
7223 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7224 m_errorMonitor->SetDesiredFailureMsg(
7225 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7226 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
7227 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7228 m_errorMonitor->VerifyFound();
7229 subpass.colorAttachmentCount = 0;
7230 subpass.pDepthStencilAttachment = &attach;
7231 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7232 // perf warning for GENERAL layout on DS attachment
7233 m_errorMonitor->SetDesiredFailureMsg(
7234 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7235 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
7236 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7237 m_errorMonitor->VerifyFound();
7238 // error w/ non-ds opt or GENERAL layout for color attachment
7239 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7240 m_errorMonitor->SetDesiredFailureMsg(
7241 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7242 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
7243 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7244 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -06007245 // For this error we need a valid renderpass so create default one
7246 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7247 attach.attachment = 0;
7248 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
7249 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
7250 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
7251 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
7252 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
7253 // Can't do a CLEAR load on READ_ONLY initialLayout
7254 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
7255 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7256 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
7257 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7258 " with invalid first layout "
7259 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
7260 "ONLY_OPTIMAL");
7261 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7262 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06007263
7264 vkDestroyImage(m_device->device(), src_image, NULL);
7265 vkDestroyImage(m_device->device(), dst_image, NULL);
7266}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007267#endif // DRAW_STATE_TESTS
7268
Tobin Ehlis0788f522015-05-26 16:11:58 -06007269#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06007270#if GTEST_IS_THREADSAFE
7271struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007272 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007273 VkEvent event;
7274 bool bailout;
7275};
7276
Karl Schultz6addd812016-02-02 17:17:23 -07007277extern "C" void *AddToCommandBuffer(void *arg) {
7278 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007279
Karl Schultz6addd812016-02-02 17:17:23 -07007280 for (int i = 0; i < 10000; i++) {
7281 vkCmdSetEvent(data->commandBuffer, data->event,
7282 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007283 if (data->bailout) {
7284 break;
7285 }
7286 }
7287 return NULL;
7288}
7289
Karl Schultz6addd812016-02-02 17:17:23 -07007290TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007291 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007292
Karl Schultz6addd812016-02-02 17:17:23 -07007293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7294 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007295
Mike Stroyanaccf7692015-05-12 16:00:45 -06007296 ASSERT_NO_FATAL_FAILURE(InitState());
7297 ASSERT_NO_FATAL_FAILURE(InitViewport());
7298 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7299
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007300 // Calls AllocateCommandBuffers
7301 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06007302
7303 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007304 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007305
7306 VkEventCreateInfo event_info;
7307 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06007308 VkResult err;
7309
7310 memset(&event_info, 0, sizeof(event_info));
7311 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
7312
Chia-I Wuf7458c52015-10-26 21:10:41 +08007313 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007314 ASSERT_VK_SUCCESS(err);
7315
Mike Stroyanaccf7692015-05-12 16:00:45 -06007316 err = vkResetEvent(device(), event);
7317 ASSERT_VK_SUCCESS(err);
7318
7319 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007320 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007321 data.event = event;
7322 data.bailout = false;
7323 m_errorMonitor->SetBailout(&data.bailout);
7324 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007325 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007326 // Add many entries to command buffer from this thread at the same time.
7327 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06007328
Mike Stroyan4268d1f2015-07-13 14:45:35 -06007329 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007330 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007331
Mike Stroyan10b8cb72016-01-22 15:22:03 -07007332 m_errorMonitor->SetBailout(NULL);
7333
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007334 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06007335
Chia-I Wuf7458c52015-10-26 21:10:41 +08007336 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06007337}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007338#endif // GTEST_IS_THREADSAFE
7339#endif // THREADING_TESTS
7340
Chris Forbes9f7ff632015-05-25 11:13:08 +12007341#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007342TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007343 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007344 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007345
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007346 ASSERT_NO_FATAL_FAILURE(InitState());
7347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7348
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007349 VkShaderModule module;
7350 VkShaderModuleCreateInfo moduleCreateInfo;
7351 struct icd_spv_header spv;
7352
7353 spv.magic = ICD_SPV_MAGIC;
7354 spv.version = ICD_SPV_VERSION;
7355 spv.gen_magic = 0;
7356
7357 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7358 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007359 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007360 moduleCreateInfo.codeSize = 4;
7361 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007362 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007363
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007364 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007365}
7366
Karl Schultz6addd812016-02-02 17:17:23 -07007367TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007368 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007369 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007370
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007371 ASSERT_NO_FATAL_FAILURE(InitState());
7372 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7373
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007374 VkShaderModule module;
7375 VkShaderModuleCreateInfo moduleCreateInfo;
7376 struct icd_spv_header spv;
7377
7378 spv.magic = ~ICD_SPV_MAGIC;
7379 spv.version = ICD_SPV_VERSION;
7380 spv.gen_magic = 0;
7381
7382 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7383 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007384 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007385 moduleCreateInfo.codeSize = sizeof(spv) + 10;
7386 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007387 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007388
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007389 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007390}
7391
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007392#if 0
7393// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07007394TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007396 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007397
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007398 ASSERT_NO_FATAL_FAILURE(InitState());
7399 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7400
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007401 VkShaderModule module;
7402 VkShaderModuleCreateInfo moduleCreateInfo;
7403 struct icd_spv_header spv;
7404
7405 spv.magic = ICD_SPV_MAGIC;
7406 spv.version = ~ICD_SPV_VERSION;
7407 spv.gen_magic = 0;
7408
7409 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7410 moduleCreateInfo.pNext = NULL;
7411
Karl Schultz6addd812016-02-02 17:17:23 -07007412 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007413 moduleCreateInfo.codeSize = sizeof(spv) + 10;
7414 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007415 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007416
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007417 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007418}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12007419#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06007420
Karl Schultz6addd812016-02-02 17:17:23 -07007421TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007422 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007423 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007424
Chris Forbes9f7ff632015-05-25 11:13:08 +12007425 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007426 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12007427
7428 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007429 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12007430 "\n"
7431 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007432 "out gl_PerVertex {\n"
7433 " vec4 gl_Position;\n"
7434 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12007435 "void main(){\n"
7436 " gl_Position = vec4(1);\n"
7437 " x = 0;\n"
7438 "}\n";
7439 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007440 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12007441 "\n"
7442 "layout(location=0) out vec4 color;\n"
7443 "void main(){\n"
7444 " color = vec4(1);\n"
7445 "}\n";
7446
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007447 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7448 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12007449
7450 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007451 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12007452 pipe.AddShader(&vs);
7453 pipe.AddShader(&fs);
7454
Chris Forbes9f7ff632015-05-25 11:13:08 +12007455 VkDescriptorSetObj descriptorSet(m_device);
7456 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007457 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12007458
Tony Barbour5781e8f2015-08-04 16:23:11 -06007459 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12007460
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007461 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12007462}
Chris Forbes9f7ff632015-05-25 11:13:08 +12007463
Karl Schultz6addd812016-02-02 17:17:23 -07007464TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007466 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007467
Chris Forbes59cb88d2015-05-25 11:13:13 +12007468 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007469 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12007470
7471 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007472 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12007473 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007474 "out gl_PerVertex {\n"
7475 " vec4 gl_Position;\n"
7476 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12007477 "void main(){\n"
7478 " gl_Position = vec4(1);\n"
7479 "}\n";
7480 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007481 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12007482 "\n"
7483 "layout(location=0) in float x;\n"
7484 "layout(location=0) out vec4 color;\n"
7485 "void main(){\n"
7486 " color = vec4(x);\n"
7487 "}\n";
7488
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007489 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7490 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12007491
7492 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007493 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12007494 pipe.AddShader(&vs);
7495 pipe.AddShader(&fs);
7496
Chris Forbes59cb88d2015-05-25 11:13:13 +12007497 VkDescriptorSetObj descriptorSet(m_device);
7498 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007499 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12007500
Tony Barbour5781e8f2015-08-04 16:23:11 -06007501 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12007502
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007503 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12007504}
7505
Karl Schultz6addd812016-02-02 17:17:23 -07007506TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13007507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007508 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13007509
7510 ASSERT_NO_FATAL_FAILURE(InitState());
7511 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7512
7513 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007514 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007515 "\n"
7516 "out gl_PerVertex {\n"
7517 " vec4 gl_Position;\n"
7518 "};\n"
7519 "void main(){\n"
7520 " gl_Position = vec4(1);\n"
7521 "}\n";
7522 char const *fsSource =
7523 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007524 "\n"
7525 "in block { layout(location=0) float x; } ins;\n"
7526 "layout(location=0) out vec4 color;\n"
7527 "void main(){\n"
7528 " color = vec4(ins.x);\n"
7529 "}\n";
7530
7531 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7532 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7533
7534 VkPipelineObj pipe(m_device);
7535 pipe.AddColorAttachment();
7536 pipe.AddShader(&vs);
7537 pipe.AddShader(&fs);
7538
7539 VkDescriptorSetObj descriptorSet(m_device);
7540 descriptorSet.AppendDummy();
7541 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7542
7543 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7544
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007545 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13007546}
7547
Karl Schultz6addd812016-02-02 17:17:23 -07007548TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13007549 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13007550 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07007551 "output arr[2] of float32' vs 'ptr to "
7552 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13007553
7554 ASSERT_NO_FATAL_FAILURE(InitState());
7555 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7556
7557 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007558 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13007559 "\n"
7560 "layout(location=0) out float x[2];\n"
7561 "out gl_PerVertex {\n"
7562 " vec4 gl_Position;\n"
7563 "};\n"
7564 "void main(){\n"
7565 " x[0] = 0; x[1] = 0;\n"
7566 " gl_Position = vec4(1);\n"
7567 "}\n";
7568 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007569 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13007570 "\n"
7571 "layout(location=0) in float x[3];\n"
7572 "layout(location=0) out vec4 color;\n"
7573 "void main(){\n"
7574 " color = vec4(x[0] + x[1] + x[2]);\n"
7575 "}\n";
7576
7577 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7578 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7579
7580 VkPipelineObj pipe(m_device);
7581 pipe.AddColorAttachment();
7582 pipe.AddShader(&vs);
7583 pipe.AddShader(&fs);
7584
7585 VkDescriptorSetObj descriptorSet(m_device);
7586 descriptorSet.AppendDummy();
7587 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7588
7589 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7590
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007591 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13007592}
7593
Karl Schultz6addd812016-02-02 17:17:23 -07007594TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007595 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007596 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007597
Chris Forbesb56af562015-05-25 11:13:17 +12007598 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007599 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12007600
7601 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007602 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007603 "\n"
7604 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007605 "out gl_PerVertex {\n"
7606 " vec4 gl_Position;\n"
7607 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007608 "void main(){\n"
7609 " x = 0;\n"
7610 " gl_Position = vec4(1);\n"
7611 "}\n";
7612 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007613 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007614 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007615 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12007616 "layout(location=0) out vec4 color;\n"
7617 "void main(){\n"
7618 " color = vec4(x);\n"
7619 "}\n";
7620
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007621 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7622 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12007623
7624 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007625 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12007626 pipe.AddShader(&vs);
7627 pipe.AddShader(&fs);
7628
Chris Forbesb56af562015-05-25 11:13:17 +12007629 VkDescriptorSetObj descriptorSet(m_device);
7630 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007631 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12007632
Tony Barbour5781e8f2015-08-04 16:23:11 -06007633 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12007634
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007635 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12007636}
7637
Karl Schultz6addd812016-02-02 17:17:23 -07007638TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13007639 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007640 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13007641
7642 ASSERT_NO_FATAL_FAILURE(InitState());
7643 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7644
7645 char const *vsSource =
7646 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007647 "\n"
7648 "out block { layout(location=0) int x; } outs;\n"
7649 "out gl_PerVertex {\n"
7650 " vec4 gl_Position;\n"
7651 "};\n"
7652 "void main(){\n"
7653 " outs.x = 0;\n"
7654 " gl_Position = vec4(1);\n"
7655 "}\n";
7656 char const *fsSource =
7657 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007658 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007659 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13007660 "layout(location=0) out vec4 color;\n"
7661 "void main(){\n"
7662 " color = vec4(ins.x);\n"
7663 "}\n";
7664
7665 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7666 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7667
7668 VkPipelineObj pipe(m_device);
7669 pipe.AddColorAttachment();
7670 pipe.AddShader(&vs);
7671 pipe.AddShader(&fs);
7672
7673 VkDescriptorSetObj descriptorSet(m_device);
7674 descriptorSet.AppendDummy();
7675 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7676
7677 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7678
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007679 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13007680}
7681
7682TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
7683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7684 "location 0.0 which is not written by vertex shader");
7685
7686 ASSERT_NO_FATAL_FAILURE(InitState());
7687 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7688
7689 char const *vsSource =
7690 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007691 "\n"
7692 "out block { layout(location=1) float x; } outs;\n"
7693 "out gl_PerVertex {\n"
7694 " vec4 gl_Position;\n"
7695 "};\n"
7696 "void main(){\n"
7697 " outs.x = 0;\n"
7698 " gl_Position = vec4(1);\n"
7699 "}\n";
7700 char const *fsSource =
7701 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007702 "\n"
7703 "in block { layout(location=0) float x; } ins;\n"
7704 "layout(location=0) out vec4 color;\n"
7705 "void main(){\n"
7706 " color = vec4(ins.x);\n"
7707 "}\n";
7708
7709 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7710 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7711
7712 VkPipelineObj pipe(m_device);
7713 pipe.AddColorAttachment();
7714 pipe.AddShader(&vs);
7715 pipe.AddShader(&fs);
7716
7717 VkDescriptorSetObj descriptorSet(m_device);
7718 descriptorSet.AppendDummy();
7719 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7720
7721 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7722
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007723 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13007724}
7725
7726TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
7727 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7728 "location 0.1 which is not written by vertex shader");
7729
7730 ASSERT_NO_FATAL_FAILURE(InitState());
7731 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7732
7733 char const *vsSource =
7734 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007735 "\n"
7736 "out block { layout(location=0, component=0) float x; } outs;\n"
7737 "out gl_PerVertex {\n"
7738 " vec4 gl_Position;\n"
7739 "};\n"
7740 "void main(){\n"
7741 " outs.x = 0;\n"
7742 " gl_Position = vec4(1);\n"
7743 "}\n";
7744 char const *fsSource =
7745 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007746 "\n"
7747 "in block { layout(location=0, component=1) float x; } ins;\n"
7748 "layout(location=0) out vec4 color;\n"
7749 "void main(){\n"
7750 " color = vec4(ins.x);\n"
7751 "}\n";
7752
7753 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7754 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7755
7756 VkPipelineObj pipe(m_device);
7757 pipe.AddColorAttachment();
7758 pipe.AddShader(&vs);
7759 pipe.AddShader(&fs);
7760
7761 VkDescriptorSetObj descriptorSet(m_device);
7762 descriptorSet.AppendDummy();
7763 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7764
7765 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7766
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007767 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13007768}
7769
Karl Schultz6addd812016-02-02 17:17:23 -07007770TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007772 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007773
Chris Forbesde136e02015-05-25 11:13:28 +12007774 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007775 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12007776
7777 VkVertexInputBindingDescription input_binding;
7778 memset(&input_binding, 0, sizeof(input_binding));
7779
7780 VkVertexInputAttributeDescription input_attrib;
7781 memset(&input_attrib, 0, sizeof(input_attrib));
7782 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7783
7784 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007785 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007786 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007787 "out gl_PerVertex {\n"
7788 " vec4 gl_Position;\n"
7789 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007790 "void main(){\n"
7791 " gl_Position = vec4(1);\n"
7792 "}\n";
7793 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007794 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007795 "\n"
7796 "layout(location=0) out vec4 color;\n"
7797 "void main(){\n"
7798 " color = vec4(1);\n"
7799 "}\n";
7800
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007801 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7802 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12007803
7804 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007805 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12007806 pipe.AddShader(&vs);
7807 pipe.AddShader(&fs);
7808
7809 pipe.AddVertexInputBindings(&input_binding, 1);
7810 pipe.AddVertexInputAttribs(&input_attrib, 1);
7811
Chris Forbesde136e02015-05-25 11:13:28 +12007812 VkDescriptorSetObj descriptorSet(m_device);
7813 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007814 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12007815
Tony Barbour5781e8f2015-08-04 16:23:11 -06007816 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12007817
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007818 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12007819}
7820
Karl Schultz6addd812016-02-02 17:17:23 -07007821TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007822 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007823 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13007824
7825 ASSERT_NO_FATAL_FAILURE(InitState());
7826 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7827
7828 VkVertexInputBindingDescription input_binding;
7829 memset(&input_binding, 0, sizeof(input_binding));
7830
7831 VkVertexInputAttributeDescription input_attrib;
7832 memset(&input_attrib, 0, sizeof(input_attrib));
7833 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7834
7835 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007836 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007837 "\n"
7838 "layout(location=1) in float x;\n"
7839 "out gl_PerVertex {\n"
7840 " vec4 gl_Position;\n"
7841 "};\n"
7842 "void main(){\n"
7843 " gl_Position = vec4(x);\n"
7844 "}\n";
7845 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007846 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007847 "\n"
7848 "layout(location=0) out vec4 color;\n"
7849 "void main(){\n"
7850 " color = vec4(1);\n"
7851 "}\n";
7852
7853 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7854 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7855
7856 VkPipelineObj pipe(m_device);
7857 pipe.AddColorAttachment();
7858 pipe.AddShader(&vs);
7859 pipe.AddShader(&fs);
7860
7861 pipe.AddVertexInputBindings(&input_binding, 1);
7862 pipe.AddVertexInputAttribs(&input_attrib, 1);
7863
7864 VkDescriptorSetObj descriptorSet(m_device);
7865 descriptorSet.AppendDummy();
7866 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7867
7868 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7869
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007870 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13007871}
7872
Karl Schultz6addd812016-02-02 17:17:23 -07007873TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
7874 m_errorMonitor->SetDesiredFailureMsg(
7875 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007876 "VS consumes input at location 0 but not provided");
7877
Chris Forbes62e8e502015-05-25 11:13:29 +12007878 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007879 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12007880
7881 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007882 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007883 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007884 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07007885 "out gl_PerVertex {\n"
7886 " vec4 gl_Position;\n"
7887 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007888 "void main(){\n"
7889 " gl_Position = x;\n"
7890 "}\n";
7891 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007892 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007893 "\n"
7894 "layout(location=0) out vec4 color;\n"
7895 "void main(){\n"
7896 " color = vec4(1);\n"
7897 "}\n";
7898
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007899 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7900 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12007901
7902 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007903 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12007904 pipe.AddShader(&vs);
7905 pipe.AddShader(&fs);
7906
Chris Forbes62e8e502015-05-25 11:13:29 +12007907 VkDescriptorSetObj descriptorSet(m_device);
7908 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007909 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12007910
Tony Barbour5781e8f2015-08-04 16:23:11 -06007911 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12007912
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007913 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12007914}
7915
Karl Schultz6addd812016-02-02 17:17:23 -07007916TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
7917 m_errorMonitor->SetDesiredFailureMsg(
7918 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007919 "location 0 does not match VS input type");
7920
Chris Forbesc97d98e2015-05-25 11:13:31 +12007921 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007922 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12007923
7924 VkVertexInputBindingDescription input_binding;
7925 memset(&input_binding, 0, sizeof(input_binding));
7926
7927 VkVertexInputAttributeDescription input_attrib;
7928 memset(&input_attrib, 0, sizeof(input_attrib));
7929 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7930
7931 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007932 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007933 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007934 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007935 "out gl_PerVertex {\n"
7936 " vec4 gl_Position;\n"
7937 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007938 "void main(){\n"
7939 " gl_Position = vec4(x);\n"
7940 "}\n";
7941 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007942 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007943 "\n"
7944 "layout(location=0) out vec4 color;\n"
7945 "void main(){\n"
7946 " color = vec4(1);\n"
7947 "}\n";
7948
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007949 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7950 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12007951
7952 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007953 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12007954 pipe.AddShader(&vs);
7955 pipe.AddShader(&fs);
7956
7957 pipe.AddVertexInputBindings(&input_binding, 1);
7958 pipe.AddVertexInputAttribs(&input_attrib, 1);
7959
Chris Forbesc97d98e2015-05-25 11:13:31 +12007960 VkDescriptorSetObj descriptorSet(m_device);
7961 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007962 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12007963
Tony Barbour5781e8f2015-08-04 16:23:11 -06007964 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12007965
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007966 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12007967}
7968
Chris Forbesc68b43c2016-04-06 11:18:47 +12007969TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
7970 m_errorMonitor->SetDesiredFailureMsg(
7971 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7972 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
7973
7974 ASSERT_NO_FATAL_FAILURE(InitState());
7975 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7976
7977 char const *vsSource =
7978 "#version 450\n"
7979 "\n"
7980 "out gl_PerVertex {\n"
7981 " vec4 gl_Position;\n"
7982 "};\n"
7983 "void main(){\n"
7984 " gl_Position = vec4(1);\n"
7985 "}\n";
7986 char const *fsSource =
7987 "#version 450\n"
7988 "\n"
7989 "layout(location=0) out vec4 color;\n"
7990 "void main(){\n"
7991 " color = vec4(1);\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(&vs);
8001 pipe.AddShader(&fs);
8002
8003 VkDescriptorSetObj descriptorSet(m_device);
8004 descriptorSet.AppendDummy();
8005 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8006
8007 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8008
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008009 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12008010}
8011
Karl Schultz6addd812016-02-02 17:17:23 -07008012TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008013 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13008014
8015 ASSERT_NO_FATAL_FAILURE(InitState());
8016 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8017
8018 VkVertexInputBindingDescription input_binding;
8019 memset(&input_binding, 0, sizeof(input_binding));
8020
8021 VkVertexInputAttributeDescription input_attribs[2];
8022 memset(input_attribs, 0, sizeof(input_attribs));
8023
8024 for (int i = 0; i < 2; i++) {
8025 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
8026 input_attribs[i].location = i;
8027 }
8028
8029 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008030 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008031 "\n"
8032 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07008033 "out gl_PerVertex {\n"
8034 " vec4 gl_Position;\n"
8035 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008036 "void main(){\n"
8037 " gl_Position = x[0] + x[1];\n"
8038 "}\n";
8039 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008040 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008041 "\n"
8042 "layout(location=0) out vec4 color;\n"
8043 "void main(){\n"
8044 " color = vec4(1);\n"
8045 "}\n";
8046
8047 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8048 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8049
8050 VkPipelineObj pipe(m_device);
8051 pipe.AddColorAttachment();
8052 pipe.AddShader(&vs);
8053 pipe.AddShader(&fs);
8054
8055 pipe.AddVertexInputBindings(&input_binding, 1);
8056 pipe.AddVertexInputAttribs(input_attribs, 2);
8057
8058 VkDescriptorSetObj descriptorSet(m_device);
8059 descriptorSet.AppendDummy();
8060 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8061
8062 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8063
8064 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008065 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13008066}
8067
Chris Forbes2682b242015-11-24 11:13:14 +13008068TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
8069{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008070 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13008071
8072 ASSERT_NO_FATAL_FAILURE(InitState());
8073 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8074
8075 VkVertexInputBindingDescription input_binding;
8076 memset(&input_binding, 0, sizeof(input_binding));
8077
8078 VkVertexInputAttributeDescription input_attribs[2];
8079 memset(input_attribs, 0, sizeof(input_attribs));
8080
8081 for (int i = 0; i < 2; i++) {
8082 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
8083 input_attribs[i].location = i;
8084 }
8085
8086 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008087 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008088 "\n"
8089 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07008090 "out gl_PerVertex {\n"
8091 " vec4 gl_Position;\n"
8092 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008093 "void main(){\n"
8094 " gl_Position = x[0] + x[1];\n"
8095 "}\n";
8096 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008097 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008098 "\n"
8099 "layout(location=0) out vec4 color;\n"
8100 "void main(){\n"
8101 " color = vec4(1);\n"
8102 "}\n";
8103
8104 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8105 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8106
8107 VkPipelineObj pipe(m_device);
8108 pipe.AddColorAttachment();
8109 pipe.AddShader(&vs);
8110 pipe.AddShader(&fs);
8111
8112 pipe.AddVertexInputBindings(&input_binding, 1);
8113 pipe.AddVertexInputAttribs(input_attribs, 2);
8114
8115 VkDescriptorSetObj descriptorSet(m_device);
8116 descriptorSet.AppendDummy();
8117 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8118
8119 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8120
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008121 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13008122}
Chris Forbes2682b242015-11-24 11:13:14 +13008123
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008124TEST_F(VkLayerTest, CreatePipelineSimplePositive)
8125{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008126 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008127
8128 ASSERT_NO_FATAL_FAILURE(InitState());
8129 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8130
8131 char const *vsSource =
8132 "#version 450\n"
8133 "out gl_PerVertex {\n"
8134 " vec4 gl_Position;\n"
8135 "};\n"
8136 "void main(){\n"
8137 " gl_Position = vec4(0);\n"
8138 "}\n";
8139 char const *fsSource =
8140 "#version 450\n"
8141 "\n"
8142 "layout(location=0) out vec4 color;\n"
8143 "void main(){\n"
8144 " color = vec4(1);\n"
8145 "}\n";
8146
8147 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8148 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8149
8150 VkPipelineObj pipe(m_device);
8151 pipe.AddColorAttachment();
8152 pipe.AddShader(&vs);
8153 pipe.AddShader(&fs);
8154
8155 VkDescriptorSetObj descriptorSet(m_device);
8156 descriptorSet.AppendDummy();
8157 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8158
8159 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8160
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008161 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008162}
8163
Chris Forbes912c9192016-04-05 17:50:35 +12008164TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
8165{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008166 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12008167
8168 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
8169
8170 ASSERT_NO_FATAL_FAILURE(InitState());
8171 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8172
8173 char const *vsSource =
8174 "#version 450\n"
8175 "out gl_PerVertex {\n"
8176 " vec4 gl_Position;\n"
8177 "};\n"
8178 "layout(location=0) out vec3 x;\n"
8179 "layout(location=1) out ivec3 y;\n"
8180 "layout(location=2) out vec3 z;\n"
8181 "void main(){\n"
8182 " gl_Position = vec4(0);\n"
8183 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
8184 "}\n";
8185 char const *fsSource =
8186 "#version 450\n"
8187 "\n"
8188 "layout(location=0) out vec4 color;\n"
8189 "layout(location=0) in float x;\n"
8190 "layout(location=1) flat in int y;\n"
8191 "layout(location=2) in vec2 z;\n"
8192 "void main(){\n"
8193 " color = vec4(1 + x + y + z.x);\n"
8194 "}\n";
8195
8196 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8197 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8198
8199 VkPipelineObj pipe(m_device);
8200 pipe.AddColorAttachment();
8201 pipe.AddShader(&vs);
8202 pipe.AddShader(&fs);
8203
8204 VkDescriptorSetObj descriptorSet(m_device);
8205 descriptorSet.AppendDummy();
8206 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8207
8208 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8209
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008210 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12008211}
8212
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008213TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
8214{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008215 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008216
8217 ASSERT_NO_FATAL_FAILURE(InitState());
8218 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8219
Chris Forbesc1e852d2016-04-04 19:26:42 +12008220 if (!m_device->phy().features().tessellationShader) {
8221 printf("Device does not support tessellation shaders; skipped.\n");
8222 return;
8223 }
8224
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008225 char const *vsSource =
8226 "#version 450\n"
8227 "void main(){}\n";
8228 char const *tcsSource =
8229 "#version 450\n"
8230 "layout(location=0) out int x[];\n"
8231 "layout(vertices=3) out;\n"
8232 "void main(){\n"
8233 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
8234 " gl_TessLevelInner[0] = 1;\n"
8235 " x[gl_InvocationID] = gl_InvocationID;\n"
8236 "}\n";
8237 char const *tesSource =
8238 "#version 450\n"
8239 "layout(triangles, equal_spacing, cw) in;\n"
8240 "layout(location=0) in int x[];\n"
8241 "out gl_PerVertex { vec4 gl_Position; };\n"
8242 "void main(){\n"
8243 " gl_Position.xyz = gl_TessCoord;\n"
8244 " gl_Position.w = x[0] + x[1] + x[2];\n"
8245 "}\n";
8246 char const *fsSource =
8247 "#version 450\n"
8248 "layout(location=0) out vec4 color;\n"
8249 "void main(){\n"
8250 " color = vec4(1);\n"
8251 "}\n";
8252
8253 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8254 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
8255 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
8256 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8257
8258 VkPipelineInputAssemblyStateCreateInfo iasci{
8259 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
8260 nullptr,
8261 0,
8262 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
8263 VK_FALSE};
8264
Chris Forbesb4cacb62016-04-04 19:15:00 +12008265 VkPipelineTessellationStateCreateInfo tsci{
8266 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
8267 nullptr,
8268 0,
8269 3};
8270
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008271 VkPipelineObj pipe(m_device);
8272 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12008273 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008274 pipe.AddColorAttachment();
8275 pipe.AddShader(&vs);
8276 pipe.AddShader(&tcs);
8277 pipe.AddShader(&tes);
8278 pipe.AddShader(&fs);
8279
8280 VkDescriptorSetObj descriptorSet(m_device);
8281 descriptorSet.AppendDummy();
8282 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8283
8284 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8285
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008286 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008287}
8288
Chris Forbesa0ab8152016-04-20 13:34:27 +12008289TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
8290{
8291 m_errorMonitor->ExpectSuccess();
8292
8293 ASSERT_NO_FATAL_FAILURE(InitState());
8294 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8295
8296 if (!m_device->phy().features().geometryShader) {
8297 printf("Device does not support geometry shaders; skipped.\n");
8298 return;
8299 }
8300
8301 char const *vsSource =
8302 "#version 450\n"
8303 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
8304 "void main(){\n"
8305 " vs_out.x = vec4(1);\n"
8306 "}\n";
8307 char const *gsSource =
8308 "#version 450\n"
8309 "layout(triangles) in;\n"
8310 "layout(triangle_strip, max_vertices=3) out;\n"
8311 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
8312 "out gl_PerVertex { vec4 gl_Position; };\n"
8313 "void main() {\n"
8314 " gl_Position = gs_in[0].x;\n"
8315 " EmitVertex();\n"
8316 "}\n";
8317 char const *fsSource =
8318 "#version 450\n"
8319 "layout(location=0) out vec4 color;\n"
8320 "void main(){\n"
8321 " color = vec4(1);\n"
8322 "}\n";
8323
8324 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8325 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
8326 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8327
8328 VkPipelineObj pipe(m_device);
8329 pipe.AddColorAttachment();
8330 pipe.AddShader(&vs);
8331 pipe.AddShader(&gs);
8332 pipe.AddShader(&fs);
8333
8334 VkDescriptorSetObj descriptorSet(m_device);
8335 descriptorSet.AppendDummy();
8336 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8337
8338 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8339
8340 m_errorMonitor->VerifyNotFound();
8341}
8342
Chris Forbesa0193bc2016-04-04 19:19:47 +12008343TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
8344{
8345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8346 "is per-vertex in tessellation control shader stage "
8347 "but per-patch in tessellation evaluation shader stage");
8348
8349 ASSERT_NO_FATAL_FAILURE(InitState());
8350 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8351
Chris Forbesc1e852d2016-04-04 19:26:42 +12008352 if (!m_device->phy().features().tessellationShader) {
8353 printf("Device does not support tessellation shaders; skipped.\n");
8354 return;
8355 }
8356
Chris Forbesa0193bc2016-04-04 19:19:47 +12008357 char const *vsSource =
8358 "#version 450\n"
8359 "void main(){}\n";
8360 char const *tcsSource =
8361 "#version 450\n"
8362 "layout(location=0) out int x[];\n"
8363 "layout(vertices=3) out;\n"
8364 "void main(){\n"
8365 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
8366 " gl_TessLevelInner[0] = 1;\n"
8367 " x[gl_InvocationID] = gl_InvocationID;\n"
8368 "}\n";
8369 char const *tesSource =
8370 "#version 450\n"
8371 "layout(triangles, equal_spacing, cw) in;\n"
8372 "layout(location=0) patch in int x;\n"
8373 "out gl_PerVertex { vec4 gl_Position; };\n"
8374 "void main(){\n"
8375 " gl_Position.xyz = gl_TessCoord;\n"
8376 " gl_Position.w = x;\n"
8377 "}\n";
8378 char const *fsSource =
8379 "#version 450\n"
8380 "layout(location=0) out vec4 color;\n"
8381 "void main(){\n"
8382 " color = vec4(1);\n"
8383 "}\n";
8384
8385 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8386 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
8387 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
8388 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8389
8390 VkPipelineInputAssemblyStateCreateInfo iasci{
8391 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
8392 nullptr,
8393 0,
8394 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
8395 VK_FALSE};
8396
8397 VkPipelineTessellationStateCreateInfo tsci{
8398 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
8399 nullptr,
8400 0,
8401 3};
8402
8403 VkPipelineObj pipe(m_device);
8404 pipe.SetInputAssembly(&iasci);
8405 pipe.SetTessellation(&tsci);
8406 pipe.AddColorAttachment();
8407 pipe.AddShader(&vs);
8408 pipe.AddShader(&tcs);
8409 pipe.AddShader(&tes);
8410 pipe.AddShader(&fs);
8411
8412 VkDescriptorSetObj descriptorSet(m_device);
8413 descriptorSet.AppendDummy();
8414 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8415
8416 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8417
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008418 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12008419}
8420
Karl Schultz6addd812016-02-02 17:17:23 -07008421TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
8422 m_errorMonitor->SetDesiredFailureMsg(
8423 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008424 "Duplicate vertex input binding descriptions for binding 0");
8425
Chris Forbes280ba2c2015-06-12 11:16:41 +12008426 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008427 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12008428
8429 /* Two binding descriptions for binding 0 */
8430 VkVertexInputBindingDescription input_bindings[2];
8431 memset(input_bindings, 0, sizeof(input_bindings));
8432
8433 VkVertexInputAttributeDescription input_attrib;
8434 memset(&input_attrib, 0, sizeof(input_attrib));
8435 input_attrib.format = VK_FORMAT_R32_SFLOAT;
8436
8437 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008438 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12008439 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008440 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07008441 "out gl_PerVertex {\n"
8442 " vec4 gl_Position;\n"
8443 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12008444 "void main(){\n"
8445 " gl_Position = vec4(x);\n"
8446 "}\n";
8447 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008448 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12008449 "\n"
8450 "layout(location=0) out vec4 color;\n"
8451 "void main(){\n"
8452 " color = vec4(1);\n"
8453 "}\n";
8454
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008455 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8456 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12008457
8458 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008459 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12008460 pipe.AddShader(&vs);
8461 pipe.AddShader(&fs);
8462
8463 pipe.AddVertexInputBindings(input_bindings, 2);
8464 pipe.AddVertexInputAttribs(&input_attrib, 1);
8465
Chris Forbes280ba2c2015-06-12 11:16:41 +12008466 VkDescriptorSetObj descriptorSet(m_device);
8467 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008468 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12008469
Tony Barbour5781e8f2015-08-04 16:23:11 -06008470 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12008471
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008472 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12008473}
Chris Forbes8f68b562015-05-25 11:13:32 +12008474
Chris Forbes35efec72016-04-21 14:32:08 +12008475TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
8476 m_errorMonitor->ExpectSuccess();
8477
8478 ASSERT_NO_FATAL_FAILURE(InitState());
8479 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8480
8481 if (!m_device->phy().features().tessellationShader) {
8482 printf("Device does not support 64bit vertex attributes; skipped.\n");
8483 return;
8484 }
8485
8486 VkVertexInputBindingDescription input_bindings[1];
8487 memset(input_bindings, 0, sizeof(input_bindings));
8488
8489 VkVertexInputAttributeDescription input_attribs[4];
8490 memset(input_attribs, 0, sizeof(input_attribs));
8491 input_attribs[0].location = 0;
8492 input_attribs[0].offset = 0;
8493 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8494 input_attribs[1].location = 2;
8495 input_attribs[1].offset = 32;
8496 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8497 input_attribs[2].location = 4;
8498 input_attribs[2].offset = 64;
8499 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8500 input_attribs[3].location = 6;
8501 input_attribs[3].offset = 96;
8502 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
8503
8504 char const *vsSource =
8505 "#version 450\n"
8506 "\n"
8507 "layout(location=0) in dmat4 x;\n"
8508 "out gl_PerVertex {\n"
8509 " vec4 gl_Position;\n"
8510 "};\n"
8511 "void main(){\n"
8512 " gl_Position = vec4(x[0][0]);\n"
8513 "}\n";
8514 char const *fsSource =
8515 "#version 450\n"
8516 "\n"
8517 "layout(location=0) out vec4 color;\n"
8518 "void main(){\n"
8519 " color = vec4(1);\n"
8520 "}\n";
8521
8522 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8523 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8524
8525 VkPipelineObj pipe(m_device);
8526 pipe.AddColorAttachment();
8527 pipe.AddShader(&vs);
8528 pipe.AddShader(&fs);
8529
8530 pipe.AddVertexInputBindings(input_bindings, 1);
8531 pipe.AddVertexInputAttribs(input_attribs, 4);
8532
8533 VkDescriptorSetObj descriptorSet(m_device);
8534 descriptorSet.AppendDummy();
8535 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8536
8537 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8538
8539 m_errorMonitor->VerifyNotFound();
8540}
8541
Karl Schultz6addd812016-02-02 17:17:23 -07008542TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008543 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008544 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008545
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008546 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008547
8548 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008549 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008550 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008551 "out gl_PerVertex {\n"
8552 " vec4 gl_Position;\n"
8553 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008554 "void main(){\n"
8555 " gl_Position = vec4(1);\n"
8556 "}\n";
8557 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008558 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008559 "\n"
8560 "void main(){\n"
8561 "}\n";
8562
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008563 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8564 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008565
8566 VkPipelineObj pipe(m_device);
8567 pipe.AddShader(&vs);
8568 pipe.AddShader(&fs);
8569
Chia-I Wu08accc62015-07-07 11:50:03 +08008570 /* set up CB 0, not written */
8571 pipe.AddColorAttachment();
8572 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008573
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008574 VkDescriptorSetObj descriptorSet(m_device);
8575 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008576 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008577
Tony Barbour5781e8f2015-08-04 16:23:11 -06008578 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008579
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008580 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12008581}
8582
Karl Schultz6addd812016-02-02 17:17:23 -07008583TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07008584 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008585 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008586 "FS writes to output location 1 with no matching attachment");
8587
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008588 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008589
8590 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008591 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008592 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008593 "out gl_PerVertex {\n"
8594 " vec4 gl_Position;\n"
8595 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008596 "void main(){\n"
8597 " gl_Position = vec4(1);\n"
8598 "}\n";
8599 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008600 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008601 "\n"
8602 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008603 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008604 "void main(){\n"
8605 " x = vec4(1);\n"
8606 " y = vec4(1);\n"
8607 "}\n";
8608
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008609 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8610 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008611
8612 VkPipelineObj pipe(m_device);
8613 pipe.AddShader(&vs);
8614 pipe.AddShader(&fs);
8615
Chia-I Wu08accc62015-07-07 11:50:03 +08008616 /* set up CB 0, not written */
8617 pipe.AddColorAttachment();
8618 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008619 /* FS writes CB 1, but we don't configure it */
8620
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008621 VkDescriptorSetObj descriptorSet(m_device);
8622 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008623 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008624
Tony Barbour5781e8f2015-08-04 16:23:11 -06008625 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008626
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008627 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008628}
8629
Karl Schultz6addd812016-02-02 17:17:23 -07008630TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008631 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008632 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008633
Chris Forbesa36d69e2015-05-25 11:13:44 +12008634 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008635
8636 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008637 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008638 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008639 "out gl_PerVertex {\n"
8640 " vec4 gl_Position;\n"
8641 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008642 "void main(){\n"
8643 " gl_Position = vec4(1);\n"
8644 "}\n";
8645 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008646 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008647 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008648 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12008649 "void main(){\n"
8650 " x = ivec4(1);\n"
8651 "}\n";
8652
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008653 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8654 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12008655
8656 VkPipelineObj pipe(m_device);
8657 pipe.AddShader(&vs);
8658 pipe.AddShader(&fs);
8659
Chia-I Wu08accc62015-07-07 11:50:03 +08008660 /* set up CB 0; type is UNORM by default */
8661 pipe.AddColorAttachment();
8662 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008663
Chris Forbesa36d69e2015-05-25 11:13:44 +12008664 VkDescriptorSetObj descriptorSet(m_device);
8665 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008666 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12008667
Tony Barbour5781e8f2015-08-04 16:23:11 -06008668 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008669
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008670 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12008671}
Chris Forbes7b1b8932015-06-05 14:43:36 +12008672
Karl Schultz6addd812016-02-02 17:17:23 -07008673TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008675 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008676
Chris Forbes556c76c2015-08-14 12:04:59 +12008677 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12008678
8679 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008680 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008681 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008682 "out gl_PerVertex {\n"
8683 " vec4 gl_Position;\n"
8684 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008685 "void main(){\n"
8686 " gl_Position = vec4(1);\n"
8687 "}\n";
8688 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008689 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008690 "\n"
8691 "layout(location=0) out vec4 x;\n"
8692 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
8693 "void main(){\n"
8694 " x = vec4(bar.y);\n"
8695 "}\n";
8696
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008697 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8698 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12008699
Chris Forbes556c76c2015-08-14 12:04:59 +12008700 VkPipelineObj pipe(m_device);
8701 pipe.AddShader(&vs);
8702 pipe.AddShader(&fs);
8703
8704 /* set up CB 0; type is UNORM by default */
8705 pipe.AddColorAttachment();
8706 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8707
8708 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008709 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12008710
8711 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8712
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008713 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12008714}
8715
Chris Forbes5c59e902016-02-26 16:56:09 +13008716TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
8717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8718 "not declared in layout");
8719
8720 ASSERT_NO_FATAL_FAILURE(InitState());
8721
8722 char const *vsSource =
8723 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13008724 "\n"
8725 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
8726 "out gl_PerVertex {\n"
8727 " vec4 gl_Position;\n"
8728 "};\n"
8729 "void main(){\n"
8730 " gl_Position = vec4(consts.x);\n"
8731 "}\n";
8732 char const *fsSource =
8733 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13008734 "\n"
8735 "layout(location=0) out vec4 x;\n"
8736 "void main(){\n"
8737 " x = vec4(1);\n"
8738 "}\n";
8739
8740 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8741 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8742
8743 VkPipelineObj pipe(m_device);
8744 pipe.AddShader(&vs);
8745 pipe.AddShader(&fs);
8746
8747 /* set up CB 0; type is UNORM by default */
8748 pipe.AddColorAttachment();
8749 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8750
8751 VkDescriptorSetObj descriptorSet(m_device);
8752 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8753
8754 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8755
8756 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008757 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13008758}
8759
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008760#endif // SHADER_CHECKER_TESTS
8761
8762#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06008763TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07008764 m_errorMonitor->SetDesiredFailureMsg(
8765 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008766 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008767
8768 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008769
8770 // Create an image
8771 VkImage image;
8772
Karl Schultz6addd812016-02-02 17:17:23 -07008773 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8774 const int32_t tex_width = 32;
8775 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008776
8777 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008778 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8779 image_create_info.pNext = NULL;
8780 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8781 image_create_info.format = tex_format;
8782 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008783 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07008784 image_create_info.extent.depth = 1;
8785 image_create_info.mipLevels = 1;
8786 image_create_info.arrayLayers = 1;
8787 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8788 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8789 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8790 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008791
8792 // Introduce error by sending down a bogus width extent
8793 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008794 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008795
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008796 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008797}
8798
Mark Youngc48c4c12016-04-11 14:26:49 -06008799TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
8800 m_errorMonitor->SetDesiredFailureMsg(
8801 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8802 "CreateImage extents is 0 for at least one required dimension");
8803
8804 ASSERT_NO_FATAL_FAILURE(InitState());
8805
8806 // Create an image
8807 VkImage image;
8808
8809 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8810 const int32_t tex_width = 32;
8811 const int32_t tex_height = 32;
8812
8813 VkImageCreateInfo image_create_info = {};
8814 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8815 image_create_info.pNext = NULL;
8816 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8817 image_create_info.format = tex_format;
8818 image_create_info.extent.width = tex_width;
8819 image_create_info.extent.height = tex_height;
8820 image_create_info.extent.depth = 1;
8821 image_create_info.mipLevels = 1;
8822 image_create_info.arrayLayers = 1;
8823 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8824 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8825 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8826 image_create_info.flags = 0;
8827
8828 // Introduce error by sending down a bogus width extent
8829 image_create_info.extent.width = 0;
8830 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8831
8832 m_errorMonitor->VerifyFound();
8833}
8834
Karl Schultz6addd812016-02-02 17:17:23 -07008835TEST_F(VkLayerTest, UpdateBufferAlignment) {
8836 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06008837
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008838 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008839 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008840
Mike Stroyana3082432015-09-25 13:39:21 -06008841 ASSERT_NO_FATAL_FAILURE(InitState());
8842
8843 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8844 vk_testing::Buffer buffer;
8845 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8846
8847 BeginCommandBuffer();
8848 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008849 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008850 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008851
Mike Stroyana3082432015-09-25 13:39:21 -06008852 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008854 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008855
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008856 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008857 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008858 EndCommandBuffer();
8859}
8860
Karl Schultz6addd812016-02-02 17:17:23 -07008861TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008863 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06008864
8865 ASSERT_NO_FATAL_FAILURE(InitState());
8866
8867 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8868 vk_testing::Buffer buffer;
8869 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8870
8871 BeginCommandBuffer();
8872 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008873 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008874 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008875
Mike Stroyana3082432015-09-25 13:39:21 -06008876 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008878 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008879
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008880 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008881
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008882 m_errorMonitor->VerifyFound();
8883
Mike Stroyana3082432015-09-25 13:39:21 -06008884 EndCommandBuffer();
8885}
8886
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008887#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12008888
Tobin Ehliscde08892015-09-22 10:11:37 -06008889#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07008890TEST_F(VkLayerTest, InvalidImageView) {
8891 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06008892
Karl Schultz6addd812016-02-02 17:17:23 -07008893 m_errorMonitor->SetDesiredFailureMsg(
8894 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008895 "vkCreateImageView called with baseMipLevel 10 ");
8896
Tobin Ehliscde08892015-09-22 10:11:37 -06008897 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06008898
Mike Stroyana3082432015-09-25 13:39:21 -06008899 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07008900 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06008901
Karl Schultz6addd812016-02-02 17:17:23 -07008902 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8903 const int32_t tex_width = 32;
8904 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06008905
8906 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008907 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8908 image_create_info.pNext = NULL;
8909 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8910 image_create_info.format = tex_format;
8911 image_create_info.extent.width = tex_width;
8912 image_create_info.extent.height = tex_height;
8913 image_create_info.extent.depth = 1;
8914 image_create_info.mipLevels = 1;
8915 image_create_info.arrayLayers = 1;
8916 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8917 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8918 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8919 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06008920
Chia-I Wuf7458c52015-10-26 21:10:41 +08008921 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06008922 ASSERT_VK_SUCCESS(err);
8923
8924 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008925 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8926 image_view_create_info.image = image;
8927 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8928 image_view_create_info.format = tex_format;
8929 image_view_create_info.subresourceRange.layerCount = 1;
8930 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
8931 image_view_create_info.subresourceRange.levelCount = 1;
8932 image_view_create_info.subresourceRange.aspectMask =
8933 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06008934
8935 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008936 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8937 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06008938
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008939 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06008940}
Mike Stroyana3082432015-09-25 13:39:21 -06008941
Karl Schultz6addd812016-02-02 17:17:23 -07008942TEST_F(VkLayerTest, InvalidImageViewAspect) {
8943 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008944
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008946 "vkCreateImageView: Color image "
8947 "formats must have ONLY the "
8948 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008949
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008950 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008951
8952 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07008953 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008954
Karl Schultz6addd812016-02-02 17:17:23 -07008955 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8956 const int32_t tex_width = 32;
8957 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008958
8959 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008960 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8961 image_create_info.pNext = NULL;
8962 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8963 image_create_info.format = tex_format;
8964 image_create_info.extent.width = tex_width;
8965 image_create_info.extent.height = tex_height;
8966 image_create_info.extent.depth = 1;
8967 image_create_info.mipLevels = 1;
8968 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8969 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8970 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8971 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008972
Chia-I Wuf7458c52015-10-26 21:10:41 +08008973 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008974 ASSERT_VK_SUCCESS(err);
8975
8976 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008977 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8978 image_view_create_info.image = image;
8979 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8980 image_view_create_info.format = tex_format;
8981 image_view_create_info.subresourceRange.baseMipLevel = 0;
8982 image_view_create_info.subresourceRange.levelCount = 1;
8983 // Cause an error by setting an invalid image aspect
8984 image_view_create_info.subresourceRange.aspectMask =
8985 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008986
8987 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008988 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8989 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008990
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008991 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008992}
8993
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008994TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008995 VkResult err;
8996 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008997
Karl Schultz6addd812016-02-02 17:17:23 -07008998 m_errorMonitor->SetDesiredFailureMsg(
8999 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009000 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009001
Mike Stroyana3082432015-09-25 13:39:21 -06009002 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009003
9004 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009005 VkImage srcImage;
9006 VkImage dstImage;
9007 VkDeviceMemory srcMem;
9008 VkDeviceMemory destMem;
9009 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009010
9011 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009012 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9013 image_create_info.pNext = NULL;
9014 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9015 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9016 image_create_info.extent.width = 32;
9017 image_create_info.extent.height = 32;
9018 image_create_info.extent.depth = 1;
9019 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009020 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07009021 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9022 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9023 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9024 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009025
Karl Schultz6addd812016-02-02 17:17:23 -07009026 err =
9027 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009028 ASSERT_VK_SUCCESS(err);
9029
Karl Schultz6addd812016-02-02 17:17:23 -07009030 err =
9031 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009032 ASSERT_VK_SUCCESS(err);
9033
9034 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009035 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009036 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9037 memAlloc.pNext = NULL;
9038 memAlloc.allocationSize = 0;
9039 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009040
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009041 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009042 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009043 pass =
9044 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009045 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009046 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009047 ASSERT_VK_SUCCESS(err);
9048
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009049 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009050 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009051 pass =
9052 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009053 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009054 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009055 ASSERT_VK_SUCCESS(err);
9056
9057 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9058 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009059 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009060 ASSERT_VK_SUCCESS(err);
9061
9062 BeginCommandBuffer();
9063 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009064 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009065 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009066 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009067 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06009068 copyRegion.srcOffset.x = 0;
9069 copyRegion.srcOffset.y = 0;
9070 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009071 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009072 copyRegion.dstSubresource.mipLevel = 0;
9073 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009074 // Introduce failure by forcing the dst layerCount to differ from src
9075 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009076 copyRegion.dstOffset.x = 0;
9077 copyRegion.dstOffset.y = 0;
9078 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009079 copyRegion.extent.width = 1;
9080 copyRegion.extent.height = 1;
9081 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009082 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9083 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009084 EndCommandBuffer();
9085
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009086 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009087
Chia-I Wuf7458c52015-10-26 21:10:41 +08009088 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009089 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009090 vkFreeMemory(m_device->device(), srcMem, NULL);
9091 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009092}
9093
Tony Barbourd6673642016-05-05 14:46:39 -06009094TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
9095
9096 TEST_DESCRIPTION("Creating images with unsuported formats ");
9097
9098 ASSERT_NO_FATAL_FAILURE(InitState());
9099 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9100 VkImageObj image(m_device);
9101 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9102 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
9103 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
9104 VK_IMAGE_TILING_OPTIMAL, 0);
9105 ASSERT_TRUE(image.initialized());
9106
9107 VkFormat unsupported = VK_FORMAT_UNDEFINED;
9108 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9109 VkFormat format = static_cast<VkFormat>(f);
9110 VkFormatProperties fProps = m_device->format_properties(format);
9111 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
9112 fProps.optimalTilingFeatures == 0) {
9113 unsupported = format;
9114 break;
9115 }
9116 }
9117 if (unsupported != VK_FORMAT_UNDEFINED) {
9118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9119 "vkCreateImage parameter, "
9120 "VkFormat pCreateInfo->format, "
9121 "contains unsupported format");
9122 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
9123 VkImageCreateInfo image_create_info;
9124 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9125 image_create_info.pNext = NULL;
9126 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9127 image_create_info.format = unsupported;
9128 image_create_info.extent.width = 32;
9129 image_create_info.extent.height = 32;
9130 image_create_info.extent.depth = 1;
9131 image_create_info.mipLevels = 1;
9132 image_create_info.arrayLayers = 1;
9133 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9134 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9135 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9136 image_create_info.flags = 0;
9137
9138 VkImage localImage;
9139 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
9140 m_errorMonitor->VerifyFound();
9141
9142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9143 "vkCreateRenderPass parameter, "
9144 "VkFormat in "
9145 "pCreateInfo->pAttachments");
9146 // Create renderpass with unsupported format - Expect FORMAT_UNSUPPORTED
9147 VkAttachmentDescription att;
9148 att.format = unsupported;
9149 att.samples = VK_SAMPLE_COUNT_1_BIT;
9150 att.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
9151 att.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
9152 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
9153 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
9154 att.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9155 att.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9156
9157 VkRenderPassCreateInfo rp_info = {};
9158 VkRenderPass rp;
9159 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9160 rp_info.attachmentCount = 1;
9161 rp_info.pAttachments = &att;
9162 rp_info.subpassCount = 0;
9163 rp_info.pSubpasses = NULL;
9164 vkCreateRenderPass(m_device->handle(), &rp_info, NULL, &rp);
9165 m_errorMonitor->VerifyFound();
9166 }
9167}
9168
9169TEST_F(VkLayerTest, ImageLayerViewTests) {
9170 VkResult ret;
9171 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
9172
9173 ASSERT_NO_FATAL_FAILURE(InitState());
9174
9175 VkImageObj image(m_device);
9176 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9177 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
9178 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
9179 VK_IMAGE_TILING_OPTIMAL, 0);
9180 ASSERT_TRUE(image.initialized());
9181
9182 VkImageView imgView;
9183 VkImageViewCreateInfo imgViewInfo = {};
9184 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9185 imgViewInfo.image = image.handle();
9186 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
9187 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9188 imgViewInfo.subresourceRange.layerCount = 1;
9189 imgViewInfo.subresourceRange.baseMipLevel = 0;
9190 imgViewInfo.subresourceRange.levelCount = 1;
9191 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9192
9193 m_errorMonitor->SetDesiredFailureMsg(
9194 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9195 "vkCreateImageView called with baseMipLevel");
9196 // View can't have baseMipLevel >= image's mipLevels - Expect
9197 // VIEW_CREATE_ERROR
9198 imgViewInfo.subresourceRange.baseMipLevel = 1;
9199 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9200 m_errorMonitor->VerifyFound();
9201 imgViewInfo.subresourceRange.baseMipLevel = 0;
9202
9203 m_errorMonitor->SetDesiredFailureMsg(
9204 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9205 "vkCreateImageView called with baseArrayLayer");
9206 // View can't have baseArrayLayer >= image's arraySize - Expect
9207 // VIEW_CREATE_ERROR
9208 imgViewInfo.subresourceRange.baseArrayLayer = 1;
9209 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9210 m_errorMonitor->VerifyFound();
9211 imgViewInfo.subresourceRange.baseArrayLayer = 0;
9212
9213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9214 "vkCreateImageView called with 0 in "
9215 "pCreateInfo->subresourceRange."
9216 "levelCount");
9217 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
9218 imgViewInfo.subresourceRange.levelCount = 0;
9219 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9220 m_errorMonitor->VerifyFound();
9221 imgViewInfo.subresourceRange.levelCount = 1;
9222
9223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9224 "vkCreateImageView called with 0 in "
9225 "pCreateInfo->subresourceRange."
9226 "layerCount");
9227 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
9228 imgViewInfo.subresourceRange.layerCount = 0;
9229 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9230 m_errorMonitor->VerifyFound();
9231 imgViewInfo.subresourceRange.layerCount = 1;
9232
9233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9234 "but both must be color formats");
9235 // Can't use depth format for view into color image - Expect INVALID_FORMAT
9236 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
9237 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9238 m_errorMonitor->VerifyFound();
9239 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9240
9241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9242 "Formats MUST be IDENTICAL unless "
9243 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
9244 "was set on image creation.");
9245 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
9246 // VIEW_CREATE_ERROR
9247 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
9248 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9249 m_errorMonitor->VerifyFound();
9250 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9251
9252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9253 "can support ImageViews with "
9254 "differing formats but they must be "
9255 "in the same compatibility class.");
9256 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
9257 // VIEW_CREATE_ERROR
9258 VkImageCreateInfo mutImgInfo = image.create_info();
9259 VkImage mutImage;
9260 mutImgInfo.format = VK_FORMAT_R8_UINT;
9261 assert(
9262 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
9263 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
9264 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
9265 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9266 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
9267 ASSERT_VK_SUCCESS(ret);
9268 imgViewInfo.image = mutImage;
9269 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9270 m_errorMonitor->VerifyFound();
9271 imgViewInfo.image = image.handle();
9272 vkDestroyImage(m_device->handle(), mutImage, NULL);
9273}
9274
9275TEST_F(VkLayerTest, MiscImageLayerTests) {
9276
9277 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
9278
9279 ASSERT_NO_FATAL_FAILURE(InitState());
9280
9281 VkImageObj image(m_device);
9282 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9283 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
9284 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
9285 VK_IMAGE_TILING_OPTIMAL, 0);
9286 ASSERT_TRUE(image.initialized());
9287
9288 m_errorMonitor->SetDesiredFailureMsg(
9289 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9290 "number of layers in image subresource is zero");
9291 vk_testing::Buffer buffer;
9292 VkMemoryPropertyFlags reqs = 0;
9293 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
9294 VkBufferImageCopy region = {};
9295 region.bufferRowLength = 128;
9296 region.bufferImageHeight = 128;
9297 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9298 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
9299 region.imageSubresource.layerCount = 0;
9300 region.imageExtent.height = 4;
9301 region.imageExtent.width = 4;
9302 region.imageExtent.depth = 1;
9303 m_commandBuffer->BeginCommandBuffer();
9304 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
9305 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
9306 1, &region);
9307 m_errorMonitor->VerifyFound();
9308 region.imageSubresource.layerCount = 1;
9309
9310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9311 "aspectMasks for each region must "
9312 "specify only COLOR or DEPTH or "
9313 "STENCIL");
9314 // Expect MISMATCHED_IMAGE_ASPECT
9315 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
9316 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
9317 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
9318 1, &region);
9319 m_errorMonitor->VerifyFound();
9320 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9321
9322 m_errorMonitor->SetDesiredFailureMsg(
9323 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9324 "If the format of srcImage is a depth, stencil, depth stencil or "
9325 "integer-based format then filter must be VK_FILTER_NEAREST");
9326 // Expect INVALID_FILTER
9327 VkImageObj intImage1(m_device);
9328 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
9329 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
9330 0);
9331 VkImageObj intImage2(m_device);
9332 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
9333 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
9334 0);
9335 VkImageBlit blitRegion = {};
9336 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9337 blitRegion.srcSubresource.baseArrayLayer = 0;
9338 blitRegion.srcSubresource.layerCount = 1;
9339 blitRegion.srcSubresource.mipLevel = 0;
9340 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9341 blitRegion.dstSubresource.baseArrayLayer = 0;
9342 blitRegion.dstSubresource.layerCount = 1;
9343 blitRegion.dstSubresource.mipLevel = 0;
9344
9345 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
9346 intImage1.layout(), intImage2.handle(), intImage2.layout(),
9347 16, &blitRegion, VK_FILTER_LINEAR);
9348 m_errorMonitor->VerifyFound();
9349
9350 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9351 "called with 0 in ppMemoryBarriers");
9352 VkImageMemoryBarrier img_barrier;
9353 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9354 img_barrier.pNext = NULL;
9355 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9356 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9357 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9358 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9359 img_barrier.image = image.handle();
9360 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9361 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9362 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9363 img_barrier.subresourceRange.baseArrayLayer = 0;
9364 img_barrier.subresourceRange.baseMipLevel = 0;
9365 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
9366 img_barrier.subresourceRange.layerCount = 0;
9367 img_barrier.subresourceRange.levelCount = 1;
9368 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9369 VK_PIPELINE_STAGE_HOST_BIT,
9370 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9371 nullptr, 1, &img_barrier);
9372 m_errorMonitor->VerifyFound();
9373 img_barrier.subresourceRange.layerCount = 1;
9374}
9375
9376TEST_F(VkLayerTest, ImageFormatLimits) {
9377
9378 TEST_DESCRIPTION("Exceed the limits of image format ");
9379
9380 m_errorMonitor->SetDesiredFailureMsg(
9381 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9382 "CreateImage extents exceed allowable limits for format");
9383 VkImageCreateInfo image_create_info = {};
9384 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9385 image_create_info.pNext = NULL;
9386 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9387 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9388 image_create_info.extent.width = 32;
9389 image_create_info.extent.height = 32;
9390 image_create_info.extent.depth = 1;
9391 image_create_info.mipLevels = 1;
9392 image_create_info.arrayLayers = 1;
9393 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9394 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9395 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9396 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9397 image_create_info.flags = 0;
9398
9399 VkImage nullImg;
9400 VkImageFormatProperties imgFmtProps;
9401 vkGetPhysicalDeviceImageFormatProperties(
9402 gpu(), image_create_info.format, image_create_info.imageType,
9403 image_create_info.tiling, image_create_info.usage,
9404 image_create_info.flags, &imgFmtProps);
9405 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
9406 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9407 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9408 m_errorMonitor->VerifyFound();
9409 image_create_info.extent.depth = 1;
9410
9411 m_errorMonitor->SetDesiredFailureMsg(
9412 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9413 "exceeds allowable maximum supported by format of");
9414 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
9415 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9416 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9417 m_errorMonitor->VerifyFound();
9418 image_create_info.mipLevels = 1;
9419
9420 m_errorMonitor->SetDesiredFailureMsg(
9421 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9422 "exceeds allowable maximum supported by format of");
9423 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
9424 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9425 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9426 m_errorMonitor->VerifyFound();
9427 image_create_info.arrayLayers = 1;
9428
9429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9430 "is not supported by format");
9431 int samples = imgFmtProps.sampleCounts >> 1;
9432 image_create_info.samples = (VkSampleCountFlagBits)samples;
9433 // Expect INVALID_FORMAT_LIMITS_VIOLATION
9434 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9435 m_errorMonitor->VerifyFound();
9436 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9437
9438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9439 "pCreateInfo->initialLayout, must be "
9440 "VK_IMAGE_LAYOUT_UNDEFINED or "
9441 "VK_IMAGE_LAYOUT_PREINITIALIZED");
9442 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9443 // Expect INVALID_LAYOUT
9444 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
9445 m_errorMonitor->VerifyFound();
9446 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9447}
9448
Karl Schultz6addd812016-02-02 17:17:23 -07009449TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06009450 VkResult err;
9451 bool pass;
9452
9453 // Create color images with different format sizes and try to copy between them
9454 m_errorMonitor->SetDesiredFailureMsg(
9455 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9456 "vkCmdCopyImage called with unmatched source and dest image format sizes");
9457
9458 ASSERT_NO_FATAL_FAILURE(InitState());
9459
9460 // Create two images of different types and try to copy between them
9461 VkImage srcImage;
9462 VkImage dstImage;
9463 VkDeviceMemory srcMem;
9464 VkDeviceMemory destMem;
9465 VkMemoryRequirements memReqs;
9466
9467 VkImageCreateInfo image_create_info = {};
9468 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9469 image_create_info.pNext = NULL;
9470 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9471 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9472 image_create_info.extent.width = 32;
9473 image_create_info.extent.height = 32;
9474 image_create_info.extent.depth = 1;
9475 image_create_info.mipLevels = 1;
9476 image_create_info.arrayLayers = 1;
9477 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9478 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9479 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9480 image_create_info.flags = 0;
9481
9482 err =
9483 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
9484 ASSERT_VK_SUCCESS(err);
9485
9486 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
9487 // Introduce failure by creating second image with a different-sized format.
9488 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
9489
9490 err =
9491 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
9492 ASSERT_VK_SUCCESS(err);
9493
9494 // Allocate memory
9495 VkMemoryAllocateInfo memAlloc = {};
9496 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9497 memAlloc.pNext = NULL;
9498 memAlloc.allocationSize = 0;
9499 memAlloc.memoryTypeIndex = 0;
9500
9501 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
9502 memAlloc.allocationSize = memReqs.size;
9503 pass =
9504 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
9505 ASSERT_TRUE(pass);
9506 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
9507 ASSERT_VK_SUCCESS(err);
9508
9509 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
9510 memAlloc.allocationSize = memReqs.size;
9511 pass =
9512 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
9513 ASSERT_TRUE(pass);
9514 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
9515 ASSERT_VK_SUCCESS(err);
9516
9517 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9518 ASSERT_VK_SUCCESS(err);
9519 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
9520 ASSERT_VK_SUCCESS(err);
9521
9522 BeginCommandBuffer();
9523 VkImageCopy copyRegion;
9524 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9525 copyRegion.srcSubresource.mipLevel = 0;
9526 copyRegion.srcSubresource.baseArrayLayer = 0;
9527 copyRegion.srcSubresource.layerCount = 0;
9528 copyRegion.srcOffset.x = 0;
9529 copyRegion.srcOffset.y = 0;
9530 copyRegion.srcOffset.z = 0;
9531 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9532 copyRegion.dstSubresource.mipLevel = 0;
9533 copyRegion.dstSubresource.baseArrayLayer = 0;
9534 copyRegion.dstSubresource.layerCount = 0;
9535 copyRegion.dstOffset.x = 0;
9536 copyRegion.dstOffset.y = 0;
9537 copyRegion.dstOffset.z = 0;
9538 copyRegion.extent.width = 1;
9539 copyRegion.extent.height = 1;
9540 copyRegion.extent.depth = 1;
9541 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9542 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
9543 EndCommandBuffer();
9544
9545 m_errorMonitor->VerifyFound();
9546
9547 vkDestroyImage(m_device->device(), srcImage, NULL);
9548 vkDestroyImage(m_device->device(), dstImage, NULL);
9549 vkFreeMemory(m_device->device(), srcMem, NULL);
9550 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009551}
9552
Karl Schultz6addd812016-02-02 17:17:23 -07009553TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
9554 VkResult err;
9555 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009556
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009557 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009558 m_errorMonitor->SetDesiredFailureMsg(
9559 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009560 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009561
Mike Stroyana3082432015-09-25 13:39:21 -06009562 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009563
9564 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009565 VkImage srcImage;
9566 VkImage dstImage;
9567 VkDeviceMemory srcMem;
9568 VkDeviceMemory destMem;
9569 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009570
9571 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009572 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9573 image_create_info.pNext = NULL;
9574 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9575 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9576 image_create_info.extent.width = 32;
9577 image_create_info.extent.height = 32;
9578 image_create_info.extent.depth = 1;
9579 image_create_info.mipLevels = 1;
9580 image_create_info.arrayLayers = 1;
9581 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9582 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9583 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9584 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009585
Karl Schultz6addd812016-02-02 17:17:23 -07009586 err =
9587 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009588 ASSERT_VK_SUCCESS(err);
9589
Karl Schultzbdb75952016-04-19 11:36:49 -06009590 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
9591
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009592 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07009593 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009594 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
9595 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
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, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009599 ASSERT_VK_SUCCESS(err);
9600
9601 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009602 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009603 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9604 memAlloc.pNext = NULL;
9605 memAlloc.allocationSize = 0;
9606 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009607
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009608 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009609 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009610 pass =
9611 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009612 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009613 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009614 ASSERT_VK_SUCCESS(err);
9615
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009616 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009617 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009618 pass =
9619 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009620 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009621 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009622 ASSERT_VK_SUCCESS(err);
9623
9624 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9625 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009626 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009627 ASSERT_VK_SUCCESS(err);
9628
9629 BeginCommandBuffer();
9630 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009631 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009632 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009633 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009634 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009635 copyRegion.srcOffset.x = 0;
9636 copyRegion.srcOffset.y = 0;
9637 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009638 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009639 copyRegion.dstSubresource.mipLevel = 0;
9640 copyRegion.dstSubresource.baseArrayLayer = 0;
9641 copyRegion.dstSubresource.layerCount = 0;
9642 copyRegion.dstOffset.x = 0;
9643 copyRegion.dstOffset.y = 0;
9644 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009645 copyRegion.extent.width = 1;
9646 copyRegion.extent.height = 1;
9647 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009648 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9649 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009650 EndCommandBuffer();
9651
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009652 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009653
Chia-I Wuf7458c52015-10-26 21:10:41 +08009654 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009655 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009656 vkFreeMemory(m_device->device(), srcMem, NULL);
9657 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009658}
9659
Karl Schultz6addd812016-02-02 17:17:23 -07009660TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
9661 VkResult err;
9662 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009663
Karl Schultz6addd812016-02-02 17:17:23 -07009664 m_errorMonitor->SetDesiredFailureMsg(
9665 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009666 "vkCmdResolveImage called with source sample count less than 2.");
9667
Mike Stroyana3082432015-09-25 13:39:21 -06009668 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009669
9670 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07009671 VkImage srcImage;
9672 VkImage dstImage;
9673 VkDeviceMemory srcMem;
9674 VkDeviceMemory destMem;
9675 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009676
9677 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009678 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9679 image_create_info.pNext = NULL;
9680 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9681 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9682 image_create_info.extent.width = 32;
9683 image_create_info.extent.height = 1;
9684 image_create_info.extent.depth = 1;
9685 image_create_info.mipLevels = 1;
9686 image_create_info.arrayLayers = 1;
9687 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9688 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9689 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9690 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009691
Karl Schultz6addd812016-02-02 17:17:23 -07009692 err =
9693 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009694 ASSERT_VK_SUCCESS(err);
9695
Karl Schultz6addd812016-02-02 17:17:23 -07009696 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009697
Karl Schultz6addd812016-02-02 17:17:23 -07009698 err =
9699 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009700 ASSERT_VK_SUCCESS(err);
9701
9702 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009703 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009704 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9705 memAlloc.pNext = NULL;
9706 memAlloc.allocationSize = 0;
9707 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009708
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009709 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009710 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009711 pass =
9712 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009713 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009714 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009715 ASSERT_VK_SUCCESS(err);
9716
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009717 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009718 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009719 pass =
9720 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009721 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009722 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009723 ASSERT_VK_SUCCESS(err);
9724
9725 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9726 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009727 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009728 ASSERT_VK_SUCCESS(err);
9729
9730 BeginCommandBuffer();
9731 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009732 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9733 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009734 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009735 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009736 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009737 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009738 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009739 resolveRegion.srcOffset.x = 0;
9740 resolveRegion.srcOffset.y = 0;
9741 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009742 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009743 resolveRegion.dstSubresource.mipLevel = 0;
9744 resolveRegion.dstSubresource.baseArrayLayer = 0;
9745 resolveRegion.dstSubresource.layerCount = 0;
9746 resolveRegion.dstOffset.x = 0;
9747 resolveRegion.dstOffset.y = 0;
9748 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009749 resolveRegion.extent.width = 1;
9750 resolveRegion.extent.height = 1;
9751 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009752 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9753 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009754 EndCommandBuffer();
9755
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009756 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009757
Chia-I Wuf7458c52015-10-26 21:10:41 +08009758 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009759 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009760 vkFreeMemory(m_device->device(), srcMem, NULL);
9761 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009762}
9763
Karl Schultz6addd812016-02-02 17:17:23 -07009764TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
9765 VkResult err;
9766 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009767
Karl Schultz6addd812016-02-02 17:17:23 -07009768 m_errorMonitor->SetDesiredFailureMsg(
9769 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009770 "vkCmdResolveImage called with dest sample count greater than 1.");
9771
Mike Stroyana3082432015-09-25 13:39:21 -06009772 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009773
Chris Forbesa7530692016-05-08 12:35:39 +12009774 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07009775 VkImage srcImage;
9776 VkImage dstImage;
9777 VkDeviceMemory srcMem;
9778 VkDeviceMemory destMem;
9779 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009780
9781 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009782 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9783 image_create_info.pNext = NULL;
9784 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9785 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9786 image_create_info.extent.width = 32;
9787 image_create_info.extent.height = 1;
9788 image_create_info.extent.depth = 1;
9789 image_create_info.mipLevels = 1;
9790 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +12009791 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07009792 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9793 // Note: Some implementations expect color attachment usage for any
9794 // multisample surface
9795 image_create_info.usage =
9796 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9797 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009798
Karl Schultz6addd812016-02-02 17:17:23 -07009799 err =
9800 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009801 ASSERT_VK_SUCCESS(err);
9802
Karl Schultz6addd812016-02-02 17:17:23 -07009803 // Note: Some implementations expect color attachment usage for any
9804 // multisample surface
9805 image_create_info.usage =
9806 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009807
Karl Schultz6addd812016-02-02 17:17:23 -07009808 err =
9809 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009810 ASSERT_VK_SUCCESS(err);
9811
9812 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009813 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009814 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9815 memAlloc.pNext = NULL;
9816 memAlloc.allocationSize = 0;
9817 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009818
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009819 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009820 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009821 pass =
9822 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009823 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009824 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009825 ASSERT_VK_SUCCESS(err);
9826
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009827 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009828 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009829 pass =
9830 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009831 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009832 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009833 ASSERT_VK_SUCCESS(err);
9834
9835 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9836 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009837 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009838 ASSERT_VK_SUCCESS(err);
9839
9840 BeginCommandBuffer();
9841 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009842 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9843 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009844 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009845 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009846 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009847 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009848 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009849 resolveRegion.srcOffset.x = 0;
9850 resolveRegion.srcOffset.y = 0;
9851 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009852 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009853 resolveRegion.dstSubresource.mipLevel = 0;
9854 resolveRegion.dstSubresource.baseArrayLayer = 0;
9855 resolveRegion.dstSubresource.layerCount = 0;
9856 resolveRegion.dstOffset.x = 0;
9857 resolveRegion.dstOffset.y = 0;
9858 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009859 resolveRegion.extent.width = 1;
9860 resolveRegion.extent.height = 1;
9861 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009862 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9863 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009864 EndCommandBuffer();
9865
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009866 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009867
Chia-I Wuf7458c52015-10-26 21:10:41 +08009868 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009869 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009870 vkFreeMemory(m_device->device(), srcMem, NULL);
9871 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009872}
9873
Karl Schultz6addd812016-02-02 17:17:23 -07009874TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
9875 VkResult err;
9876 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009877
Karl Schultz6addd812016-02-02 17:17:23 -07009878 m_errorMonitor->SetDesiredFailureMsg(
9879 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009880 "vkCmdResolveImage called with unmatched source and dest formats.");
9881
Mike Stroyana3082432015-09-25 13:39:21 -06009882 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009883
9884 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009885 VkImage srcImage;
9886 VkImage dstImage;
9887 VkDeviceMemory srcMem;
9888 VkDeviceMemory destMem;
9889 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009890
9891 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009892 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9893 image_create_info.pNext = NULL;
9894 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9895 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9896 image_create_info.extent.width = 32;
9897 image_create_info.extent.height = 1;
9898 image_create_info.extent.depth = 1;
9899 image_create_info.mipLevels = 1;
9900 image_create_info.arrayLayers = 1;
9901 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
9902 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9903 // Note: Some implementations expect color attachment usage for any
9904 // multisample surface
9905 image_create_info.usage =
9906 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9907 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009908
Karl Schultz6addd812016-02-02 17:17:23 -07009909 err =
9910 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009911 ASSERT_VK_SUCCESS(err);
9912
Karl Schultz6addd812016-02-02 17:17:23 -07009913 // Set format to something other than source image
9914 image_create_info.format = VK_FORMAT_R32_SFLOAT;
9915 // Note: Some implementations expect color attachment usage for any
9916 // multisample surface
9917 image_create_info.usage =
9918 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9919 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009920
Karl Schultz6addd812016-02-02 17:17:23 -07009921 err =
9922 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009923 ASSERT_VK_SUCCESS(err);
9924
9925 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009926 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009927 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9928 memAlloc.pNext = NULL;
9929 memAlloc.allocationSize = 0;
9930 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009931
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009932 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009933 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009934 pass =
9935 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009936 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009937 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009938 ASSERT_VK_SUCCESS(err);
9939
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009940 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009941 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009942 pass =
9943 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009944 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009945 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009946 ASSERT_VK_SUCCESS(err);
9947
9948 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9949 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009950 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009951 ASSERT_VK_SUCCESS(err);
9952
9953 BeginCommandBuffer();
9954 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009955 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9956 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009957 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009958 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009959 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009960 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009961 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009962 resolveRegion.srcOffset.x = 0;
9963 resolveRegion.srcOffset.y = 0;
9964 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009965 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009966 resolveRegion.dstSubresource.mipLevel = 0;
9967 resolveRegion.dstSubresource.baseArrayLayer = 0;
9968 resolveRegion.dstSubresource.layerCount = 0;
9969 resolveRegion.dstOffset.x = 0;
9970 resolveRegion.dstOffset.y = 0;
9971 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009972 resolveRegion.extent.width = 1;
9973 resolveRegion.extent.height = 1;
9974 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009975 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9976 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009977 EndCommandBuffer();
9978
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009979 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009980
Chia-I Wuf7458c52015-10-26 21:10:41 +08009981 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009982 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009983 vkFreeMemory(m_device->device(), srcMem, NULL);
9984 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009985}
9986
Karl Schultz6addd812016-02-02 17:17:23 -07009987TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
9988 VkResult err;
9989 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009990
Karl Schultz6addd812016-02-02 17:17:23 -07009991 m_errorMonitor->SetDesiredFailureMsg(
9992 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009993 "vkCmdResolveImage called with unmatched source and dest image types.");
9994
Mike Stroyana3082432015-09-25 13:39:21 -06009995 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009996
9997 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009998 VkImage srcImage;
9999 VkImage dstImage;
10000 VkDeviceMemory srcMem;
10001 VkDeviceMemory destMem;
10002 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060010003
10004 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010005 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10006 image_create_info.pNext = NULL;
10007 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10008 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10009 image_create_info.extent.width = 32;
10010 image_create_info.extent.height = 1;
10011 image_create_info.extent.depth = 1;
10012 image_create_info.mipLevels = 1;
10013 image_create_info.arrayLayers = 1;
10014 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
10015 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10016 // Note: Some implementations expect color attachment usage for any
10017 // multisample surface
10018 image_create_info.usage =
10019 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10020 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010021
Karl Schultz6addd812016-02-02 17:17:23 -070010022 err =
10023 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010024 ASSERT_VK_SUCCESS(err);
10025
Karl Schultz6addd812016-02-02 17:17:23 -070010026 image_create_info.imageType = VK_IMAGE_TYPE_1D;
10027 // Note: Some implementations expect color attachment usage for any
10028 // multisample surface
10029 image_create_info.usage =
10030 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10031 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010032
Karl Schultz6addd812016-02-02 17:17:23 -070010033 err =
10034 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010035 ASSERT_VK_SUCCESS(err);
10036
10037 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010038 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010039 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10040 memAlloc.pNext = NULL;
10041 memAlloc.allocationSize = 0;
10042 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010043
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060010044 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010045 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010046 pass =
10047 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010048 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010049 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010050 ASSERT_VK_SUCCESS(err);
10051
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010052 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010053 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010054 pass =
10055 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010056 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010057 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010058 ASSERT_VK_SUCCESS(err);
10059
10060 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10061 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010062 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060010063 ASSERT_VK_SUCCESS(err);
10064
10065 BeginCommandBuffer();
10066 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070010067 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
10068 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060010069 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010070 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010071 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060010072 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010073 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010074 resolveRegion.srcOffset.x = 0;
10075 resolveRegion.srcOffset.y = 0;
10076 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010077 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010078 resolveRegion.dstSubresource.mipLevel = 0;
10079 resolveRegion.dstSubresource.baseArrayLayer = 0;
10080 resolveRegion.dstSubresource.layerCount = 0;
10081 resolveRegion.dstOffset.x = 0;
10082 resolveRegion.dstOffset.y = 0;
10083 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010084 resolveRegion.extent.width = 1;
10085 resolveRegion.extent.height = 1;
10086 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070010087 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10088 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060010089 EndCommandBuffer();
10090
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010091 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060010092
Chia-I Wuf7458c52015-10-26 21:10:41 +080010093 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010094 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010095 vkFreeMemory(m_device->device(), srcMem, NULL);
10096 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010097}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010098
Karl Schultz6addd812016-02-02 17:17:23 -070010099TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010100 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070010101 // to using a DS format, then cause it to hit error due to COLOR_BIT not
10102 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010103 // The image format check comes 2nd in validation so we trigger it first,
10104 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070010105 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010106
Karl Schultz6addd812016-02-02 17:17:23 -070010107 m_errorMonitor->SetDesiredFailureMsg(
10108 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010109 "Combination depth/stencil image formats can have only the ");
10110
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010111 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010112
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010113 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010114 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
10115 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010116
10117 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010118 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10119 ds_pool_ci.pNext = NULL;
10120 ds_pool_ci.maxSets = 1;
10121 ds_pool_ci.poolSizeCount = 1;
10122 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010123
10124 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010125 err =
10126 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010127 ASSERT_VK_SUCCESS(err);
10128
10129 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010130 dsl_binding.binding = 0;
10131 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
10132 dsl_binding.descriptorCount = 1;
10133 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10134 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010135
10136 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010137 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10138 ds_layout_ci.pNext = NULL;
10139 ds_layout_ci.bindingCount = 1;
10140 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010141 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010142 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10143 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010144 ASSERT_VK_SUCCESS(err);
10145
10146 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010147 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010148 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010149 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010150 alloc_info.descriptorPool = ds_pool;
10151 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010152 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10153 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010154 ASSERT_VK_SUCCESS(err);
10155
Karl Schultz6addd812016-02-02 17:17:23 -070010156 VkImage image_bad;
10157 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010158 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -070010159 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010160 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070010161 const int32_t tex_width = 32;
10162 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010163
10164 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010165 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10166 image_create_info.pNext = NULL;
10167 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10168 image_create_info.format = tex_format_bad;
10169 image_create_info.extent.width = tex_width;
10170 image_create_info.extent.height = tex_height;
10171 image_create_info.extent.depth = 1;
10172 image_create_info.mipLevels = 1;
10173 image_create_info.arrayLayers = 1;
10174 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10175 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10176 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
10177 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
10178 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010179
Karl Schultz6addd812016-02-02 17:17:23 -070010180 err =
10181 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010182 ASSERT_VK_SUCCESS(err);
10183 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070010184 image_create_info.usage =
10185 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10186 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
10187 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010188 ASSERT_VK_SUCCESS(err);
10189
10190 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010191 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10192 image_view_create_info.image = image_bad;
10193 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
10194 image_view_create_info.format = tex_format_bad;
10195 image_view_create_info.subresourceRange.baseArrayLayer = 0;
10196 image_view_create_info.subresourceRange.baseMipLevel = 0;
10197 image_view_create_info.subresourceRange.layerCount = 1;
10198 image_view_create_info.subresourceRange.levelCount = 1;
10199 image_view_create_info.subresourceRange.aspectMask =
10200 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010201
10202 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070010203 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
10204 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010205
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010206 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010207
Chia-I Wuf7458c52015-10-26 21:10:41 +080010208 vkDestroyImage(m_device->device(), image_bad, NULL);
10209 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010210 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10211 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010212}
Tobin Ehliscde08892015-09-22 10:11:37 -060010213#endif // IMAGE_TESTS
10214
Tony Barbour300a6082015-04-07 13:44:53 -060010215int main(int argc, char **argv) {
10216 int result;
10217
Cody Northrop8e54a402016-03-08 22:25:52 -070010218#ifdef ANDROID
10219 int vulkanSupport = InitVulkan();
10220 if (vulkanSupport == 0)
10221 return 1;
10222#endif
10223
Tony Barbour300a6082015-04-07 13:44:53 -060010224 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060010225 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060010226
10227 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
10228
10229 result = RUN_ALL_TESTS();
10230
Tony Barbour6918cd52015-04-09 12:58:51 -060010231 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060010232 return result;
10233}