blob: 513037b4a39d91c800d1be5c835f0351bb7c5ad9 [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;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600268 bool m_enableWSI;
Tony Barbour300a6082015-04-07 13:44:53 -0600269
270 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600271 std::vector<const char *> instance_layer_names;
272 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600273 std::vector<const char *> instance_extension_names;
274 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600275
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700276 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600277 /*
278 * Since CreateDbgMsgCallback is an instance level extension call
279 * any extension / layer that utilizes that feature also needs
280 * to be enabled at create instance time.
281 */
Karl Schultz6addd812016-02-02 17:17:23 -0700282 // Use Threading layer first to protect others from
283 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700284 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600285 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800286 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700287 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800288 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
289 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600290 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700291 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600292
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700293 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600294 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800295 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700296 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800297 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
298 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600299 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700300 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600301
Ian Elliott2c1daf52016-05-12 09:41:46 -0600302 if (m_enableWSI) {
303 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
304 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
305#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
306#if defined(VK_USE_PLATFORM_ANDROID_KHR)
307 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
308#endif // VK_USE_PLATFORM_ANDROID_KHR
309#if defined(VK_USE_PLATFORM_MIR_KHR)
310 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
311#endif // VK_USE_PLATFORM_MIR_KHR
312#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
313 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
314#endif // VK_USE_PLATFORM_WAYLAND_KHR
315#if defined(VK_USE_PLATFORM_WIN32_KHR)
316 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
317#endif // VK_USE_PLATFORM_WIN32_KHR
318#endif // NEED_TO_TEST_THIS_ON_PLATFORM
319#if defined(VK_USE_PLATFORM_XCB_KHR)
320 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
321#elif defined(VK_USE_PLATFORM_XLIB_KHR)
322 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
323#endif // VK_USE_PLATFORM_XLIB_KHR
324 }
325
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600326 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600327 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800328 this->app_info.pApplicationName = "layer_tests";
329 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600330 this->app_info.pEngineName = "unittest";
331 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600332 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600333
Tony Barbour15524c32015-04-29 17:34:29 -0600334 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600335 InitFramework(instance_layer_names, device_layer_names,
336 instance_extension_names, device_extension_names,
337 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600338 }
339
340 virtual void TearDown() {
341 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600342 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600343 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600344 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600345
346 VkLayerTest() {
347 m_enableWSI = false;
348 }
Tony Barbour300a6082015-04-07 13:44:53 -0600349};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500350
Karl Schultz6addd812016-02-02 17:17:23 -0700351VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600352 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600353
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800354 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600355
356 /*
357 * For render test all drawing happens in a single render pass
358 * on a single command buffer.
359 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200360 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800361 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600362 }
363
364 return result;
365}
366
Karl Schultz6addd812016-02-02 17:17:23 -0700367VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600368 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600369
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200370 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800371 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200372 }
Tony Barbour300a6082015-04-07 13:44:53 -0600373
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800374 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600375
376 return result;
377}
378
Karl Schultz6addd812016-02-02 17:17:23 -0700379void VkLayerTest::VKTriangleTest(const char *vertShaderText,
380 const char *fragShaderText,
381 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500382 // Create identity matrix
383 int i;
384 struct vktriangle_vs_uniform data;
385
386 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700387 glm::mat4 View = glm::mat4(1.0f);
388 glm::mat4 Model = glm::mat4(1.0f);
389 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500390 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700391 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500392
393 memcpy(&data.mvp, &MVP[0][0], matrixSize);
394
Karl Schultz6addd812016-02-02 17:17:23 -0700395 static const Vertex tri_data[] = {
396 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
397 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
398 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500399 };
400
Karl Schultz6addd812016-02-02 17:17:23 -0700401 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500402 data.position[i][0] = tri_data[i].posX;
403 data.position[i][1] = tri_data[i].posY;
404 data.position[i][2] = tri_data[i].posZ;
405 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700406 data.color[i][0] = tri_data[i].r;
407 data.color[i][1] = tri_data[i].g;
408 data.color[i][2] = tri_data[i].b;
409 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500410 }
411
412 ASSERT_NO_FATAL_FAILURE(InitState());
413 ASSERT_NO_FATAL_FAILURE(InitViewport());
414
Karl Schultz6addd812016-02-02 17:17:23 -0700415 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
416 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500417
Karl Schultz6addd812016-02-02 17:17:23 -0700418 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
419 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
420 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500421
422 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800423 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500424 pipelineobj.AddShader(&vs);
425 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600426 if (failMask & BsoFailLineWidth) {
427 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600428 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
429 ia_state.sType =
430 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
431 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
432 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600433 }
434 if (failMask & BsoFailDepthBias) {
435 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600436 VkPipelineRasterizationStateCreateInfo rs_state = {};
437 rs_state.sType =
438 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
439 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600440 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600441 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600442 }
Karl Schultz6addd812016-02-02 17:17:23 -0700443 // Viewport and scissors must stay in synch or other errors will occur than
444 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600445 if (failMask & BsoFailViewport) {
446 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600447 m_viewports.clear();
448 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600449 }
450 if (failMask & BsoFailScissor) {
451 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600452 m_scissors.clear();
453 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600454 }
455 if (failMask & BsoFailBlend) {
456 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600457 VkPipelineColorBlendAttachmentState att_state = {};
458 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
459 att_state.blendEnable = VK_TRUE;
460 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600461 }
462 if (failMask & BsoFailDepthBounds) {
463 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
464 }
465 if (failMask & BsoFailStencilReadMask) {
466 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
467 }
468 if (failMask & BsoFailStencilWriteMask) {
469 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
470 }
471 if (failMask & BsoFailStencilReference) {
472 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
473 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500474
475 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700476 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
477 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500478
479 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600480 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481
Tony Barbourfe3351b2015-07-28 10:17:20 -0600482 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500483
484 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600485 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500486
487 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600488 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500489
Tony Barbourfe3351b2015-07-28 10:17:20 -0600490 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500491}
492
Karl Schultz6addd812016-02-02 17:17:23 -0700493void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
494 VkPipelineObj &pipelineobj,
495 VkDescriptorSetObj &descriptorSet,
496 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500497 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700498 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
499 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500500 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700501 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
502 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500503 }
504
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800505 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700506 // Make sure depthWriteEnable is set so that Depth fail test will work
507 // correctly
508 // Make sure stencilTestEnable is set so that Stencil fail test will work
509 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600510 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800511 stencil.failOp = VK_STENCIL_OP_KEEP;
512 stencil.passOp = VK_STENCIL_OP_KEEP;
513 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
514 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600515
516 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
517 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600518 ds_ci.pNext = NULL;
519 ds_ci.depthTestEnable = VK_FALSE;
520 ds_ci.depthWriteEnable = VK_TRUE;
521 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
522 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600523 if (failMask & BsoFailDepthBounds) {
524 ds_ci.depthBoundsTestEnable = VK_TRUE;
525 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600526 ds_ci.stencilTestEnable = VK_TRUE;
527 ds_ci.front = stencil;
528 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600529
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600530 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600531 pipelineobj.SetViewport(m_viewports);
532 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800533 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700534 VkResult err = pipelineobj.CreateVKPipeline(
535 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600536 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800537 commandBuffer->BindPipeline(pipelineobj);
538 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500539}
540
Ian Elliott2c1daf52016-05-12 09:41:46 -0600541class VkWsiEnabledLayerTest : public VkLayerTest {
542 public:
543protected:
544 VkWsiEnabledLayerTest() {
545 m_enableWSI = true;
546 }
547};
548
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500549// ********************************************************************************************************************
550// ********************************************************************************************************************
551// ********************************************************************************************************************
552// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600553#if PARAMETER_VALIDATION_TESTS
554TEST_F(VkLayerTest, RequiredParameter) {
555 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
556 "pointer, array, and array count parameters");
557
558 ASSERT_NO_FATAL_FAILURE(InitState());
559
560 m_errorMonitor->SetDesiredFailureMsg(
561 VK_DEBUG_REPORT_ERROR_BIT_EXT,
562 "required parameter pFeatures specified as NULL");
563 // Specify NULL for a pointer to a handle
564 // Expected to trigger an error with
565 // parameter_validation::validate_required_pointer
566 vkGetPhysicalDeviceFeatures(gpu(), NULL);
567 m_errorMonitor->VerifyFound();
568
569 m_errorMonitor->SetDesiredFailureMsg(
570 VK_DEBUG_REPORT_ERROR_BIT_EXT,
571 "required parameter pPhysicalDeviceCount specified as NULL");
572 // Specify NULL for pointer to array count
573 // Expected to trigger an error with parameter_validation::validate_array
574 vkEnumeratePhysicalDevices(instance(), NULL, NULL);
575 m_errorMonitor->VerifyFound();
576
577 m_errorMonitor->SetDesiredFailureMsg(
578 VK_DEBUG_REPORT_ERROR_BIT_EXT,
579 "parameter viewportCount must be greater than 0");
580 // Specify 0 for a required array count
581 // Expected to trigger an error with parameter_validation::validate_array
582 VkViewport view_port = {};
583 m_commandBuffer->SetViewport(0, 0, &view_port);
584 m_errorMonitor->VerifyFound();
585
586 m_errorMonitor->SetDesiredFailureMsg(
587 VK_DEBUG_REPORT_ERROR_BIT_EXT,
588 "required parameter pViewports specified as NULL");
589 // Specify NULL for a required array
590 // Expected to trigger an error with parameter_validation::validate_array
591 m_commandBuffer->SetViewport(0, 1, NULL);
592 m_errorMonitor->VerifyFound();
593
594 m_errorMonitor->SetDesiredFailureMsg(
595 VK_DEBUG_REPORT_ERROR_BIT_EXT,
596 "required parameter memory specified as VK_NULL_HANDLE");
597 // Specify VK_NULL_HANDLE for a required handle
598 // Expected to trigger an error with
599 // parameter_validation::validate_required_handle
600 vkUnmapMemory(device(), VK_NULL_HANDLE);
601 m_errorMonitor->VerifyFound();
602
603 m_errorMonitor->SetDesiredFailureMsg(
604 VK_DEBUG_REPORT_ERROR_BIT_EXT,
605 "required parameter pFences[0] specified as VK_NULL_HANDLE");
606 // Specify VK_NULL_HANDLE for a required handle array entry
607 // Expected to trigger an error with
608 // parameter_validation::validate_required_handle_array
609 VkFence fence = VK_NULL_HANDLE;
610 vkResetFences(device(), 1, &fence);
611 m_errorMonitor->VerifyFound();
612
613 m_errorMonitor->SetDesiredFailureMsg(
614 VK_DEBUG_REPORT_ERROR_BIT_EXT,
615 "required parameter pAllocateInfo specified as NULL");
616 // Specify NULL for a required struct pointer
617 // Expected to trigger an error with
618 // parameter_validation::validate_struct_type
619 VkDeviceMemory memory = VK_NULL_HANDLE;
620 vkAllocateMemory(device(), NULL, NULL, &memory);
621 m_errorMonitor->VerifyFound();
622
623 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
624 "value of faceMask must not be 0");
625 // Specify 0 for a required VkFlags parameter
626 // Expected to trigger an error with parameter_validation::validate_flags
627 m_commandBuffer->SetStencilReference(0, 0);
628 m_errorMonitor->VerifyFound();
629
630 m_errorMonitor->SetDesiredFailureMsg(
631 VK_DEBUG_REPORT_ERROR_BIT_EXT,
632 "value of pSubmits[i].pWaitDstStageMask[0] must not be 0");
633 // Specify 0 for a required VkFlags array entry
634 // Expected to trigger an error with
635 // parameter_validation::validate_flags_array
636 VkSemaphore semaphore = VK_NULL_HANDLE;
637 VkPipelineStageFlags stageFlags = 0;
638 VkSubmitInfo submitInfo = {};
639 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
640 submitInfo.waitSemaphoreCount = 1;
641 submitInfo.pWaitSemaphores = &semaphore;
642 submitInfo.pWaitDstStageMask = &stageFlags;
643 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
644 m_errorMonitor->VerifyFound();
645}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600646
Dustin Gravesfce74c02016-05-10 11:42:58 -0600647TEST_F(VkLayerTest, ReservedParameter) {
648 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
649
650 ASSERT_NO_FATAL_FAILURE(InitState());
651
652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
653 " must be 0");
654 // Specify 0 for a reserved VkFlags parameter
655 // Expected to trigger an error with
656 // parameter_validation::validate_reserved_flags
657 VkEvent event_handle = VK_NULL_HANDLE;
658 VkEventCreateInfo event_info = {};
659 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
660 event_info.flags = 1;
661 vkCreateEvent(device(), &event_info, NULL, &event_handle);
662 m_errorMonitor->VerifyFound();
663}
664
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600665TEST_F(VkLayerTest, InvalidStructSType) {
666 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
667 "structure's sType field");
668
669 ASSERT_NO_FATAL_FAILURE(InitState());
670
671 m_errorMonitor->SetDesiredFailureMsg(
672 VK_DEBUG_REPORT_ERROR_BIT_EXT,
673 "parameter pAllocateInfo->sType must be");
674 // Zero struct memory, effectively setting sType to
675 // VK_STRUCTURE_TYPE_APPLICATION_INFO
676 // Expected to trigger an error with
677 // parameter_validation::validate_struct_type
678 VkMemoryAllocateInfo alloc_info = {};
679 VkDeviceMemory memory = VK_NULL_HANDLE;
680 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
681 m_errorMonitor->VerifyFound();
682
683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
684 "parameter pSubmits[0].sType must be");
685 // Zero struct memory, effectively setting sType to
686 // VK_STRUCTURE_TYPE_APPLICATION_INFO
687 // Expected to trigger an error with
688 // parameter_validation::validate_struct_type_array
689 VkSubmitInfo submit_info = {};
690 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
691 m_errorMonitor->VerifyFound();
692}
693
694TEST_F(VkLayerTest, InvalidStructPNext) {
695 TEST_DESCRIPTION(
696 "Specify an invalid value for a Vulkan structure's pNext field");
697
698 ASSERT_NO_FATAL_FAILURE(InitState());
699
700 m_errorMonitor->SetDesiredFailureMsg(
701 VK_DEBUG_REPORT_ERROR_BIT_EXT,
702 "value of pAllocateInfo->pNext must be NULL");
703 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be
704 // NULL
705 // Expected to trigger an error with
706 // parameter_validation::validate_struct_pnext
707 VkDeviceMemory memory = VK_NULL_HANDLE;
708 // Zero-initialization will provide the correct sType
709 VkApplicationInfo app_info = {};
Dustin Graves47b6cba2016-05-10 17:34:38 -0600710 VkMemoryAllocateInfo memory_alloc_info = {};
711 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
712 memory_alloc_info.pNext = &app_info;
713 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600714 m_errorMonitor->VerifyFound();
715
Dustin Graves47b6cba2016-05-10 17:34:38 -0600716 m_errorMonitor->SetDesiredFailureMsg(
717 VK_DEBUG_REPORT_ERROR_BIT_EXT,
718 " chain includes a structure with unexpected VkStructureType ");
719 // Set VkGraphicsPipelineCreateInfo::VkPipelineRasterizationStateCreateInfo::pNext to an invalid structure, when pNext is allowed to be a non-NULL value
720 // Expected to trigger an error with
721 // parameter_validation::validate_struct_pnext
722 VkDescriptorPoolSize ds_type_count = {};
723 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
724 ds_type_count.descriptorCount = 1;
725
726 VkDescriptorPoolCreateInfo ds_pool_ci = {};
727 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
728 ds_pool_ci.pNext = NULL;
729 ds_pool_ci.maxSets = 1;
730 ds_pool_ci.poolSizeCount = 1;
731 ds_pool_ci.pPoolSizes = &ds_type_count;
732
733 VkDescriptorPool ds_pool;
734 VkResult err =
735 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
736 ASSERT_VK_SUCCESS(err);
737
738 VkDescriptorSetLayoutBinding dsl_binding = {};
739 dsl_binding.binding = 0;
740 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
741 dsl_binding.descriptorCount = 1;
742 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
743 dsl_binding.pImmutableSamplers = NULL;
744
745 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
746 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
747 ds_layout_ci.pNext = NULL;
748 ds_layout_ci.bindingCount = 1;
749 ds_layout_ci.pBindings = &dsl_binding;
750
751 VkDescriptorSetLayout ds_layout;
752 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
753 &ds_layout);
754 ASSERT_VK_SUCCESS(err);
755
756 VkDescriptorSet descriptorSet;
757 VkDescriptorSetAllocateInfo ds_alloc_info = {};
758 ds_alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
759 ds_alloc_info.descriptorSetCount = 1;
760 ds_alloc_info.descriptorPool = ds_pool;
761 ds_alloc_info.pSetLayouts = &ds_layout;
762 err = vkAllocateDescriptorSets(m_device->device(), &ds_alloc_info,
763 &descriptorSet);
764 ASSERT_VK_SUCCESS(err);
765
766 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
767 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
768 pipeline_layout_ci.setLayoutCount = 1;
769 pipeline_layout_ci.pSetLayouts = &ds_layout;
770
771 VkPipelineLayout pipeline_layout;
772 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
773 &pipeline_layout);
774 ASSERT_VK_SUCCESS(err);
775
776 VkViewport vp = {}; // Just need dummy vp to point to
777 VkRect2D sc = {}; // dummy scissor to point to
778
779 VkPipelineViewportStateCreateInfo vp_state_ci = {};
780 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
781 vp_state_ci.scissorCount = 1;
782 vp_state_ci.pScissors = &sc;
783 vp_state_ci.viewportCount = 1;
784 vp_state_ci.pViewports = &vp;
785
786 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
787 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
788 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
789 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
790 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
791 rs_state_ci.depthClampEnable = VK_FALSE;
792 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
793 rs_state_ci.depthBiasEnable = VK_FALSE;
794
795 VkGraphicsPipelineCreateInfo gp_ci = {};
796 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
797 gp_ci.pViewportState = &vp_state_ci;
798 gp_ci.pRasterizationState = &rs_state_ci;
799 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
800 gp_ci.layout = pipeline_layout;
801 gp_ci.renderPass = renderPass();
802
803 VkPipelineCacheCreateInfo pc_ci = {};
804 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
805 pc_ci.initialDataSize = 0;
806 pc_ci.pInitialData = 0;
807
808 VkPipeline pipeline;
809 VkPipelineCache pipelineCache;
810
811 err =
812 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
813 ASSERT_VK_SUCCESS(err);
814
815 // Set VkPipelineRasterizationStateCreateInfo::pNext to an invalid value
816 VkApplicationInfo invalid_pnext_struct = {};
817 rs_state_ci.pNext = &invalid_pnext_struct;
818
819 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
820 &gp_ci, NULL, &pipeline);
821 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600822}
Dustin Graves5d33d532016-05-09 16:21:12 -0600823
824TEST_F(VkLayerTest, UnrecognizedValue) {
825 TEST_DESCRIPTION(
826 "Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
827
828 ASSERT_NO_FATAL_FAILURE(InitState());
829
830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
831 "does not fall within the begin..end "
832 "range of the core VkFormat "
833 "enumeration tokens");
834 // Specify an invalid VkFormat value
835 // Expected to trigger an error with
836 // parameter_validation::validate_ranged_enum
837 VkFormatProperties format_properties;
838 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000),
839 &format_properties);
840 m_errorMonitor->VerifyFound();
841
842 m_errorMonitor->SetDesiredFailureMsg(
843 VK_DEBUG_REPORT_ERROR_BIT_EXT,
844 "contains flag bits that are not recognized members of");
845 // Specify an invalid VkFlags bitmask value
846 // Expected to trigger an error with parameter_validation::validate_flags
847 VkImageFormatProperties image_format_properties;
848 vkGetPhysicalDeviceImageFormatProperties(
849 gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D,
850 VK_IMAGE_TILING_OPTIMAL, static_cast<VkImageUsageFlags>(1 << 25), 0,
851 &image_format_properties);
852 m_errorMonitor->VerifyFound();
853
854 m_errorMonitor->SetDesiredFailureMsg(
855 VK_DEBUG_REPORT_ERROR_BIT_EXT,
856 "contains flag bits that are not recognized members of");
857 // Specify an invalid VkFlags array entry
858 // Expected to trigger an error with
859 // parameter_validation::validate_flags_array
860 VkSemaphore semaphore = VK_NULL_HANDLE;
861 VkPipelineStageFlags stage_flags =
862 static_cast<VkPipelineStageFlags>(1 << 25);
863 VkSubmitInfo submit_info = {};
864 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
865 submit_info.waitSemaphoreCount = 1;
866 submit_info.pWaitSemaphores = &semaphore;
867 submit_info.pWaitDstStageMask = &stage_flags;
868 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
869 m_errorMonitor->VerifyFound();
870
871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
872 "is neither VK_TRUE nor VK_FALSE");
873 // Specify an invalid VkBool32 value
874 // Expected to trigger a warning with
875 // parameter_validation::validate_bool32
876 VkSampler sampler = VK_NULL_HANDLE;
877 VkSamplerCreateInfo sampler_info = {};
878 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
879 sampler_info.pNext = NULL;
880 sampler_info.magFilter = VK_FILTER_NEAREST;
881 sampler_info.minFilter = VK_FILTER_NEAREST;
882 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
883 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
884 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
885 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
886 sampler_info.mipLodBias = 1.0;
887 sampler_info.maxAnisotropy = 1;
888 sampler_info.compareEnable = VK_FALSE;
889 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
890 sampler_info.minLod = 1.0;
891 sampler_info.maxLod = 1.0;
892 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
893 sampler_info.unnormalizedCoordinates = VK_FALSE;
894 // Not VK_TRUE or VK_FALSE
895 sampler_info.anisotropyEnable = 3;
896 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
897 m_errorMonitor->VerifyFound();
898}
Dustin Gravesfce74c02016-05-10 11:42:58 -0600899
900TEST_F(VkLayerTest, FailedReturnValue) {
901 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
902
903 ASSERT_NO_FATAL_FAILURE(InitState());
904
905 m_errorMonitor->SetDesiredFailureMsg(
906 VK_DEBUG_REPORT_WARNING_BIT_EXT,
907 "the requested format is not supported on this device");
908 // Specify invalid VkFormat value to generate a
909 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
910 // Expected to trigger a warning from parameter_validation::validate_result
911 VkImageFormatProperties image_format_properties;
912 VkResult err = vkGetPhysicalDeviceImageFormatProperties(
913 gpu(), static_cast<VkFormat>(0x8000), VK_IMAGE_TYPE_2D,
914 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0,
915 &image_format_properties);
916 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
917 m_errorMonitor->VerifyFound();
918}
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600919#endif // PARAMETER_VALIDATION_TESTS
920
Tobin Ehlis0788f522015-05-26 16:11:58 -0600921#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700922#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800923TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500924{
925 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500926 VkFenceCreateInfo fenceInfo = {};
927 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
928 fenceInfo.pNext = NULL;
929 fenceInfo.flags = 0;
930
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600932
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500933 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600934
935 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
936 vk_testing::Buffer buffer;
937 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500938
Tony Barbourfe3351b2015-07-28 10:17:20 -0600939 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800940 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600941 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500942
943 testFence.init(*m_device, fenceInfo);
944
945 // Bypass framework since it does the waits automatically
946 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600947 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800948 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
949 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800950 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600951 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700952 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800953 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800954 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800955 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600956 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600957
958 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500959 ASSERT_VK_SUCCESS( err );
960
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500961 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800962 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500963
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200964 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500965}
966
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800967TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500968{
969 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500970 VkFenceCreateInfo fenceInfo = {};
971 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
972 fenceInfo.pNext = NULL;
973 fenceInfo.flags = 0;
974
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600976
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500977 ASSERT_NO_FATAL_FAILURE(InitState());
978 ASSERT_NO_FATAL_FAILURE(InitViewport());
979 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
980
Tony Barbourfe3351b2015-07-28 10:17:20 -0600981 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800982 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600983 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500984
985 testFence.init(*m_device, fenceInfo);
986
987 // Bypass framework since it does the waits automatically
988 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600989 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800990 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
991 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800992 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600993 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700994 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800995 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800996 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800997 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600998 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600999
1000 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001001 ASSERT_VK_SUCCESS( err );
1002
Jon Ashburnf19916e2016-01-11 13:12:43 -07001003 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001004 VkCommandBufferBeginInfo info = {};
1005 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1006 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001007 info.renderPass = VK_NULL_HANDLE;
1008 info.subpass = 0;
1009 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001010 info.occlusionQueryEnable = VK_FALSE;
1011 info.queryFlags = 0;
1012 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001013
1014 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001015 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001016
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001017 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001018}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001019#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001020
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001021// This is a positive test. No failures are expected.
1022TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
1023 VkResult err;
1024 bool pass;
1025
1026 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
1027 "the buffer, create an image, and bind the same memory to "
1028 "it");
1029
1030 m_errorMonitor->ExpectSuccess();
1031
1032 ASSERT_NO_FATAL_FAILURE(InitState());
1033
1034 VkBuffer buffer;
1035 VkImage image;
1036 VkDeviceMemory mem;
1037 VkMemoryRequirements mem_reqs;
1038
1039 VkBufferCreateInfo buf_info = {};
1040 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1041 buf_info.pNext = NULL;
1042 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1043 buf_info.size = 256;
1044 buf_info.queueFamilyIndexCount = 0;
1045 buf_info.pQueueFamilyIndices = NULL;
1046 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1047 buf_info.flags = 0;
1048 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1049 ASSERT_VK_SUCCESS(err);
1050
1051 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1052
1053 VkMemoryAllocateInfo alloc_info = {};
1054 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1055 alloc_info.pNext = NULL;
1056 alloc_info.memoryTypeIndex = 0;
1057
1058 // Ensure memory is big enough for both bindings
1059 alloc_info.allocationSize = 0x10000;
1060
1061 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1062 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1063 if (!pass) {
1064 vkDestroyBuffer(m_device->device(), buffer, NULL);
1065 return;
1066 }
1067
1068 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1069 ASSERT_VK_SUCCESS(err);
1070
1071 uint8_t *pData;
1072 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1073 (void **)&pData);
1074 ASSERT_VK_SUCCESS(err);
1075
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001076 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001077
1078 vkUnmapMemory(m_device->device(), mem);
1079
1080 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1081 ASSERT_VK_SUCCESS(err);
1082
1083 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1084 // memory. In fact, it was never used by the GPU.
1085 // Just be be sure, wait for idle.
1086 vkDestroyBuffer(m_device->device(), buffer, NULL);
1087 vkDeviceWaitIdle(m_device->device());
1088
1089 VkImageCreateInfo image_create_info = {};
1090 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1091 image_create_info.pNext = NULL;
1092 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1093 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1094 image_create_info.extent.width = 64;
1095 image_create_info.extent.height = 64;
1096 image_create_info.extent.depth = 1;
1097 image_create_info.mipLevels = 1;
1098 image_create_info.arrayLayers = 1;
1099 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1100 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1101 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1102 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1103 image_create_info.queueFamilyIndexCount = 0;
1104 image_create_info.pQueueFamilyIndices = NULL;
1105 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1106 image_create_info.flags = 0;
1107
1108 VkMemoryAllocateInfo mem_alloc = {};
1109 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1110 mem_alloc.pNext = NULL;
1111 mem_alloc.allocationSize = 0;
1112 mem_alloc.memoryTypeIndex = 0;
1113
1114 /* Create a mappable image. It will be the texture if linear images are ok
1115 * to be textures or it will be the staging image if they are not.
1116 */
1117 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1118 ASSERT_VK_SUCCESS(err);
1119
1120 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1121
1122 mem_alloc.allocationSize = mem_reqs.size;
1123
1124 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
1125 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1126 if (!pass) {
1127 vkDestroyImage(m_device->device(), image, NULL);
1128 return;
1129 }
1130
1131 // VALDIATION FAILURE:
1132 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1133 ASSERT_VK_SUCCESS(err);
1134
1135 m_errorMonitor->VerifyNotFound();
1136
1137 vkDestroyBuffer(m_device->device(), buffer, NULL);
1138 vkDestroyImage(m_device->device(), image, NULL);
1139}
1140
Tobin Ehlisf11be982016-05-11 13:52:53 -06001141TEST_F(VkLayerTest, InvalidMemoryAliasing) {
1142 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
1143 "buffer and image to memory such that they will alias.");
1144 VkResult err;
1145 bool pass;
1146 ASSERT_NO_FATAL_FAILURE(InitState());
1147
1148 VkBuffer buffer;
1149 VkImage image;
1150 VkDeviceMemory mem; // buffer will be bound first
1151 VkDeviceMemory mem_img; // image bound first
1152 VkMemoryRequirements mem_reqs;
1153
1154 VkBufferCreateInfo buf_info = {};
1155 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1156 buf_info.pNext = NULL;
1157 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1158 buf_info.size = 256;
1159 buf_info.queueFamilyIndexCount = 0;
1160 buf_info.pQueueFamilyIndices = NULL;
1161 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1162 buf_info.flags = 0;
1163 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1164 ASSERT_VK_SUCCESS(err);
1165
1166 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1167 VkMemoryAllocateInfo alloc_info = {};
1168 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1169 alloc_info.pNext = NULL;
1170 alloc_info.memoryTypeIndex = 0;
1171
1172 // Ensure memory is big enough for both bindings
1173 alloc_info.allocationSize = 0x10000;
1174 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1175 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1176 if (!pass) {
1177 vkDestroyBuffer(m_device->device(), buffer, NULL);
1178 return;
1179 }
1180 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1181 ASSERT_VK_SUCCESS(err);
1182
1183 uint8_t *pData;
1184 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1185 (void **)&pData);
1186 ASSERT_VK_SUCCESS(err);
1187 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
1188 vkUnmapMemory(m_device->device(), mem);
1189 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1190 ASSERT_VK_SUCCESS(err);
1191
1192 VkImageCreateInfo image_create_info = {};
1193 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1194 image_create_info.pNext = NULL;
1195 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1196 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1197 image_create_info.extent.width = 64;
1198 image_create_info.extent.height = 64;
1199 image_create_info.extent.depth = 1;
1200 image_create_info.mipLevels = 1;
1201 image_create_info.arrayLayers = 1;
1202 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1203 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1204 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1205 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1206 image_create_info.queueFamilyIndexCount = 0;
1207 image_create_info.pQueueFamilyIndices = NULL;
1208 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1209 image_create_info.flags = 0;
1210
1211 VkMemoryAllocateInfo mem_alloc = {};
1212 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1213 mem_alloc.pNext = NULL;
1214 mem_alloc.allocationSize = 0;
1215 mem_alloc.memoryTypeIndex = 0;
1216
1217 /* Create a mappable image. It will be the texture if linear images are ok
1218 * to be textures or it will be the staging image if they are not.
1219 */
1220 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1221 ASSERT_VK_SUCCESS(err);
1222
1223 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1224 mem_alloc.allocationSize = mem_reqs.size;
1225 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
1226 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1227 if (!pass) {
1228 vkDestroyImage(m_device->device(), image, NULL);
1229 return;
1230 }
1231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1232 " is aliased with buffer 0x");
1233 // VALDIATION FAILURE due to image mapping overlapping buffer mapping
1234 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1235 m_errorMonitor->VerifyFound();
1236
1237 // Now correctly bind image to second mem allocation before incorrectly
1238 // aliasing buffer
1239 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1240 ASSERT_VK_SUCCESS(err);
1241 err = vkBindImageMemory(m_device->device(), image, mem_img, 0);
1242 ASSERT_VK_SUCCESS(err);
1243 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1244 " is aliased with image 0x");
1245 err = vkBindBufferMemory(m_device->device(), buffer, mem_img, 0);
1246 m_errorMonitor->VerifyFound();
1247
1248 vkDestroyBuffer(m_device->device(), buffer, NULL);
1249 vkDestroyImage(m_device->device(), image, NULL);
1250 vkFreeMemory(m_device->device(), mem, NULL);
1251 vkFreeMemory(m_device->device(), mem_img, NULL);
1252}
1253
Tobin Ehlis35372522016-05-12 08:32:31 -06001254TEST_F(VkLayerTest, InvalidMemoryMapping) {
1255 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1256 VkResult err;
1257 bool pass;
1258 ASSERT_NO_FATAL_FAILURE(InitState());
1259
1260 VkBuffer buffer;
1261 VkDeviceMemory mem;
1262 VkMemoryRequirements mem_reqs;
1263
1264 VkBufferCreateInfo buf_info = {};
1265 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1266 buf_info.pNext = NULL;
1267 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1268 buf_info.size = 256;
1269 buf_info.queueFamilyIndexCount = 0;
1270 buf_info.pQueueFamilyIndices = NULL;
1271 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1272 buf_info.flags = 0;
1273 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1274 ASSERT_VK_SUCCESS(err);
1275
1276 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1277 VkMemoryAllocateInfo alloc_info = {};
1278 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1279 alloc_info.pNext = NULL;
1280 alloc_info.memoryTypeIndex = 0;
1281
1282 // Ensure memory is big enough for both bindings
1283 static const VkDeviceSize allocation_size = 0x10000;
1284 alloc_info.allocationSize = allocation_size;
1285 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1286 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1287 if (!pass) {
1288 vkDestroyBuffer(m_device->device(), buffer, NULL);
1289 return;
1290 }
1291 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1292 ASSERT_VK_SUCCESS(err);
1293
1294 uint8_t *pData;
1295 // Attempt to map memory size 0 is invalid
1296 m_errorMonitor->SetDesiredFailureMsg(
1297 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1298 "VkMapMemory: Attempting to map memory range of size zero");
1299 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1300 m_errorMonitor->VerifyFound();
1301 // Map memory twice
1302 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1303 (void **)&pData);
1304 ASSERT_VK_SUCCESS(err);
1305 m_errorMonitor->SetDesiredFailureMsg(
1306 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1307 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1308 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1309 (void **)&pData);
1310 m_errorMonitor->VerifyFound();
1311
1312 // Unmap the memory to avoid re-map error
1313 vkUnmapMemory(m_device->device(), mem);
1314 // overstep allocation with VK_WHOLE_SIZE
1315 m_errorMonitor->SetDesiredFailureMsg(
1316 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1317 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1318 err = vkMapMemory(m_device->device(), mem, allocation_size + 1,
1319 VK_WHOLE_SIZE, 0, (void **)&pData);
1320 m_errorMonitor->VerifyFound();
1321 // overstep allocation w/o VK_WHOLE_SIZE
1322 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1323 " oversteps total array size 0x");
1324 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0,
1325 (void **)&pData);
1326 m_errorMonitor->VerifyFound();
1327 // Now error due to unmapping memory that's not mapped
1328 m_errorMonitor->SetDesiredFailureMsg(
1329 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1330 "Unmapping Memory without memory being mapped: ");
1331 vkUnmapMemory(m_device->device(), mem);
1332 m_errorMonitor->VerifyFound();
1333 // Now map memory and cause errors due to flushing invalid ranges
1334 err = vkMapMemory(m_device->device(), mem, 16, VK_WHOLE_SIZE, 0,
1335 (void **)&pData);
1336 ASSERT_VK_SUCCESS(err);
1337 VkMappedMemoryRange mmr = {};
1338 mmr.memory = mem;
1339 mmr.offset = 15; // Error b/c offset less than offset of mapped mem
1340 m_errorMonitor->SetDesiredFailureMsg(
1341 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1342 ") is less than Memory Object's offset (");
1343 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1344 m_errorMonitor->VerifyFound();
1345 // Now flush range that oversteps mapped range
1346 vkUnmapMemory(m_device->device(), mem);
1347 err = vkMapMemory(m_device->device(), mem, 0, 256, 0, (void **)&pData);
1348 ASSERT_VK_SUCCESS(err);
1349 mmr.offset = 16;
1350 mmr.size = 256; // flushing bounds (272) exceed mapped bounds (256)
1351 m_errorMonitor->SetDesiredFailureMsg(
1352 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1353 ") exceeds the Memory Object's upper-bound (");
1354 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1355 m_errorMonitor->VerifyFound();
1356
1357 pass =
1358 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1359 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1360 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
1361 if (!pass) {
1362 vkFreeMemory(m_device->device(), mem, NULL);
1363 vkDestroyBuffer(m_device->device(), buffer, NULL);
1364 return;
1365 }
1366 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1367 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1368
1369 vkDestroyBuffer(m_device->device(), buffer, NULL);
1370 vkFreeMemory(m_device->device(), mem, NULL);
1371}
1372
Ian Elliott1c32c772016-04-28 14:47:13 -06001373TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1374 VkResult err;
1375 bool pass;
1376
Ian Elliott489eec02016-05-05 14:12:44 -06001377// FIXME: After we turn on this code for non-Linux platforms, uncomment the
1378// following declaration (which is temporarily being moved below):
1379// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001380 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
1381 VkSwapchainCreateInfoKHR swapchain_create_info = {};
1382 uint32_t swapchain_image_count = 0;
1383// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
1384 uint32_t image_index = 0;
1385// VkPresentInfoKHR present_info = {};
1386
1387 ASSERT_NO_FATAL_FAILURE(InitState());
1388
Ian Elliott3f06ce52016-04-29 14:46:21 -06001389#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1390#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1391 // Use the functions from the VK_KHR_android_surface extension without
1392 // enabling that extension:
1393
1394 // Create a surface:
1395 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06001396 m_errorMonitor->SetDesiredFailureMsg(
1397 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1398 "extension was not enabled for this");
1399 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
1400 &surface);
1401 pass = (err != VK_SUCCESS);
1402 ASSERT_TRUE(pass);
1403 m_errorMonitor->VerifyFound();
1404#endif // VK_USE_PLATFORM_ANDROID_KHR
1405
1406
1407#if defined(VK_USE_PLATFORM_MIR_KHR)
1408 // Use the functions from the VK_KHR_mir_surface extension without enabling
1409 // that extension:
1410
1411 // Create a surface:
1412 VkMirSurfaceCreateInfoKHR mir_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06001413 m_errorMonitor->SetDesiredFailureMsg(
1414 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1415 "extension was not enabled for this");
1416 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1417 pass = (err != VK_SUCCESS);
1418 ASSERT_TRUE(pass);
1419 m_errorMonitor->VerifyFound();
1420
1421 // Tell whether an mir_connection supports presentation:
1422 MirConnection *mir_connection = NULL;
1423 m_errorMonitor->SetDesiredFailureMsg(
1424 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1425 "extension was not enabled for this");
1426 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
1427 visual_id);
1428 m_errorMonitor->VerifyFound();
1429#endif // VK_USE_PLATFORM_MIR_KHR
1430
1431
1432#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1433 // Use the functions from the VK_KHR_wayland_surface extension without
1434 // enabling that extension:
1435
1436 // Create a surface:
1437 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06001438 m_errorMonitor->SetDesiredFailureMsg(
1439 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1440 "extension was not enabled for this");
1441 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
1442 &surface);
1443 pass = (err != VK_SUCCESS);
1444 ASSERT_TRUE(pass);
1445 m_errorMonitor->VerifyFound();
1446
1447 // Tell whether an wayland_display supports presentation:
1448 struct wl_display wayland_display = {};
1449 m_errorMonitor->SetDesiredFailureMsg(
1450 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1451 "extension was not enabled for this");
1452 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
1453 &wayland_display);
1454 m_errorMonitor->VerifyFound();
1455#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06001456#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001457
1458
1459#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06001460// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1461// TO NON-LINUX PLATFORMS:
1462VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001463 // Use the functions from the VK_KHR_win32_surface extension without
1464 // enabling that extension:
1465
1466 // Create a surface:
1467 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06001468 m_errorMonitor->SetDesiredFailureMsg(
1469 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1470 "extension was not enabled for this");
1471 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
1472 &surface);
1473 pass = (err != VK_SUCCESS);
1474 ASSERT_TRUE(pass);
1475 m_errorMonitor->VerifyFound();
1476
1477 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001478 m_errorMonitor->SetDesiredFailureMsg(
1479 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1480 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001481 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001482 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001483// Set this (for now, until all platforms are supported and tested):
1484#define NEED_TO_TEST_THIS_ON_PLATFORM
1485#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001486
1487
Ian Elliott1c32c772016-04-28 14:47:13 -06001488#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06001489// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1490// TO NON-LINUX PLATFORMS:
1491VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001492 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1493 // that extension:
1494
1495 // Create a surface:
1496 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001497 m_errorMonitor->SetDesiredFailureMsg(
1498 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1499 "extension was not enabled for this");
1500 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1501 pass = (err != VK_SUCCESS);
1502 ASSERT_TRUE(pass);
1503 m_errorMonitor->VerifyFound();
1504
1505 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001506 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001507 xcb_visualid_t visual_id = 0;
1508 m_errorMonitor->SetDesiredFailureMsg(
1509 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1510 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001511 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06001512 visual_id);
1513 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001514// Set this (for now, until all platforms are supported and tested):
1515#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001516#endif // VK_USE_PLATFORM_XCB_KHR
1517
1518
Ian Elliott12630812016-04-29 14:35:43 -06001519#if defined(VK_USE_PLATFORM_XLIB_KHR)
1520 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1521 // that extension:
1522
1523 // Create a surface:
1524 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
Ian Elliott12630812016-04-29 14:35:43 -06001525 m_errorMonitor->SetDesiredFailureMsg(
1526 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1527 "extension was not enabled for this");
1528 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1529 pass = (err != VK_SUCCESS);
1530 ASSERT_TRUE(pass);
1531 m_errorMonitor->VerifyFound();
1532
1533 // Tell whether an Xlib VisualID supports presentation:
1534 Display *dpy = NULL;
1535 VisualID visual = 0;
1536 m_errorMonitor->SetDesiredFailureMsg(
1537 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1538 "extension was not enabled for this");
1539 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1540 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001541// Set this (for now, until all platforms are supported and tested):
1542#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06001543#endif // VK_USE_PLATFORM_XLIB_KHR
1544
1545
Ian Elliott1c32c772016-04-28 14:47:13 -06001546 // Use the functions from the VK_KHR_surface extension without enabling
1547 // that extension:
1548
Ian Elliott489eec02016-05-05 14:12:44 -06001549#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001550 // Destroy a surface:
1551 m_errorMonitor->SetDesiredFailureMsg(
1552 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1553 "extension was not enabled for this");
1554 vkDestroySurfaceKHR(instance(), surface, NULL);
1555 m_errorMonitor->VerifyFound();
1556
1557 // Check if surface supports presentation:
1558 VkBool32 supported = false;
1559 m_errorMonitor->SetDesiredFailureMsg(
1560 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1561 "extension was not enabled for this");
1562 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1563 pass = (err != VK_SUCCESS);
1564 ASSERT_TRUE(pass);
1565 m_errorMonitor->VerifyFound();
1566
1567 // Check surface capabilities:
1568 VkSurfaceCapabilitiesKHR capabilities = {};
1569 m_errorMonitor->SetDesiredFailureMsg(
1570 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1571 "extension was not enabled for this");
1572 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
1573 &capabilities);
1574 pass = (err != VK_SUCCESS);
1575 ASSERT_TRUE(pass);
1576 m_errorMonitor->VerifyFound();
1577
1578 // Check surface formats:
1579 uint32_t format_count = 0;
1580 VkSurfaceFormatKHR *formats = NULL;
1581 m_errorMonitor->SetDesiredFailureMsg(
1582 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1583 "extension was not enabled for this");
1584 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1585 &format_count, formats);
1586 pass = (err != VK_SUCCESS);
1587 ASSERT_TRUE(pass);
1588 m_errorMonitor->VerifyFound();
1589
1590 // Check surface present modes:
1591 uint32_t present_mode_count = 0;
1592 VkSurfaceFormatKHR *present_modes = NULL;
1593 m_errorMonitor->SetDesiredFailureMsg(
1594 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1595 "extension was not enabled for this");
1596 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1597 &present_mode_count, present_modes);
1598 pass = (err != VK_SUCCESS);
1599 ASSERT_TRUE(pass);
1600 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001601#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001602
1603
1604 // Use the functions from the VK_KHR_swapchain extension without enabling
1605 // that extension:
1606
1607 // Create a swapchain:
1608 m_errorMonitor->SetDesiredFailureMsg(
1609 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1610 "extension was not enabled for this");
1611 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1612 swapchain_create_info.pNext = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001613 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1614 NULL, &swapchain);
1615 pass = (err != VK_SUCCESS);
1616 ASSERT_TRUE(pass);
1617 m_errorMonitor->VerifyFound();
1618
1619 // Get the images from the swapchain:
1620 m_errorMonitor->SetDesiredFailureMsg(
1621 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1622 "extension was not enabled for this");
1623 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
1624 &swapchain_image_count, NULL);
1625 pass = (err != VK_SUCCESS);
1626 ASSERT_TRUE(pass);
1627 m_errorMonitor->VerifyFound();
1628
1629 // Try to acquire an image:
1630 m_errorMonitor->SetDesiredFailureMsg(
1631 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1632 "extension was not enabled for this");
1633 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
1634 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
1635 pass = (err != VK_SUCCESS);
1636 ASSERT_TRUE(pass);
1637 m_errorMonitor->VerifyFound();
1638
1639 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001640 //
1641 // NOTE: Currently can't test this because a real swapchain is needed (as
1642 // opposed to the fake one we created) in order for the layer to lookup the
1643 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001644
1645 // Destroy the swapchain:
1646 m_errorMonitor->SetDesiredFailureMsg(
1647 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1648 "extension was not enabled for this");
1649 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1650 m_errorMonitor->VerifyFound();
1651}
1652
Ian Elliott2c1daf52016-05-12 09:41:46 -06001653TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
1654 VkResult err;
1655 bool pass;
1656
1657 VkSurfaceKHR surface = VK_NULL_HANDLE;
1658#if defined(VK_USE_PLATFORM_XCB_KHR)
1659 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
1660 VkSwapchainCreateInfoKHR swapchain_create_info = {};
1661// uint32_t swapchain_image_count = 0;
1662// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
1663// uint32_t image_index = 0;
1664// VkPresentInfoKHR present_info = {};
1665
1666 ASSERT_NO_FATAL_FAILURE(InitState());
1667
1668 // Use the create function from one of the VK_KHR_*_surface extension in
1669 // order to create a surface, testing all known errors in the process,
1670 // before successfully creating a surface:
1671 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
1672 m_errorMonitor->SetDesiredFailureMsg(
1673 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1674 "called with NULL pointer");
1675 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
1676 pass = (err != VK_SUCCESS);
1677 ASSERT_TRUE(pass);
1678 m_errorMonitor->VerifyFound();
1679
1680 // Next, try to create a surface with the wrong
1681 // VkXcbSurfaceCreateInfoKHR::sType:
1682 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
1683 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
1684 m_errorMonitor->SetDesiredFailureMsg(
1685 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1686 "called with the wrong value for");
1687 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1688 pass = (err != VK_SUCCESS);
1689 ASSERT_TRUE(pass);
1690 m_errorMonitor->VerifyFound();
1691
1692
1693 // Create a native window, and then correctly create a surface:
1694 xcb_connection_t *connection;
1695 xcb_screen_t *screen;
1696 xcb_window_t xcb_window;
1697 xcb_intern_atom_reply_t *atom_wm_delete_window;
1698
1699 const xcb_setup_t *setup;
1700 xcb_screen_iterator_t iter;
1701 int scr;
1702 uint32_t value_mask, value_list[32];
1703 int width = 1;
1704 int height = 1;
1705
1706 connection = xcb_connect(NULL, &scr);
1707 ASSERT_TRUE(connection != NULL);
1708 setup = xcb_get_setup(connection);
1709 iter = xcb_setup_roots_iterator(setup);
1710 while (scr-- > 0)
1711 xcb_screen_next(&iter);
1712 screen = iter.data;
1713
1714 xcb_window = xcb_generate_id(connection);
1715
1716 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
1717 value_list[0] = screen->black_pixel;
1718 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE |
1719 XCB_EVENT_MASK_STRUCTURE_NOTIFY;
1720
1721 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window,
1722 screen->root, 0, 0, width, height, 0,
1723 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual,
1724 value_mask, value_list);
1725
1726 /* Magic code that will send notification when window is destroyed */
1727 xcb_intern_atom_cookie_t cookie =
1728 xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
1729 xcb_intern_atom_reply_t *reply =
1730 xcb_intern_atom_reply(connection, cookie, 0);
1731
1732 xcb_intern_atom_cookie_t cookie2 =
1733 xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
1734 atom_wm_delete_window =
1735 xcb_intern_atom_reply(connection, cookie2, 0);
1736 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window,
1737 (*reply).atom, 4, 32, 1,
1738 &(*atom_wm_delete_window).atom);
1739 free(reply);
1740
1741 xcb_map_window(connection, xcb_window);
1742
1743 // Force the x/y coordinates to 100,100 results are identical in consecutive
1744 // runs
1745 const uint32_t coords[] = {100, 100};
1746 xcb_configure_window(connection, xcb_window,
1747 XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
1748
1749
1750
1751 // Finally, try to correctly create a surface:
1752 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
1753 xcb_create_info.pNext = NULL;
1754 xcb_create_info.flags = 0;
1755 xcb_create_info.connection = connection;
1756 xcb_create_info.window = xcb_window;
1757 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1758 pass = (err == VK_SUCCESS);
1759 ASSERT_TRUE(pass);
1760
1761
1762
1763 // Check if surface supports presentation:
1764
1765 // 1st, do so without having queried the queue families:
1766 VkBool32 supported = false;
1767 // TODO: Get the following error to come out:
1768 m_errorMonitor->SetDesiredFailureMsg(
1769 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1770 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
1771 "function");
1772 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1773 pass = (err != VK_SUCCESS);
1774// ASSERT_TRUE(pass);
1775// m_errorMonitor->VerifyFound();
1776
1777 // Next, query a queue family index that's too large:
1778 m_errorMonitor->SetDesiredFailureMsg(
1779 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1780 "called with a queueFamilyIndex that is too large");
1781 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
1782 pass = (err != VK_SUCCESS);
1783 ASSERT_TRUE(pass);
1784 m_errorMonitor->VerifyFound();
1785
1786 // Finally, do so correctly:
1787// FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S SUPPORTED
1788 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1789 pass = (err == VK_SUCCESS);
1790 ASSERT_TRUE(pass);
1791
1792
1793
1794 // Before proceeding, try to create a swapchain without having called
1795 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
1796 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1797 swapchain_create_info.pNext = NULL;
1798 swapchain_create_info.flags = 0;
1799 m_errorMonitor->SetDesiredFailureMsg(
1800 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1801 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
1802 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1803 NULL, &swapchain);
1804 pass = (err != VK_SUCCESS);
1805 ASSERT_TRUE(pass);
1806 m_errorMonitor->VerifyFound();
1807
1808
1809
1810 // Get the surface capabilities:
1811 VkSurfaceCapabilitiesKHR surface_capabilities;
1812
1813 // Do so correctly (only error logged by this entrypoint is if the
1814 // extension isn't enabled):
1815 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
1816 &surface_capabilities);
1817 pass = (err == VK_SUCCESS);
1818 ASSERT_TRUE(pass);
1819
1820
1821
1822 // Get the surface formats:
1823 uint32_t surface_format_count;
1824
1825 // First, try without a pointer to surface_format_count:
1826 m_errorMonitor->SetDesiredFailureMsg(
1827 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1828 "called with NULL pointer");
1829 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
1830 pass = (err == VK_SUCCESS);
1831 ASSERT_TRUE(pass);
1832 m_errorMonitor->VerifyFound();
1833
1834 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
1835 // correctly done a 1st try (to get the count):
1836 m_errorMonitor->SetDesiredFailureMsg(
1837 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1838 "but no prior positive value has been seen for");
1839 surface_format_count = 0;
1840 vkGetPhysicalDeviceSurfaceFormatsKHR(
1841 gpu(),
1842 surface,
1843 &surface_format_count,
1844 (VkSurfaceFormatKHR *) &surface_format_count);
1845 pass = (err == VK_SUCCESS);
1846 ASSERT_TRUE(pass);
1847 m_errorMonitor->VerifyFound();
1848
1849 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
1850 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1851 &surface_format_count, NULL);
1852 pass = (err == VK_SUCCESS);
1853 ASSERT_TRUE(pass);
1854
1855 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
1856 VkSurfaceFormatKHR *surface_formats =
1857 (VkSurfaceFormatKHR *)malloc(surface_format_count *
1858 sizeof(VkSurfaceFormatKHR));
1859
1860 // Next, do a 2nd try with surface_format_count being set too high:
1861 surface_format_count += 5;
1862 m_errorMonitor->SetDesiredFailureMsg(
1863 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1864 "that is greater than the value");
1865 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1866 &surface_format_count,
1867 surface_formats);
1868 pass = (err == VK_SUCCESS);
1869 ASSERT_TRUE(pass);
1870 m_errorMonitor->VerifyFound();
1871
1872 // Finally, do a correct 1st and 2nd try:
1873 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1874 &surface_format_count, NULL);
1875 pass = (err == VK_SUCCESS);
1876 ASSERT_TRUE(pass);
1877 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
1878 &surface_format_count,
1879 surface_formats);
1880 pass = (err == VK_SUCCESS);
1881 ASSERT_TRUE(pass);
1882
1883
1884
1885 // Get the surface present modes:
1886 uint32_t surface_present_mode_count;
1887
1888 // First, try without a pointer to surface_format_count:
1889 m_errorMonitor->SetDesiredFailureMsg(
1890 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1891 "called with NULL pointer");
1892 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
1893 pass = (err == VK_SUCCESS);
1894 ASSERT_TRUE(pass);
1895 m_errorMonitor->VerifyFound();
1896
1897 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
1898 // correctly done a 1st try (to get the count):
1899 m_errorMonitor->SetDesiredFailureMsg(
1900 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1901 "but no prior positive value has been seen for");
1902 surface_present_mode_count = 0;
1903 vkGetPhysicalDeviceSurfacePresentModesKHR(
1904 gpu(),
1905 surface,
1906 &surface_present_mode_count,
1907 (VkPresentModeKHR *) &surface_present_mode_count);
1908 pass = (err == VK_SUCCESS);
1909 ASSERT_TRUE(pass);
1910 m_errorMonitor->VerifyFound();
1911
1912 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
1913 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface,
1914 &surface_present_mode_count,
1915 NULL);
1916 pass = (err == VK_SUCCESS);
1917 ASSERT_TRUE(pass);
1918
1919 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
1920 VkPresentModeKHR *surface_present_modes =
1921 (VkPresentModeKHR *)malloc(surface_present_mode_count *
1922 sizeof(VkPresentModeKHR));
1923
1924 // Next, do a 2nd try with surface_format_count being set too high:
1925 surface_present_mode_count += 5;
1926 m_errorMonitor->SetDesiredFailureMsg(
1927 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1928 "that is greater than the value");
1929 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface,
1930 &surface_present_mode_count,
1931 surface_present_modes);
1932 pass = (err == VK_SUCCESS);
1933 ASSERT_TRUE(pass);
1934 m_errorMonitor->VerifyFound();
1935
1936 // Finally, do a correct 1st and 2nd try:
1937 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface,
1938 &surface_present_mode_count,
1939 NULL);
1940 pass = (err == VK_SUCCESS);
1941 ASSERT_TRUE(pass);
1942 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface,
1943 &surface_present_mode_count,
1944 surface_present_modes);
1945 pass = (err == VK_SUCCESS);
1946 ASSERT_TRUE(pass);
1947
1948
1949
1950 // Create a swapchain:
1951
1952 // First, try without a pointer to swapchain_create_info:
1953 m_errorMonitor->SetDesiredFailureMsg(
1954 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1955 "called with NULL pointer");
1956 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
1957 pass = (err != VK_SUCCESS);
1958 ASSERT_TRUE(pass);
1959 m_errorMonitor->VerifyFound();
1960
1961 // Next, call with a non-NULL swapchain_create_info, that has the wrong
1962 // sType:
1963 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
1964 m_errorMonitor->SetDesiredFailureMsg(
1965 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1966 "called with the wrong value for");
1967 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1968 NULL, &swapchain);
1969 pass = (err != VK_SUCCESS);
1970 ASSERT_TRUE(pass);
1971 m_errorMonitor->VerifyFound();
1972
1973 // Next, call with a NULL swapchain pointer:
1974 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1975 swapchain_create_info.pNext = NULL;
1976 swapchain_create_info.flags = 0;
1977 m_errorMonitor->SetDesiredFailureMsg(
1978 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1979 "called with NULL pointer");
1980 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1981 NULL, NULL);
1982 pass = (err != VK_SUCCESS);
1983 ASSERT_TRUE(pass);
1984 m_errorMonitor->VerifyFound();
1985
1986// TODO: Enhance swapchain layer so that
1987// swapchain_create_info.queueFamilyIndexCount is checked against something?
1988
1989 // Next, call with a queue family index that's too large:
1990 uint32_t queueFamilyIndex[2] = {100000, 0};
1991 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
1992 swapchain_create_info.queueFamilyIndexCount = 2;
1993 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
1994 m_errorMonitor->SetDesiredFailureMsg(
1995 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1996 "called with a queueFamilyIndex that is too large");
1997 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1998 NULL, &swapchain);
1999 pass = (err != VK_SUCCESS);
2000 ASSERT_TRUE(pass);
2001 m_errorMonitor->VerifyFound();
2002
2003 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
2004 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2005 swapchain_create_info.queueFamilyIndexCount = 1;
2006 m_errorMonitor->SetDesiredFailureMsg(
2007 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2008 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
2009 "pCreateInfo->pQueueFamilyIndices).");
2010 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
2011 NULL, &swapchain);
2012 pass = (err != VK_SUCCESS);
2013 ASSERT_TRUE(pass);
2014 m_errorMonitor->VerifyFound();
2015
2016 // Next, call with an invalid imageSharingMode:
2017 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
2018 swapchain_create_info.queueFamilyIndexCount = 1;
2019 m_errorMonitor->SetDesiredFailureMsg(
2020 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2021 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
2022 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
2023 NULL, &swapchain);
2024 pass = (err != VK_SUCCESS);
2025 ASSERT_TRUE(pass);
2026 m_errorMonitor->VerifyFound();
2027 // Fix for the future:
2028// FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S SUPPORTED
2029 swapchain_create_info.queueFamilyIndexCount = 0;
2030 queueFamilyIndex[0] = 0;
2031 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
2032
2033// TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
2034
2035
2036
2037 // Get the images from a swapchain:
2038
2039
2040
2041 // Acquire an image from a swapchain:
2042
2043
2044
2045 // Present an image to a swapchain:
2046
2047
2048
2049 // Destroy the swapchain:
2050
2051
2052
2053// TODOs:
2054//
2055// - Try destroying the device without first destroying the swapchain
2056//
2057// - Try destroying the device without first destroying the surface
2058//
2059// - Try destroying the surface without first destroying the swapchain
2060
2061
2062 // Destroy the surface:
2063 vkDestroySurfaceKHR(instance(), surface, NULL);
2064
2065
2066 // Tear down the window:
2067 xcb_destroy_window(connection, xcb_window);
2068 xcb_disconnect(connection);
2069
2070#else // VK_USE_PLATFORM_XCB_KHR
2071 err = (surface == VK_NULL_HANDLE) ? VK_SUCCESS : VK_SUCCESS;
2072 pass = (err != VK_SUCCESS);
2073 ASSERT_TRUE(pass);
2074#endif // VK_USE_PLATFORM_XCB_KHR
2075}
2076
Karl Schultz6addd812016-02-02 17:17:23 -07002077TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2078 VkResult err;
2079 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002080
Karl Schultz6addd812016-02-02 17:17:23 -07002081 m_errorMonitor->SetDesiredFailureMsg(
2082 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002083 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
2084
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002085 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002086
2087 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002088 VkImage image;
2089 VkDeviceMemory mem;
2090 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002091
Karl Schultz6addd812016-02-02 17:17:23 -07002092 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2093 const int32_t tex_width = 32;
2094 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002095
Tony Barboureb254902015-07-15 12:50:33 -06002096 VkImageCreateInfo image_create_info = {};
2097 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002098 image_create_info.pNext = NULL;
2099 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2100 image_create_info.format = tex_format;
2101 image_create_info.extent.width = tex_width;
2102 image_create_info.extent.height = tex_height;
2103 image_create_info.extent.depth = 1;
2104 image_create_info.mipLevels = 1;
2105 image_create_info.arrayLayers = 1;
2106 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2107 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2108 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2109 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002110
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002111 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002112 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002113 mem_alloc.pNext = NULL;
2114 mem_alloc.allocationSize = 0;
2115 // Introduce failure, do NOT set memProps to
2116 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
2117 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002118
Chia-I Wuf7458c52015-10-26 21:10:41 +08002119 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002120 ASSERT_VK_SUCCESS(err);
2121
Karl Schultz6addd812016-02-02 17:17:23 -07002122 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002123
Mark Lobodzinski23065352015-05-29 09:32:35 -05002124 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002125
Karl Schultz6addd812016-02-02 17:17:23 -07002126 pass =
2127 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
2128 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2129 if (!pass) { // If we can't find any unmappable memory this test doesn't
2130 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002131 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002132 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002133 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002134
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002135 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002136 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002137 ASSERT_VK_SUCCESS(err);
2138
2139 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002140 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002141 ASSERT_VK_SUCCESS(err);
2142
2143 // Map memory as if to initialize the image
2144 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002145 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
2146 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002147
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002148 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002149
Chia-I Wuf7458c52015-10-26 21:10:41 +08002150 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002151}
2152
Karl Schultz6addd812016-02-02 17:17:23 -07002153TEST_F(VkLayerTest, RebindMemory) {
2154 VkResult err;
2155 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002156
Karl Schultz6addd812016-02-02 17:17:23 -07002157 m_errorMonitor->SetDesiredFailureMsg(
2158 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002159 "which has already been bound to mem object");
2160
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002161 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002162
2163 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002164 VkImage image;
2165 VkDeviceMemory mem1;
2166 VkDeviceMemory mem2;
2167 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002168
Karl Schultz6addd812016-02-02 17:17:23 -07002169 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2170 const int32_t tex_width = 32;
2171 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002172
Tony Barboureb254902015-07-15 12:50:33 -06002173 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002174 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2175 image_create_info.pNext = NULL;
2176 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2177 image_create_info.format = tex_format;
2178 image_create_info.extent.width = tex_width;
2179 image_create_info.extent.height = tex_height;
2180 image_create_info.extent.depth = 1;
2181 image_create_info.mipLevels = 1;
2182 image_create_info.arrayLayers = 1;
2183 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2184 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2185 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2186 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002187
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002188 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002189 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2190 mem_alloc.pNext = NULL;
2191 mem_alloc.allocationSize = 0;
2192 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002193
Karl Schultz6addd812016-02-02 17:17:23 -07002194 // Introduce failure, do NOT set memProps to
2195 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002196 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002197 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002198 ASSERT_VK_SUCCESS(err);
2199
Karl Schultz6addd812016-02-02 17:17:23 -07002200 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002201
2202 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002203 pass =
2204 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002205 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002206
2207 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002208 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002209 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002210 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002211 ASSERT_VK_SUCCESS(err);
2212
2213 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002214 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002215 ASSERT_VK_SUCCESS(err);
2216
Karl Schultz6addd812016-02-02 17:17:23 -07002217 // Introduce validation failure, try to bind a different memory object to
2218 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002219 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002220
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002221 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002222
Chia-I Wuf7458c52015-10-26 21:10:41 +08002223 vkDestroyImage(m_device->device(), image, NULL);
2224 vkFreeMemory(m_device->device(), mem1, NULL);
2225 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002226}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002227
Karl Schultz6addd812016-02-02 17:17:23 -07002228TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002229 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002230
Karl Schultz6addd812016-02-02 17:17:23 -07002231 m_errorMonitor->SetDesiredFailureMsg(
2232 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
2233 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002234
2235 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002236 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2237 fenceInfo.pNext = NULL;
2238 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002239
Tony Barbour300a6082015-04-07 13:44:53 -06002240 ASSERT_NO_FATAL_FAILURE(InitState());
2241 ASSERT_NO_FATAL_FAILURE(InitViewport());
2242 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2243
Tony Barbourfe3351b2015-07-28 10:17:20 -06002244 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002245 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2246 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06002247 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002248
2249 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002250
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002251 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002252 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2253 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002254 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002255 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002256 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002257 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002258 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002259 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002260 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002261
2262 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002263 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002264
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002265 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002266}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002267// This is a positive test. We used to expect error in this case but spec now
2268// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07002269TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002270 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002271 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002272 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002273 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2274 fenceInfo.pNext = NULL;
2275
Tony Barbour0b4d9562015-04-09 10:48:04 -06002276 ASSERT_NO_FATAL_FAILURE(InitState());
2277 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08002278 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002279 VkResult result = vkResetFences(m_device->device(), 1, fences);
2280 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06002281
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002282 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06002283}
Tobin Ehlis41376e12015-07-03 08:45:14 -06002284
2285TEST_F(VkLayerTest, InvalidUsageBits)
2286{
Tony Barbourf92621a2016-05-02 14:28:12 -06002287 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002288 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06002289 "Initialize buffer with wrong usage then perform copy expecting errors "
2290 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002292 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002293
2294 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06002295 VkImageObj image(m_device);
2296 // Initialize image with USAGE_INPUT_ATTACHMENT
2297 image.init(128, 128, VK_FORMAT_D32_SFLOAT_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002298 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2299 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002300
Tony Barbourf92621a2016-05-02 14:28:12 -06002301 VkImageView dsv;
2302 VkImageViewCreateInfo dsvci = {};
2303 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2304 dsvci.image = image.handle();
2305 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
2306 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
2307 dsvci.subresourceRange.layerCount = 1;
2308 dsvci.subresourceRange.baseMipLevel = 0;
2309 dsvci.subresourceRange.levelCount = 1;
2310 dsvci.subresourceRange.aspectMask =
2311 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002312
Tony Barbourf92621a2016-05-02 14:28:12 -06002313 // Create a view with depth / stencil aspect for image with different usage
2314 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002315
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002316 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002317
2318 // Initialize buffer with TRANSFER_DST usage
2319 vk_testing::Buffer buffer;
2320 VkMemoryPropertyFlags reqs = 0;
2321 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2322 VkBufferImageCopy region = {};
2323 region.bufferRowLength = 128;
2324 region.bufferImageHeight = 128;
2325 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2326 region.imageSubresource.layerCount = 1;
2327 region.imageExtent.height = 16;
2328 region.imageExtent.width = 16;
2329 region.imageExtent.depth = 1;
2330
2331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2332 "Invalid usage flag for buffer ");
2333 // Buffer usage not set to TRANSFER_SRC and image usage not set to
2334 // TRANSFER_DST
2335 BeginCommandBuffer();
2336 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
2337 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
2338 1, &region);
2339 m_errorMonitor->VerifyFound();
2340
2341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2342 "Invalid usage flag for image ");
2343 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
2344 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
2345 1, &region);
2346 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002347}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002348#endif // MEM_TRACKER_TESTS
2349
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06002350#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002351
2352TEST_F(VkLayerTest, LeakAnObject) {
2353 VkResult err;
2354
2355 TEST_DESCRIPTION(
2356 "Create a fence and destroy its device without first destroying the fence.");
2357
2358 // Note that we have to create a new device since destroying the
2359 // framework's device causes Teardown() to fail and just calling Teardown
2360 // will destroy the errorMonitor.
2361
2362 m_errorMonitor->SetDesiredFailureMsg(
2363 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2364 "OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT object");
2365
2366 ASSERT_NO_FATAL_FAILURE(InitState());
2367
2368 const std::vector<VkQueueFamilyProperties> queue_props =
2369 m_device->queue_props;
2370 std::vector<VkDeviceQueueCreateInfo> queue_info;
2371 queue_info.reserve(queue_props.size());
2372 std::vector<std::vector<float>> queue_priorities;
2373 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2374 VkDeviceQueueCreateInfo qi = {};
2375 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2376 qi.pNext = NULL;
2377 qi.queueFamilyIndex = i;
2378 qi.queueCount = queue_props[i].queueCount;
2379 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2380 qi.pQueuePriorities = queue_priorities[i].data();
2381 queue_info.push_back(qi);
2382 }
2383
2384 std::vector<const char *> device_layer_names;
2385 std::vector<const char *> device_extension_names;
2386 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
2387 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
2388 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
2389 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
2390 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
2391 device_layer_names.push_back("VK_LAYER_LUNARG_image");
2392 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
2393
2394 // The sacrificial device object
2395 VkDevice testDevice;
2396 VkDeviceCreateInfo device_create_info = {};
2397 auto features = m_device->phy().features();
2398 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2399 device_create_info.pNext = NULL;
2400 device_create_info.queueCreateInfoCount = queue_info.size();
2401 device_create_info.pQueueCreateInfos = queue_info.data();
2402 device_create_info.enabledLayerCount = device_layer_names.size();
2403 device_create_info.ppEnabledLayerNames = device_layer_names.data();
2404 device_create_info.pEnabledFeatures = &features;
2405 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2406 ASSERT_VK_SUCCESS(err);
2407
2408 VkFence fence;
2409 VkFenceCreateInfo fence_create_info = {};
2410 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2411 fence_create_info.pNext = NULL;
2412 fence_create_info.flags = 0;
2413 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2414 ASSERT_VK_SUCCESS(err);
2415
2416 // Induce failure by not calling vkDestroyFence
2417 vkDestroyDevice(testDevice, NULL);
2418 m_errorMonitor->VerifyFound();
2419}
2420
2421TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
2422
2423 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
2424 "attempt to delete them from another.");
2425
2426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2427 "FreeCommandBuffers is attempting to free Command Buffer");
2428
2429 VkCommandPool command_pool_one;
2430 VkCommandPool command_pool_two;
2431
2432 VkCommandPoolCreateInfo pool_create_info{};
2433 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2434 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2435 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2436
2437 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2438 &command_pool_one);
2439
2440 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2441 &command_pool_two);
2442
2443 VkCommandBuffer command_buffer[9];
2444 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2445 command_buffer_allocate_info.sType =
2446 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2447 command_buffer_allocate_info.commandPool = command_pool_one;
2448 command_buffer_allocate_info.commandBufferCount = 9;
2449 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2450 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2451 command_buffer);
2452
2453 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
2454 &command_buffer[3]);
2455
2456 m_errorMonitor->VerifyFound();
2457
2458 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2459 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2460}
2461
2462TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2463 VkResult err;
2464
2465 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
2466 "attempt to delete them from another.");
2467
2468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2469 "FreeDescriptorSets is attempting to free descriptorSet");
2470
2471 ASSERT_NO_FATAL_FAILURE(InitState());
2472 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2473
2474 VkDescriptorPoolSize ds_type_count = {};
2475 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2476 ds_type_count.descriptorCount = 1;
2477
2478 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2479 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2480 ds_pool_ci.pNext = NULL;
2481 ds_pool_ci.flags = 0;
2482 ds_pool_ci.maxSets = 1;
2483 ds_pool_ci.poolSizeCount = 1;
2484 ds_pool_ci.pPoolSizes = &ds_type_count;
2485
2486 VkDescriptorPool ds_pool_one;
2487 err =
2488 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
2489 ASSERT_VK_SUCCESS(err);
2490
2491 // Create a second descriptor pool
2492 VkDescriptorPool ds_pool_two;
2493 err =
2494 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
2495 ASSERT_VK_SUCCESS(err);
2496
2497 VkDescriptorSetLayoutBinding dsl_binding = {};
2498 dsl_binding.binding = 0;
2499 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2500 dsl_binding.descriptorCount = 1;
2501 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2502 dsl_binding.pImmutableSamplers = NULL;
2503
2504 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2505 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2506 ds_layout_ci.pNext = NULL;
2507 ds_layout_ci.bindingCount = 1;
2508 ds_layout_ci.pBindings = &dsl_binding;
2509
2510 VkDescriptorSetLayout ds_layout;
2511 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2512 &ds_layout);
2513 ASSERT_VK_SUCCESS(err);
2514
2515 VkDescriptorSet descriptorSet;
2516 VkDescriptorSetAllocateInfo alloc_info = {};
2517 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2518 alloc_info.descriptorSetCount = 1;
2519 alloc_info.descriptorPool = ds_pool_one;
2520 alloc_info.pSetLayouts = &ds_layout;
2521 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2522 &descriptorSet);
2523 ASSERT_VK_SUCCESS(err);
2524
2525 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2526
2527 m_errorMonitor->VerifyFound();
2528
2529 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2530 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2531 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2532}
2533
2534TEST_F(VkLayerTest, CreateUnknownObject) {
2535 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2536 "Invalid VkImage Object ");
2537
2538 TEST_DESCRIPTION(
2539 "Pass an invalid image object handle into a Vulkan API call.");
2540
2541 ASSERT_NO_FATAL_FAILURE(InitState());
2542
2543 // Pass bogus handle into GetImageMemoryRequirements
2544 VkMemoryRequirements mem_reqs;
2545 uint64_t fakeImageHandle = 0xCADECADE;
2546 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2547
2548 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2549
2550 m_errorMonitor->VerifyFound();
2551}
2552
Karl Schultz6addd812016-02-02 17:17:23 -07002553TEST_F(VkLayerTest, PipelineNotBound) {
2554 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002555
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002556 TEST_DESCRIPTION(
2557 "Pass in an invalid pipeline object handle into a Vulkan API call.");
2558
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002560 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002561
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002562 ASSERT_NO_FATAL_FAILURE(InitState());
2563 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002564
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002565 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002566 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2567 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002568
2569 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002570 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2571 ds_pool_ci.pNext = NULL;
2572 ds_pool_ci.maxSets = 1;
2573 ds_pool_ci.poolSizeCount = 1;
2574 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002575
2576 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002577 err =
2578 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002579 ASSERT_VK_SUCCESS(err);
2580
2581 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002582 dsl_binding.binding = 0;
2583 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2584 dsl_binding.descriptorCount = 1;
2585 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2586 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002587
2588 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002589 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2590 ds_layout_ci.pNext = NULL;
2591 ds_layout_ci.bindingCount = 1;
2592 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002593
2594 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002595 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2596 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002597 ASSERT_VK_SUCCESS(err);
2598
2599 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002600 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002601 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002602 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002603 alloc_info.descriptorPool = ds_pool;
2604 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002605 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2606 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002607 ASSERT_VK_SUCCESS(err);
2608
2609 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002610 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2611 pipeline_layout_ci.pNext = NULL;
2612 pipeline_layout_ci.setLayoutCount = 1;
2613 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002614
2615 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002616 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2617 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002618 ASSERT_VK_SUCCESS(err);
2619
Mark Youngad779052016-01-06 14:26:04 -07002620 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002621
2622 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002623 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2624 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002625
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002626 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002627
Chia-I Wuf7458c52015-10-26 21:10:41 +08002628 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2629 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2630 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002631}
2632
Karl Schultz6addd812016-02-02 17:17:23 -07002633TEST_F(VkLayerTest, BindInvalidMemory) {
2634 VkResult err;
2635 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002636
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002637 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002638 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002639
Tobin Ehlisec598302015-09-15 15:02:17 -06002640 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002641
2642 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002643 VkImage image;
2644 VkDeviceMemory mem;
2645 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002646
Karl Schultz6addd812016-02-02 17:17:23 -07002647 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2648 const int32_t tex_width = 32;
2649 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002650
2651 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002652 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2653 image_create_info.pNext = NULL;
2654 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2655 image_create_info.format = tex_format;
2656 image_create_info.extent.width = tex_width;
2657 image_create_info.extent.height = tex_height;
2658 image_create_info.extent.depth = 1;
2659 image_create_info.mipLevels = 1;
2660 image_create_info.arrayLayers = 1;
2661 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2662 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2663 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2664 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002665
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002666 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002667 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2668 mem_alloc.pNext = NULL;
2669 mem_alloc.allocationSize = 0;
2670 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002671
Chia-I Wuf7458c52015-10-26 21:10:41 +08002672 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002673 ASSERT_VK_SUCCESS(err);
2674
Karl Schultz6addd812016-02-02 17:17:23 -07002675 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002676
2677 mem_alloc.allocationSize = mem_reqs.size;
2678
Karl Schultz6addd812016-02-02 17:17:23 -07002679 pass =
2680 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002681 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002682
2683 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002684 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002685 ASSERT_VK_SUCCESS(err);
2686
2687 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002688 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002689
2690 // Try to bind free memory that has been freed
2691 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2692 // This may very well return an error.
2693 (void)err;
2694
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002695 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002696
Chia-I Wuf7458c52015-10-26 21:10:41 +08002697 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002698}
2699
Karl Schultz6addd812016-02-02 17:17:23 -07002700TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2701 VkResult err;
2702 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002703
Karl Schultz6addd812016-02-02 17:17:23 -07002704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2705 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002706
Tobin Ehlisec598302015-09-15 15:02:17 -06002707 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002708
Karl Schultz6addd812016-02-02 17:17:23 -07002709 // Create an image object, allocate memory, destroy the object and then try
2710 // to bind it
2711 VkImage image;
2712 VkDeviceMemory mem;
2713 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002714
Karl Schultz6addd812016-02-02 17:17:23 -07002715 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2716 const int32_t tex_width = 32;
2717 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002718
2719 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002720 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2721 image_create_info.pNext = NULL;
2722 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2723 image_create_info.format = tex_format;
2724 image_create_info.extent.width = tex_width;
2725 image_create_info.extent.height = tex_height;
2726 image_create_info.extent.depth = 1;
2727 image_create_info.mipLevels = 1;
2728 image_create_info.arrayLayers = 1;
2729 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2730 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2731 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2732 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002733
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002734 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002735 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2736 mem_alloc.pNext = NULL;
2737 mem_alloc.allocationSize = 0;
2738 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002739
Chia-I Wuf7458c52015-10-26 21:10:41 +08002740 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002741 ASSERT_VK_SUCCESS(err);
2742
Karl Schultz6addd812016-02-02 17:17:23 -07002743 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002744
2745 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002746 pass =
2747 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002748 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002749
2750 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002751 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002752 ASSERT_VK_SUCCESS(err);
2753
2754 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002755 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002756 ASSERT_VK_SUCCESS(err);
2757
2758 // Now Try to bind memory to this destroyed object
2759 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2760 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002761 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002762
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002763 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002764
Chia-I Wuf7458c52015-10-26 21:10:41 +08002765 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002766}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002767
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002768#endif // OBJ_TRACKER_TESTS
2769
Tobin Ehlis0788f522015-05-26 16:11:58 -06002770#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002771
2772// This is a positive test. No errors should be generated.
2773TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
2774
2775 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2776 "submitted on separate queues followed by a QueueWaitIdle.");
2777
Dustin Graves48458142016-04-29 16:11:55 -06002778 if ((m_device->queue_props.empty()) ||
2779 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002780 return;
2781
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002782 m_errorMonitor->ExpectSuccess();
2783
2784 VkSemaphore semaphore;
2785 VkSemaphoreCreateInfo semaphore_create_info{};
2786 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2787 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2788 &semaphore);
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 VkQueue queue = VK_NULL_HANDLE;
2809 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2810 1, &queue);
2811
2812 {
2813 VkCommandBufferBeginInfo begin_info{};
2814 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2815 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2816
2817 vkCmdPipelineBarrier(command_buffer[0],
2818 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2819 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2820 0, nullptr, 0, nullptr);
2821
2822 VkViewport viewport{};
2823 viewport.maxDepth = 1.0f;
2824 viewport.minDepth = 0.0f;
2825 viewport.width = 512;
2826 viewport.height = 512;
2827 viewport.x = 0;
2828 viewport.y = 0;
2829 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2830 vkEndCommandBuffer(command_buffer[0]);
2831 }
2832 {
2833 VkCommandBufferBeginInfo begin_info{};
2834 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2835 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2836
2837 VkViewport viewport{};
2838 viewport.maxDepth = 1.0f;
2839 viewport.minDepth = 0.0f;
2840 viewport.width = 512;
2841 viewport.height = 512;
2842 viewport.x = 0;
2843 viewport.y = 0;
2844 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2845 vkEndCommandBuffer(command_buffer[1]);
2846 }
2847 {
2848 VkSubmitInfo submit_info{};
2849 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2850 submit_info.commandBufferCount = 1;
2851 submit_info.pCommandBuffers = &command_buffer[0];
2852 submit_info.signalSemaphoreCount = 1;
2853 submit_info.pSignalSemaphores = &semaphore;
2854 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2855 }
2856 {
2857 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2858 VkSubmitInfo submit_info{};
2859 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2860 submit_info.commandBufferCount = 1;
2861 submit_info.pCommandBuffers = &command_buffer[1];
2862 submit_info.waitSemaphoreCount = 1;
2863 submit_info.pWaitSemaphores = &semaphore;
2864 submit_info.pWaitDstStageMask = flags;
2865 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2866 }
2867
2868 vkQueueWaitIdle(m_device->m_queue);
2869
2870 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2871 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2872 &command_buffer[0]);
2873 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2874
2875 m_errorMonitor->VerifyNotFound();
2876}
2877
2878// This is a positive test. No errors should be generated.
2879TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
2880
2881 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2882 "submitted on separate queues, the second having a fence"
2883 "followed by a QueueWaitIdle.");
2884
Dustin Graves48458142016-04-29 16:11:55 -06002885 if ((m_device->queue_props.empty()) ||
2886 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002887 return;
2888
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002889 m_errorMonitor->ExpectSuccess();
2890
2891 VkFence fence;
2892 VkFenceCreateInfo fence_create_info{};
2893 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2894 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2895
2896 VkSemaphore semaphore;
2897 VkSemaphoreCreateInfo semaphore_create_info{};
2898 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2899 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2900 &semaphore);
2901
2902 VkCommandPool command_pool;
2903 VkCommandPoolCreateInfo pool_create_info{};
2904 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2905 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2906 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2907 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2908 &command_pool);
2909
2910 VkCommandBuffer command_buffer[2];
2911 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2912 command_buffer_allocate_info.sType =
2913 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2914 command_buffer_allocate_info.commandPool = command_pool;
2915 command_buffer_allocate_info.commandBufferCount = 2;
2916 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2917 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2918 command_buffer);
2919
2920 VkQueue queue = VK_NULL_HANDLE;
2921 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2922 1, &queue);
2923
2924 {
2925 VkCommandBufferBeginInfo begin_info{};
2926 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2927 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2928
2929 vkCmdPipelineBarrier(command_buffer[0],
2930 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2931 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2932 0, nullptr, 0, nullptr);
2933
2934 VkViewport viewport{};
2935 viewport.maxDepth = 1.0f;
2936 viewport.minDepth = 0.0f;
2937 viewport.width = 512;
2938 viewport.height = 512;
2939 viewport.x = 0;
2940 viewport.y = 0;
2941 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2942 vkEndCommandBuffer(command_buffer[0]);
2943 }
2944 {
2945 VkCommandBufferBeginInfo begin_info{};
2946 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2947 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2948
2949 VkViewport viewport{};
2950 viewport.maxDepth = 1.0f;
2951 viewport.minDepth = 0.0f;
2952 viewport.width = 512;
2953 viewport.height = 512;
2954 viewport.x = 0;
2955 viewport.y = 0;
2956 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2957 vkEndCommandBuffer(command_buffer[1]);
2958 }
2959 {
2960 VkSubmitInfo submit_info{};
2961 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2962 submit_info.commandBufferCount = 1;
2963 submit_info.pCommandBuffers = &command_buffer[0];
2964 submit_info.signalSemaphoreCount = 1;
2965 submit_info.pSignalSemaphores = &semaphore;
2966 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2967 }
2968 {
2969 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2970 VkSubmitInfo submit_info{};
2971 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2972 submit_info.commandBufferCount = 1;
2973 submit_info.pCommandBuffers = &command_buffer[1];
2974 submit_info.waitSemaphoreCount = 1;
2975 submit_info.pWaitSemaphores = &semaphore;
2976 submit_info.pWaitDstStageMask = flags;
2977 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2978 }
2979
2980 vkQueueWaitIdle(m_device->m_queue);
2981
2982 vkDestroyFence(m_device->device(), fence, nullptr);
2983 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2984 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2985 &command_buffer[0]);
2986 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2987
2988 m_errorMonitor->VerifyNotFound();
2989}
2990
2991// This is a positive test. No errors should be generated.
2992TEST_F(VkLayerTest,
2993 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
2994
2995 TEST_DESCRIPTION(
2996 "Two command buffers, each in a separate QueueSubmit call "
2997 "submitted on separate queues, the second having a fence"
2998 "followed by two consecutive WaitForFences calls on the same fence.");
2999
Dustin Graves48458142016-04-29 16:11:55 -06003000 if ((m_device->queue_props.empty()) ||
3001 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06003002 return;
3003
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003004 m_errorMonitor->ExpectSuccess();
3005
3006 VkFence fence;
3007 VkFenceCreateInfo fence_create_info{};
3008 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3009 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
3010
3011 VkSemaphore semaphore;
3012 VkSemaphoreCreateInfo semaphore_create_info{};
3013 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
3014 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
3015 &semaphore);
3016
3017 VkCommandPool command_pool;
3018 VkCommandPoolCreateInfo pool_create_info{};
3019 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3020 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3021 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3022 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3023 &command_pool);
3024
3025 VkCommandBuffer command_buffer[2];
3026 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3027 command_buffer_allocate_info.sType =
3028 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3029 command_buffer_allocate_info.commandPool = command_pool;
3030 command_buffer_allocate_info.commandBufferCount = 2;
3031 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3032 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3033 command_buffer);
3034
3035 VkQueue queue = VK_NULL_HANDLE;
3036 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
3037 1, &queue);
3038
3039 {
3040 VkCommandBufferBeginInfo begin_info{};
3041 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3042 vkBeginCommandBuffer(command_buffer[0], &begin_info);
3043
3044 vkCmdPipelineBarrier(command_buffer[0],
3045 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3046 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
3047 0, nullptr, 0, nullptr);
3048
3049 VkViewport viewport{};
3050 viewport.maxDepth = 1.0f;
3051 viewport.minDepth = 0.0f;
3052 viewport.width = 512;
3053 viewport.height = 512;
3054 viewport.x = 0;
3055 viewport.y = 0;
3056 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
3057 vkEndCommandBuffer(command_buffer[0]);
3058 }
3059 {
3060 VkCommandBufferBeginInfo begin_info{};
3061 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3062 vkBeginCommandBuffer(command_buffer[1], &begin_info);
3063
3064 VkViewport viewport{};
3065 viewport.maxDepth = 1.0f;
3066 viewport.minDepth = 0.0f;
3067 viewport.width = 512;
3068 viewport.height = 512;
3069 viewport.x = 0;
3070 viewport.y = 0;
3071 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
3072 vkEndCommandBuffer(command_buffer[1]);
3073 }
3074 {
3075 VkSubmitInfo submit_info{};
3076 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3077 submit_info.commandBufferCount = 1;
3078 submit_info.pCommandBuffers = &command_buffer[0];
3079 submit_info.signalSemaphoreCount = 1;
3080 submit_info.pSignalSemaphores = &semaphore;
3081 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
3082 }
3083 {
3084 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
3085 VkSubmitInfo submit_info{};
3086 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3087 submit_info.commandBufferCount = 1;
3088 submit_info.pCommandBuffers = &command_buffer[1];
3089 submit_info.waitSemaphoreCount = 1;
3090 submit_info.pWaitSemaphores = &semaphore;
3091 submit_info.pWaitDstStageMask = flags;
3092 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
3093 }
3094
3095 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3096 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3097
3098 vkDestroyFence(m_device->device(), fence, nullptr);
3099 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
3100 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
3101 &command_buffer[0]);
3102 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3103
3104 m_errorMonitor->VerifyNotFound();
3105}
3106
3107// This is a positive test. No errors should be generated.
3108TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
3109
3110 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
3111 "submitted on separate queues, the second having a fence, "
3112 "followed by a WaitForFences call.");
3113
Dustin Graves48458142016-04-29 16:11:55 -06003114 if ((m_device->queue_props.empty()) ||
3115 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06003116 return;
3117
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003118 m_errorMonitor->ExpectSuccess();
3119
3120 VkFence fence;
3121 VkFenceCreateInfo fence_create_info{};
3122 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3123 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
3124
3125 VkSemaphore semaphore;
3126 VkSemaphoreCreateInfo semaphore_create_info{};
3127 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
3128 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
3129 &semaphore);
3130
3131 VkCommandPool command_pool;
3132 VkCommandPoolCreateInfo pool_create_info{};
3133 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3134 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3135 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3136 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3137 &command_pool);
3138
3139 VkCommandBuffer command_buffer[2];
3140 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3141 command_buffer_allocate_info.sType =
3142 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3143 command_buffer_allocate_info.commandPool = command_pool;
3144 command_buffer_allocate_info.commandBufferCount = 2;
3145 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3146 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3147 command_buffer);
3148
3149 VkQueue queue = VK_NULL_HANDLE;
3150 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
3151 1, &queue);
3152
3153
3154 {
3155 VkCommandBufferBeginInfo begin_info{};
3156 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3157 vkBeginCommandBuffer(command_buffer[0], &begin_info);
3158
3159 vkCmdPipelineBarrier(command_buffer[0],
3160 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3161 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
3162 0, nullptr, 0, nullptr);
3163
3164 VkViewport viewport{};
3165 viewport.maxDepth = 1.0f;
3166 viewport.minDepth = 0.0f;
3167 viewport.width = 512;
3168 viewport.height = 512;
3169 viewport.x = 0;
3170 viewport.y = 0;
3171 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
3172 vkEndCommandBuffer(command_buffer[0]);
3173 }
3174 {
3175 VkCommandBufferBeginInfo begin_info{};
3176 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3177 vkBeginCommandBuffer(command_buffer[1], &begin_info);
3178
3179 VkViewport viewport{};
3180 viewport.maxDepth = 1.0f;
3181 viewport.minDepth = 0.0f;
3182 viewport.width = 512;
3183 viewport.height = 512;
3184 viewport.x = 0;
3185 viewport.y = 0;
3186 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
3187 vkEndCommandBuffer(command_buffer[1]);
3188 }
3189 {
3190 VkSubmitInfo submit_info{};
3191 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3192 submit_info.commandBufferCount = 1;
3193 submit_info.pCommandBuffers = &command_buffer[0];
3194 submit_info.signalSemaphoreCount = 1;
3195 submit_info.pSignalSemaphores = &semaphore;
3196 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
3197 }
3198 {
3199 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
3200 VkSubmitInfo submit_info{};
3201 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3202 submit_info.commandBufferCount = 1;
3203 submit_info.pCommandBuffers = &command_buffer[1];
3204 submit_info.waitSemaphoreCount = 1;
3205 submit_info.pWaitSemaphores = &semaphore;
3206 submit_info.pWaitDstStageMask = flags;
3207 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
3208 }
3209
3210 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3211
3212 vkDestroyFence(m_device->device(), fence, nullptr);
3213 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
3214 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
3215 &command_buffer[0]);
3216 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3217
3218 m_errorMonitor->VerifyNotFound();
3219}
3220
3221// This is a positive test. No errors should be generated.
3222TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
3223
3224 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
3225 "on the same queue, sharing a signal/wait semaphore, the "
3226 "second having a fence, "
3227 "followed by a WaitForFences call.");
3228
3229 m_errorMonitor->ExpectSuccess();
3230
3231 VkFence fence;
3232 VkFenceCreateInfo fence_create_info{};
3233 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3234 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
3235
3236 VkSemaphore semaphore;
3237 VkSemaphoreCreateInfo semaphore_create_info{};
3238 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
3239 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
3240 &semaphore);
3241
3242 VkCommandPool command_pool;
3243 VkCommandPoolCreateInfo pool_create_info{};
3244 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3245 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3246 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3247 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3248 &command_pool);
3249
3250 VkCommandBuffer command_buffer[2];
3251 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3252 command_buffer_allocate_info.sType =
3253 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3254 command_buffer_allocate_info.commandPool = command_pool;
3255 command_buffer_allocate_info.commandBufferCount = 2;
3256 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3257 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3258 command_buffer);
3259
3260 {
3261 VkCommandBufferBeginInfo begin_info{};
3262 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3263 vkBeginCommandBuffer(command_buffer[0], &begin_info);
3264
3265 vkCmdPipelineBarrier(command_buffer[0],
3266 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3267 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
3268 0, nullptr, 0, nullptr);
3269
3270 VkViewport viewport{};
3271 viewport.maxDepth = 1.0f;
3272 viewport.minDepth = 0.0f;
3273 viewport.width = 512;
3274 viewport.height = 512;
3275 viewport.x = 0;
3276 viewport.y = 0;
3277 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
3278 vkEndCommandBuffer(command_buffer[0]);
3279 }
3280 {
3281 VkCommandBufferBeginInfo begin_info{};
3282 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3283 vkBeginCommandBuffer(command_buffer[1], &begin_info);
3284
3285 VkViewport viewport{};
3286 viewport.maxDepth = 1.0f;
3287 viewport.minDepth = 0.0f;
3288 viewport.width = 512;
3289 viewport.height = 512;
3290 viewport.x = 0;
3291 viewport.y = 0;
3292 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
3293 vkEndCommandBuffer(command_buffer[1]);
3294 }
3295 {
3296 VkSubmitInfo submit_info{};
3297 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3298 submit_info.commandBufferCount = 1;
3299 submit_info.pCommandBuffers = &command_buffer[0];
3300 submit_info.signalSemaphoreCount = 1;
3301 submit_info.pSignalSemaphores = &semaphore;
3302 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
3303 }
3304 {
3305 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
3306 VkSubmitInfo submit_info{};
3307 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3308 submit_info.commandBufferCount = 1;
3309 submit_info.pCommandBuffers = &command_buffer[1];
3310 submit_info.waitSemaphoreCount = 1;
3311 submit_info.pWaitSemaphores = &semaphore;
3312 submit_info.pWaitDstStageMask = flags;
3313 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
3314 }
3315
3316 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3317
3318 vkDestroyFence(m_device->device(), fence, nullptr);
3319 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
3320 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
3321 &command_buffer[0]);
3322 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3323
3324 m_errorMonitor->VerifyNotFound();
3325}
3326
3327// This is a positive test. No errors should be generated.
3328TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
3329
3330 TEST_DESCRIPTION(
3331 "Two command buffers, each in a separate QueueSubmit call "
3332 "on the same queue, no fences, followed by a third QueueSubmit with NO "
3333 "SubmitInfos but with a fence, followed by a WaitForFences call.");
3334
3335 m_errorMonitor->ExpectSuccess();
3336
3337 VkFence fence;
3338 VkFenceCreateInfo fence_create_info{};
3339 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3340 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
3341
3342 VkCommandPool command_pool;
3343 VkCommandPoolCreateInfo pool_create_info{};
3344 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3345 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3346 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3347 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3348 &command_pool);
3349
3350 VkCommandBuffer command_buffer[2];
3351 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3352 command_buffer_allocate_info.sType =
3353 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3354 command_buffer_allocate_info.commandPool = command_pool;
3355 command_buffer_allocate_info.commandBufferCount = 2;
3356 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3357 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3358 command_buffer);
3359
3360 {
3361 VkCommandBufferBeginInfo begin_info{};
3362 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3363 vkBeginCommandBuffer(command_buffer[0], &begin_info);
3364
3365 vkCmdPipelineBarrier(command_buffer[0],
3366 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3367 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
3368 0, nullptr, 0, nullptr);
3369
3370 VkViewport viewport{};
3371 viewport.maxDepth = 1.0f;
3372 viewport.minDepth = 0.0f;
3373 viewport.width = 512;
3374 viewport.height = 512;
3375 viewport.x = 0;
3376 viewport.y = 0;
3377 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
3378 vkEndCommandBuffer(command_buffer[0]);
3379 }
3380 {
3381 VkCommandBufferBeginInfo begin_info{};
3382 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3383 vkBeginCommandBuffer(command_buffer[1], &begin_info);
3384
3385 VkViewport viewport{};
3386 viewport.maxDepth = 1.0f;
3387 viewport.minDepth = 0.0f;
3388 viewport.width = 512;
3389 viewport.height = 512;
3390 viewport.x = 0;
3391 viewport.y = 0;
3392 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
3393 vkEndCommandBuffer(command_buffer[1]);
3394 }
3395 {
3396 VkSubmitInfo submit_info{};
3397 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3398 submit_info.commandBufferCount = 1;
3399 submit_info.pCommandBuffers = &command_buffer[0];
3400 submit_info.signalSemaphoreCount = 0;
3401 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
3402 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
3403 }
3404 {
3405 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
3406 VkSubmitInfo submit_info{};
3407 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3408 submit_info.commandBufferCount = 1;
3409 submit_info.pCommandBuffers = &command_buffer[1];
3410 submit_info.waitSemaphoreCount = 0;
3411 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
3412 submit_info.pWaitDstStageMask = flags;
3413 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
3414 }
3415
3416 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
3417
3418 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3419
3420 vkDestroyFence(m_device->device(), fence, nullptr);
3421 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
3422 &command_buffer[0]);
3423 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3424
3425 m_errorMonitor->VerifyNotFound();
3426}
3427
3428// This is a positive test. No errors should be generated.
3429TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
3430
3431 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
3432 "on the same queue, the second having a fence, followed "
3433 "by a WaitForFences call.");
3434
3435 m_errorMonitor->ExpectSuccess();
3436
3437 VkFence fence;
3438 VkFenceCreateInfo fence_create_info{};
3439 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3440 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
3441
3442 VkCommandPool command_pool;
3443 VkCommandPoolCreateInfo pool_create_info{};
3444 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3445 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3446 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3447 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3448 &command_pool);
3449
3450 VkCommandBuffer command_buffer[2];
3451 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3452 command_buffer_allocate_info.sType =
3453 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3454 command_buffer_allocate_info.commandPool = command_pool;
3455 command_buffer_allocate_info.commandBufferCount = 2;
3456 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3457 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3458 command_buffer);
3459
3460 {
3461 VkCommandBufferBeginInfo begin_info{};
3462 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3463 vkBeginCommandBuffer(command_buffer[0], &begin_info);
3464
3465 vkCmdPipelineBarrier(command_buffer[0],
3466 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3467 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
3468 0, nullptr, 0, nullptr);
3469
3470 VkViewport viewport{};
3471 viewport.maxDepth = 1.0f;
3472 viewport.minDepth = 0.0f;
3473 viewport.width = 512;
3474 viewport.height = 512;
3475 viewport.x = 0;
3476 viewport.y = 0;
3477 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
3478 vkEndCommandBuffer(command_buffer[0]);
3479 }
3480 {
3481 VkCommandBufferBeginInfo begin_info{};
3482 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3483 vkBeginCommandBuffer(command_buffer[1], &begin_info);
3484
3485 VkViewport viewport{};
3486 viewport.maxDepth = 1.0f;
3487 viewport.minDepth = 0.0f;
3488 viewport.width = 512;
3489 viewport.height = 512;
3490 viewport.x = 0;
3491 viewport.y = 0;
3492 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
3493 vkEndCommandBuffer(command_buffer[1]);
3494 }
3495 {
3496 VkSubmitInfo submit_info{};
3497 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3498 submit_info.commandBufferCount = 1;
3499 submit_info.pCommandBuffers = &command_buffer[0];
3500 submit_info.signalSemaphoreCount = 0;
3501 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
3502 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
3503 }
3504 {
3505 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
3506 VkSubmitInfo submit_info{};
3507 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3508 submit_info.commandBufferCount = 1;
3509 submit_info.pCommandBuffers = &command_buffer[1];
3510 submit_info.waitSemaphoreCount = 0;
3511 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
3512 submit_info.pWaitDstStageMask = flags;
3513 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
3514 }
3515
3516 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3517
3518 vkDestroyFence(m_device->device(), fence, nullptr);
3519 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
3520 &command_buffer[0]);
3521 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3522
3523 m_errorMonitor->VerifyNotFound();
3524}
3525
3526// This is a positive test. No errors should be generated.
3527TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
3528
3529 TEST_DESCRIPTION(
3530 "Two command buffers each in a separate SubmitInfo sent in a single "
3531 "QueueSubmit call followed by a WaitForFences call.");
3532
3533 m_errorMonitor->ExpectSuccess();
3534
3535 VkFence fence;
3536 VkFenceCreateInfo fence_create_info{};
3537 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3538 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
3539
3540 VkSemaphore semaphore;
3541 VkSemaphoreCreateInfo semaphore_create_info{};
3542 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
3543 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
3544 &semaphore);
3545
3546 VkCommandPool command_pool;
3547 VkCommandPoolCreateInfo pool_create_info{};
3548 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3549 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3550 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3551 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3552 &command_pool);
3553
3554 VkCommandBuffer command_buffer[2];
3555 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3556 command_buffer_allocate_info.sType =
3557 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3558 command_buffer_allocate_info.commandPool = command_pool;
3559 command_buffer_allocate_info.commandBufferCount = 2;
3560 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3561 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3562 command_buffer);
3563
3564 {
3565 VkCommandBufferBeginInfo begin_info{};
3566 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3567 vkBeginCommandBuffer(command_buffer[0], &begin_info);
3568
3569 vkCmdPipelineBarrier(command_buffer[0],
3570 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
3571 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
3572 0, nullptr, 0, nullptr);
3573
3574 VkViewport viewport{};
3575 viewport.maxDepth = 1.0f;
3576 viewport.minDepth = 0.0f;
3577 viewport.width = 512;
3578 viewport.height = 512;
3579 viewport.x = 0;
3580 viewport.y = 0;
3581 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
3582 vkEndCommandBuffer(command_buffer[0]);
3583 }
3584 {
3585 VkCommandBufferBeginInfo begin_info{};
3586 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3587 vkBeginCommandBuffer(command_buffer[1], &begin_info);
3588
3589 VkViewport viewport{};
3590 viewport.maxDepth = 1.0f;
3591 viewport.minDepth = 0.0f;
3592 viewport.width = 512;
3593 viewport.height = 512;
3594 viewport.x = 0;
3595 viewport.y = 0;
3596 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
3597 vkEndCommandBuffer(command_buffer[1]);
3598 }
3599 {
3600 VkSubmitInfo submit_info[2];
3601 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
3602
3603 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3604 submit_info[0].pNext = NULL;
3605 submit_info[0].commandBufferCount = 1;
3606 submit_info[0].pCommandBuffers = &command_buffer[0];
3607 submit_info[0].signalSemaphoreCount = 1;
3608 submit_info[0].pSignalSemaphores = &semaphore;
3609 submit_info[0].waitSemaphoreCount = 0;
3610 submit_info[0].pWaitSemaphores = NULL;
3611 submit_info[0].pWaitDstStageMask = 0;
3612
3613 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3614 submit_info[1].pNext = NULL;
3615 submit_info[1].commandBufferCount = 1;
3616 submit_info[1].pCommandBuffers = &command_buffer[1];
3617 submit_info[1].waitSemaphoreCount = 1;
3618 submit_info[1].pWaitSemaphores = &semaphore;
3619 submit_info[1].pWaitDstStageMask = flags;
3620 submit_info[1].signalSemaphoreCount = 0;
3621 submit_info[1].pSignalSemaphores = NULL;
3622 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
3623 }
3624
3625 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3626
3627 vkDestroyFence(m_device->device(), fence, nullptr);
3628 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
3629 &command_buffer[0]);
3630 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
3631
3632 m_errorMonitor->VerifyNotFound();
3633}
3634
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003635TEST_F(VkLayerTest, DynamicStatesNotBound) {
3636 TEST_DESCRIPTION(
3637 "Run a series of simple draw calls to validate all the different "
3638 "failure cases that can occur when dynamic state is required but not "
3639 "correctly bound."
3640 "Here are the different dynamic state cases verified by this test:\n"
3641 "-Line Width\n-Depth Bias\n-Viewport State\n-Scissor State\n-Blend "
3642 "State\n-Depth Bounds\n-Stencil Read Mask\n-Stencil Write "
3643 "Mask\n-Stencil Reference");
3644
3645 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07003646 m_errorMonitor->SetDesiredFailureMsg(
3647 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003648 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003649 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3650 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003651 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003652 // Dynamic depth bias
Karl Schultz6addd812016-02-02 17:17:23 -07003653 m_errorMonitor->SetDesiredFailureMsg(
3654 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003655 "Dynamic depth bias state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003656 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3657 BsoFailDepthBias);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003658 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003659 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07003660 m_errorMonitor->SetDesiredFailureMsg(
3661 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003662 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003663 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3664 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003665 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003666 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07003667 m_errorMonitor->SetDesiredFailureMsg(
3668 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003669 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003670 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3671 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003672 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003673 // Dynamic blend state
Karl Schultz6addd812016-02-02 17:17:23 -07003674 m_errorMonitor->SetDesiredFailureMsg(
3675 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003676 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003677 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3678 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003679 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003680 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07003681 m_errorMonitor->SetDesiredFailureMsg(
3682 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003683 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003684 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3685 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003686 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003687 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07003688 m_errorMonitor->SetDesiredFailureMsg(
3689 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003690 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003691 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3692 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003693 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003694 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07003695 m_errorMonitor->SetDesiredFailureMsg(
3696 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003697 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07003698 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
3699 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003700 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06003701}
3702
Karl Schultz6addd812016-02-02 17:17:23 -07003703TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003704 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003705
Karl Schultz6addd812016-02-02 17:17:23 -07003706 m_errorMonitor->SetDesiredFailureMsg(
3707 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3708 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
3709 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003710
3711 VkFenceCreateInfo fenceInfo = {};
3712 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3713 fenceInfo.pNext = NULL;
3714 fenceInfo.flags = 0;
3715
3716 ASSERT_NO_FATAL_FAILURE(InitState());
3717 ASSERT_NO_FATAL_FAILURE(InitViewport());
3718 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3719
Karl Schultz6addd812016-02-02 17:17:23 -07003720 // We luck out b/c by default the framework creates CB w/ the
3721 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003722 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003723 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
3724 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003725 EndCommandBuffer();
3726
3727 testFence.init(*m_device, fenceInfo);
3728
3729 // Bypass framework since it does the waits automatically
3730 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003731 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003732 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3733 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003734 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003735 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003736 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003737 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003738 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003739 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003740 submit_info.pSignalSemaphores = NULL;
3741
Karl Schultz6addd812016-02-02 17:17:23 -07003742 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
3743 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003744
Karl Schultz6addd812016-02-02 17:17:23 -07003745 // Cause validation error by re-submitting cmd buffer that should only be
3746 // submitted once
3747 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003748
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003749 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003750}
3751
Karl Schultz6addd812016-02-02 17:17:23 -07003752TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003753 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07003754 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003755
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003756 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003757 "Unable to allocate 1 descriptors of "
3758 "type "
3759 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003760
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003761 ASSERT_NO_FATAL_FAILURE(InitState());
3762 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003763
Karl Schultz6addd812016-02-02 17:17:23 -07003764 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
3765 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003766 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003767 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3768 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003769
3770 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003771 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3772 ds_pool_ci.pNext = NULL;
3773 ds_pool_ci.flags = 0;
3774 ds_pool_ci.maxSets = 1;
3775 ds_pool_ci.poolSizeCount = 1;
3776 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003777
3778 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003779 err =
3780 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003781 ASSERT_VK_SUCCESS(err);
3782
3783 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003784 dsl_binding.binding = 0;
3785 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3786 dsl_binding.descriptorCount = 1;
3787 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3788 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003789
3790 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003791 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3792 ds_layout_ci.pNext = NULL;
3793 ds_layout_ci.bindingCount = 1;
3794 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003795
3796 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003797 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3798 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003799 ASSERT_VK_SUCCESS(err);
3800
3801 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003802 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003803 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003804 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003805 alloc_info.descriptorPool = ds_pool;
3806 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003807 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3808 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003809
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003810 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003811
Chia-I Wuf7458c52015-10-26 21:10:41 +08003812 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3813 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003814}
3815
Karl Schultz6addd812016-02-02 17:17:23 -07003816TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
3817 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06003818
Karl Schultz6addd812016-02-02 17:17:23 -07003819 m_errorMonitor->SetDesiredFailureMsg(
3820 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3821 "It is invalid to call vkFreeDescriptorSets() with a pool created "
3822 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003823
Tobin Ehlise735c692015-10-08 13:13:50 -06003824 ASSERT_NO_FATAL_FAILURE(InitState());
3825 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06003826
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003827 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003828 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3829 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06003830
3831 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003832 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3833 ds_pool_ci.pNext = NULL;
3834 ds_pool_ci.maxSets = 1;
3835 ds_pool_ci.poolSizeCount = 1;
3836 ds_pool_ci.flags = 0;
3837 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
3838 // app can only call vkResetDescriptorPool on this pool.;
3839 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06003840
3841 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003842 err =
3843 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06003844 ASSERT_VK_SUCCESS(err);
3845
3846 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003847 dsl_binding.binding = 0;
3848 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3849 dsl_binding.descriptorCount = 1;
3850 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3851 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06003852
3853 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003854 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3855 ds_layout_ci.pNext = NULL;
3856 ds_layout_ci.bindingCount = 1;
3857 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06003858
3859 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003860 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3861 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06003862 ASSERT_VK_SUCCESS(err);
3863
3864 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003865 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003866 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003867 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003868 alloc_info.descriptorPool = ds_pool;
3869 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003870 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3871 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06003872 ASSERT_VK_SUCCESS(err);
3873
3874 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003875 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06003876
Chia-I Wuf7458c52015-10-26 21:10:41 +08003877 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3878 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06003879}
3880
Karl Schultz6addd812016-02-02 17:17:23 -07003881TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003882 // Attempt to clear Descriptor Pool with bad object.
3883 // ObjectTracker should catch this.
3884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3885 "Invalid VkDescriptorPool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003886 uint64_t fake_pool_handle = 0xbaad6001;
3887 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
3888 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06003889 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003890}
3891
Karl Schultz6addd812016-02-02 17:17:23 -07003892TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003893 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
3894 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003895 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06003896 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003897
3898 uint64_t fake_set_handle = 0xbaad6001;
3899 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003900 VkResult err;
3901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3902 "Invalid VkDescriptorSet Object 0xbaad6001");
3903
3904 ASSERT_NO_FATAL_FAILURE(InitState());
3905
3906 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
3907 layout_bindings[0].binding = 0;
3908 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3909 layout_bindings[0].descriptorCount = 1;
3910 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3911 layout_bindings[0].pImmutableSamplers = NULL;
3912
3913 VkDescriptorSetLayout descriptor_set_layout;
3914 VkDescriptorSetLayoutCreateInfo dslci = {};
3915 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3916 dslci.pNext = NULL;
3917 dslci.bindingCount = 1;
3918 dslci.pBindings = layout_bindings;
3919 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003920 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003921
3922 VkPipelineLayout pipeline_layout;
3923 VkPipelineLayoutCreateInfo plci = {};
3924 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3925 plci.pNext = NULL;
3926 plci.setLayoutCount = 1;
3927 plci.pSetLayouts = &descriptor_set_layout;
3928 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003929 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003930
3931 BeginCommandBuffer();
3932 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003933 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06003934 m_errorMonitor->VerifyFound();
3935 EndCommandBuffer();
3936 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
3937 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003938}
3939
Karl Schultz6addd812016-02-02 17:17:23 -07003940TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003941 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
3942 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003943 uint64_t fake_layout_handle = 0xbaad6001;
3944 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3946 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
3947
3948 VkPipelineLayout pipeline_layout;
3949 VkPipelineLayoutCreateInfo plci = {};
3950 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3951 plci.pNext = NULL;
3952 plci.setLayoutCount = 1;
3953 plci.pSetLayouts = &bad_layout;
3954 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
3955
3956 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003957}
3958
Karl Schultz6addd812016-02-02 17:17:23 -07003959TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003960 // Attempt to bind an invalid Pipeline to a valid Command Buffer
3961 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003962 // Create a valid cmd buffer
3963 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003964 uint64_t fake_pipeline_handle = 0xbaad6001;
3965 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003966 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3967 "Invalid VkPipeline Object 0xbaad6001");
3968 ASSERT_NO_FATAL_FAILURE(InitState());
3969 BeginCommandBuffer();
3970 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3971 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
3972 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06003973
3974 // Now issue a draw call with no pipeline bound
3975 m_errorMonitor->SetDesiredFailureMsg(
3976 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3977 "At Draw/Dispatch time no valid VkPipeline is bound!");
3978 ASSERT_NO_FATAL_FAILURE(InitState());
3979 BeginCommandBuffer();
3980 Draw(1, 0, 0, 0);
3981 m_errorMonitor->VerifyFound();
3982 // Finally same check once more but with Dispatch/Compute
3983 m_errorMonitor->SetDesiredFailureMsg(
3984 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3985 "At Draw/Dispatch time no valid VkPipeline is bound!");
3986 ASSERT_NO_FATAL_FAILURE(InitState());
3987 BeginCommandBuffer();
3988 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
3989 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003990}
3991
Karl Schultz6addd812016-02-02 17:17:23 -07003992TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
3993 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
3994 // CommandBuffer
3995 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003996
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003998 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003999
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004000 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06004001 ASSERT_NO_FATAL_FAILURE(InitViewport());
4002 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004003 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004004 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4005 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004006
4007 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004008 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4009 ds_pool_ci.pNext = NULL;
4010 ds_pool_ci.maxSets = 1;
4011 ds_pool_ci.poolSizeCount = 1;
4012 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06004013
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004014 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004015 err =
4016 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004017 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004018
Tony Barboureb254902015-07-15 12:50:33 -06004019 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004020 dsl_binding.binding = 0;
4021 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4022 dsl_binding.descriptorCount = 1;
4023 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4024 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004025
Tony Barboureb254902015-07-15 12:50:33 -06004026 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004027 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4028 ds_layout_ci.pNext = NULL;
4029 ds_layout_ci.bindingCount = 1;
4030 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004031 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004032 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4033 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004034 ASSERT_VK_SUCCESS(err);
4035
4036 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004037 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004038 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004039 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004040 alloc_info.descriptorPool = ds_pool;
4041 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004042 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4043 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004044 ASSERT_VK_SUCCESS(err);
4045
Tony Barboureb254902015-07-15 12:50:33 -06004046 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004047 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4048 pipeline_layout_ci.pNext = NULL;
4049 pipeline_layout_ci.setLayoutCount = 1;
4050 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004051
4052 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004053 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4054 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004055 ASSERT_VK_SUCCESS(err);
4056
Karl Schultz6addd812016-02-02 17:17:23 -07004057 VkShaderObj vs(m_device, bindStateVertShaderText,
4058 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06004059 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07004060 // on more devices
4061 VkShaderObj fs(m_device, bindStateFragShaderText,
4062 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004063
Tony Barbourc95e4ac2015-08-04 17:05:26 -06004064 VkPipelineObj pipe(m_device);
4065 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004066 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06004067 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06004068 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06004069
4070 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004071 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4072 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4073 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4074 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4075 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06004076
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004077 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004078
Chia-I Wuf7458c52015-10-26 21:10:41 +08004079 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4080 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4081 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004082}
4083
Karl Schultz6addd812016-02-02 17:17:23 -07004084TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004085 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07004086 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004087
Karl Schultz6addd812016-02-02 17:17:23 -07004088 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06004089 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
4090 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004091
4092 ASSERT_NO_FATAL_FAILURE(InitState());
4093 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004094 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
4095 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004096
4097 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004098 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4099 ds_pool_ci.pNext = NULL;
4100 ds_pool_ci.maxSets = 1;
4101 ds_pool_ci.poolSizeCount = 1;
4102 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004103
4104 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004105 err =
4106 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004107 ASSERT_VK_SUCCESS(err);
4108
4109 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004110 dsl_binding.binding = 0;
4111 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
4112 dsl_binding.descriptorCount = 1;
4113 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4114 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004115
4116 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004117 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4118 ds_layout_ci.pNext = NULL;
4119 ds_layout_ci.bindingCount = 1;
4120 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004121 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004122 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4123 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004124 ASSERT_VK_SUCCESS(err);
4125
4126 VkDescriptorSet descriptorSet;
4127 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004128 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004129 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004130 alloc_info.descriptorPool = ds_pool;
4131 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004132 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4133 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004134 ASSERT_VK_SUCCESS(err);
4135
Karl Schultz6addd812016-02-02 17:17:23 -07004136 VkBufferView view =
4137 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004138 VkWriteDescriptorSet descriptor_write;
4139 memset(&descriptor_write, 0, sizeof(descriptor_write));
4140 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4141 descriptor_write.dstSet = descriptorSet;
4142 descriptor_write.dstBinding = 0;
4143 descriptor_write.descriptorCount = 1;
4144 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
4145 descriptor_write.pTexelBufferView = &view;
4146
4147 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4148
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004149 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07004150
4151 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4152 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4153}
4154
Karl Schultz6addd812016-02-02 17:17:23 -07004155TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
4156 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
4157 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07004158 // 1. No dynamicOffset supplied
4159 // 2. Too many dynamicOffsets supplied
4160 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07004161 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004162 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004163 " requires 1 dynamicOffsets, but only "
4164 "0 dynamicOffsets are left in "
4165 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004166
4167 ASSERT_NO_FATAL_FAILURE(InitState());
4168 ASSERT_NO_FATAL_FAILURE(InitViewport());
4169 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4170
4171 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004172 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
4173 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004174
4175 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004176 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4177 ds_pool_ci.pNext = NULL;
4178 ds_pool_ci.maxSets = 1;
4179 ds_pool_ci.poolSizeCount = 1;
4180 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004181
4182 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004183 err =
4184 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004185 ASSERT_VK_SUCCESS(err);
4186
4187 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004188 dsl_binding.binding = 0;
4189 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
4190 dsl_binding.descriptorCount = 1;
4191 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4192 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004193
4194 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004195 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4196 ds_layout_ci.pNext = NULL;
4197 ds_layout_ci.bindingCount = 1;
4198 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004199 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004200 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4201 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004202 ASSERT_VK_SUCCESS(err);
4203
4204 VkDescriptorSet descriptorSet;
4205 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004206 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004207 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004208 alloc_info.descriptorPool = ds_pool;
4209 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004210 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4211 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004212 ASSERT_VK_SUCCESS(err);
4213
4214 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004215 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4216 pipeline_layout_ci.pNext = NULL;
4217 pipeline_layout_ci.setLayoutCount = 1;
4218 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004219
4220 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004221 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4222 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004223 ASSERT_VK_SUCCESS(err);
4224
4225 // Create a buffer to update the descriptor with
4226 uint32_t qfi = 0;
4227 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004228 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4229 buffCI.size = 1024;
4230 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4231 buffCI.queueFamilyIndexCount = 1;
4232 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004233
4234 VkBuffer dyub;
4235 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4236 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06004237 // Allocate memory and bind to buffer so we can make it to the appropriate
4238 // error
4239 VkMemoryAllocateInfo mem_alloc = {};
4240 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4241 mem_alloc.pNext = NULL;
4242 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12004243 mem_alloc.memoryTypeIndex = 0;
4244
4245 VkMemoryRequirements memReqs;
4246 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
4247 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
4248 0);
4249 if (!pass) {
4250 vkDestroyBuffer(m_device->device(), dyub, NULL);
4251 return;
4252 }
4253
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06004254 VkDeviceMemory mem;
4255 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
4256 ASSERT_VK_SUCCESS(err);
4257 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4258 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004259 // Correctly update descriptor to avoid "NOT_UPDATED" error
4260 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004261 buffInfo.buffer = dyub;
4262 buffInfo.offset = 0;
4263 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004264
4265 VkWriteDescriptorSet descriptor_write;
4266 memset(&descriptor_write, 0, sizeof(descriptor_write));
4267 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4268 descriptor_write.dstSet = descriptorSet;
4269 descriptor_write.dstBinding = 0;
4270 descriptor_write.descriptorCount = 1;
4271 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
4272 descriptor_write.pBufferInfo = &buffInfo;
4273
4274 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4275
4276 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004277 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4278 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4279 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004280 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07004281 uint32_t pDynOff[2] = {512, 756};
4282 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07004283 m_errorMonitor->SetDesiredFailureMsg(
4284 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07004285 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07004286 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4287 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4288 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12004289 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07004290 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06004291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4292 " dynamic offset 512 combined with "
4293 "offset 0 and range 1024 that "
4294 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07004295 // Create PSO to be used for draw-time errors below
4296 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004297 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07004298 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07004299 "out gl_PerVertex { \n"
4300 " vec4 gl_Position;\n"
4301 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07004302 "void main(){\n"
4303 " gl_Position = vec4(1);\n"
4304 "}\n";
4305 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004306 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07004307 "\n"
4308 "layout(location=0) out vec4 x;\n"
4309 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
4310 "void main(){\n"
4311 " x = vec4(bar.y);\n"
4312 "}\n";
4313 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4314 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4315 VkPipelineObj pipe(m_device);
4316 pipe.AddShader(&vs);
4317 pipe.AddShader(&fs);
4318 pipe.AddColorAttachment();
4319 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4320
Karl Schultz6addd812016-02-02 17:17:23 -07004321 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4322 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4323 // This update should succeed, but offset size of 512 will overstep buffer
4324 // /w range 1024 & size 1024
4325 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4326 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
4327 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07004328 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004329 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004330
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06004331 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06004332 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06004333
Tobin Ehlis49f903e2015-11-04 13:30:34 -07004334 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4335 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4336}
4337
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004338TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004339 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004340 ASSERT_NO_FATAL_FAILURE(InitState());
4341 ASSERT_NO_FATAL_FAILURE(InitViewport());
4342 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4343
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004344 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004345 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004346 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4347 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4348 pipeline_layout_ci.pushConstantRangeCount = 1;
4349 pipeline_layout_ci.pPushConstantRanges = &pc_range;
4350
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004351 //
4352 // Check for invalid push constant ranges in pipeline layouts.
4353 //
4354 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06004355 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004356 char const *msg;
4357 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004358
Karl Schultzc81037d2016-05-12 08:11:23 -06004359 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
4360 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
4361 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
4362 "vkCreatePipelineLayout() call has push constants index 0 with "
4363 "size 0."},
4364 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
4365 "vkCreatePipelineLayout() call has push constants index 0 with "
4366 "size 1."},
4367 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
4368 "vkCreatePipelineLayout() call has push constants index 0 with "
4369 "size 1."},
4370 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
4371 "vkCreatePipelineLayout() call has push constants index 0 with "
4372 "size 0."},
4373 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
4374 "vkCreatePipelineLayout() call has push constants index 0 with "
4375 "offset 1. Offset must"},
4376 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
4377 "vkCreatePipelineLayout() call has push constants index 0 "
4378 "with offset "},
4379 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
4380 "vkCreatePipelineLayout() call has push constants "
4381 "index 0 with offset "},
4382 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
4383 "vkCreatePipelineLayout() call has push constants index 0 "
4384 "with offset "},
4385 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
4386 "vkCreatePipelineLayout() call has push "
4387 "constants index 0 with offset "},
4388 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
4389 "vkCreatePipelineLayout() call has push "
4390 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004391 }};
4392
4393 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06004394 for (const auto &iter : range_tests) {
4395 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4397 iter.msg);
4398 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
4399 NULL, &pipeline_layout);
4400 m_errorMonitor->VerifyFound();
4401 if (VK_SUCCESS == err) {
4402 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4403 }
4404 }
4405
4406 // Check for invalid stage flag
4407 pc_range.offset = 0;
4408 pc_range.size = 16;
4409 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004410 m_errorMonitor->SetDesiredFailureMsg(
4411 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004412 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004413 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4414 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004415 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004416 if (VK_SUCCESS == err) {
4417 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4418 }
4419
4420 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06004421 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004422 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06004423 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004424 char const *msg;
4425 };
4426
Karl Schultzc81037d2016-05-12 08:11:23 -06004427 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004428 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4429 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4430 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4431 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4432 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
4433 "vkCreatePipelineLayout() call has push constants with overlapping "
4434 "ranges: 0:[0, 4), 1:[0, 4)"},
4435 {
4436 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4437 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
4438 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
4439 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
4440 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
4441 "vkCreatePipelineLayout() call has push constants with "
4442 "overlapping "
4443 "ranges: 3:[12, 20), 4:[16, 20)",
4444 },
4445 {
4446 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
4447 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
4448 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
4449 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
4450 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
4451 "vkCreatePipelineLayout() call has push constants with "
4452 "overlapping "
4453 "ranges: 0:[16, 20), 1:[12, 20)",
4454 },
4455 {
4456 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
4457 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
4458 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
4459 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
4460 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
4461 "vkCreatePipelineLayout() call has push constants with "
4462 "overlapping "
4463 "ranges: 0:[16, 20), 3:[12, 20)",
4464 },
4465 {
4466 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
4467 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
4468 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
4469 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
4470 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
4471 "vkCreatePipelineLayout() call has push constants with "
4472 "overlapping "
4473 "ranges: 0:[16, 20), 2:[4, 100)",
4474 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004475
Karl Schultzc81037d2016-05-12 08:11:23 -06004476 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004477 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06004478 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
4479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004480 iter.msg);
4481 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
4482 NULL, &pipeline_layout);
4483 m_errorMonitor->VerifyFound();
4484 if (VK_SUCCESS == err) {
4485 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4486 }
4487 }
4488
4489 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06004490 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
4491 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4492 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
4493 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
4494 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
4495 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
4496 ""},
4497 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
4498 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
4499 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
4500 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
4501 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
4502 ""}}};
4503 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004504 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
4505 m_errorMonitor->ExpectSuccess();
4506 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
4507 NULL, &pipeline_layout);
4508 m_errorMonitor->VerifyNotFound();
4509 if (VK_SUCCESS == err) {
4510 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4511 }
4512 }
4513
4514 //
4515 // CmdPushConstants tests
4516 //
Karl Schultzc81037d2016-05-12 08:11:23 -06004517 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004518
4519 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06004520 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
4521 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
4522 "vkCmdPushConstants() call has push constants with size 0. Size "
4523 "must be greater than zero and a multiple of 4."},
4524 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
4525 "vkCmdPushConstants() call has push constants with size 1. Size "
4526 "must be greater than zero and a multiple of 4."},
4527 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
4528 "vkCmdPushConstants() call has push constants with size 1. Size "
4529 "must be greater than zero and a multiple of 4."},
4530 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
4531 "vkCmdPushConstants() call has push constants with offset 1. "
4532 "Offset must be a multiple of 4."},
4533 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
4534 "vkCmdPushConstants() call has push constants with offset 1. "
4535 "Offset must be a multiple of 4."},
4536 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
4537 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
4538 "0x1 not within flag-matching ranges in pipeline layout"},
4539 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
4540 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
4541 "0x1 not within flag-matching ranges in pipeline layout"},
4542 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
4543 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
4544 "0x1 not within flag-matching ranges in pipeline layout"},
4545 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
4546 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
4547 "0x1 not within flag-matching ranges in pipeline layout"},
4548 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
4549 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
4550 "any of the ranges in pipeline layout"},
4551 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
4552 0, 16},
4553 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
4554 "any of the ranges in pipeline layout"},
4555 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004556 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06004557 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004558 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06004559 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004560 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06004561 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004562 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06004563 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004564 "vkCmdPushConstants() call has push constants with offset "},
4565 }};
4566
4567 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06004568 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004569 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06004570 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004571 };
Karl Schultzc81037d2016-05-12 08:11:23 -06004572 pipeline_layout_ci.pushConstantRangeCount =
4573 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004574 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004575 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4576 &pipeline_layout);
4577 ASSERT_VK_SUCCESS(err);
4578 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06004579 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004580 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4581 iter.msg);
4582 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06004583 iter.range.stageFlags, iter.range.offset,
4584 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004585 m_errorMonitor->VerifyFound();
4586 }
4587
4588 // Check for invalid stage flag
4589 m_errorMonitor->SetDesiredFailureMsg(
4590 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4591 "vkCmdPushConstants() call has no stageFlags set.");
4592 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06004593 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004594 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06004595 EndCommandBuffer();
4596 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
4597 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06004598
Karl Schultzc81037d2016-05-12 08:11:23 -06004599 // overlapping range tests with cmd
4600 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
4601 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
4602 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
4603 "0x1 not within flag-matching ranges in pipeline layout"},
4604 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
4605 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
4606 "0x1 not within flag-matching ranges in pipeline layout"},
4607 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
4608 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
4609 "0x1 not within flag-matching ranges in pipeline layout"},
4610 }};
4611 const VkPushConstantRange pc_range3[] = {
4612 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
4613 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
4614 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4615 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
4616 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
4617 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
4618 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
4619 };
4620 pipeline_layout_ci.pushConstantRangeCount =
4621 sizeof(pc_range3) / sizeof(VkPushConstantRange);
4622 pipeline_layout_ci.pPushConstantRanges = pc_range3;
4623 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4624 &pipeline_layout);
4625 ASSERT_VK_SUCCESS(err);
4626 BeginCommandBuffer();
4627 for (const auto &iter : cmd_overlap_tests) {
4628 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4629 iter.msg);
4630 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
4631 iter.range.stageFlags, iter.range.offset,
4632 iter.range.size, dummy_values);
4633 m_errorMonitor->VerifyFound();
4634 }
4635 EndCommandBuffer();
4636 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
4637 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4638
4639 // positive overlapping range tests with cmd
4640 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
4641 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
4642 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
4643 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
4644 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
4645 }};
4646 const VkPushConstantRange pc_range4[] = {
4647 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
4648 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
4649 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
4650 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
4651 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
4652 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
4653 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
4654 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
4655 };
4656 pipeline_layout_ci.pushConstantRangeCount =
4657 sizeof(pc_range4) / sizeof(VkPushConstantRange);
4658 pipeline_layout_ci.pPushConstantRanges = pc_range4;
4659 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4660 &pipeline_layout);
4661 ASSERT_VK_SUCCESS(err);
4662 BeginCommandBuffer();
4663 for (const auto &iter : cmd_overlap_tests_pos) {
4664 m_errorMonitor->ExpectSuccess();
4665 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
4666 iter.range.stageFlags, iter.range.offset,
4667 iter.range.size, dummy_values);
4668 m_errorMonitor->VerifyNotFound();
4669 }
4670 EndCommandBuffer();
4671 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07004672 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4673}
4674
Karl Schultz6addd812016-02-02 17:17:23 -07004675TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07004676 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07004677 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004678
4679 ASSERT_NO_FATAL_FAILURE(InitState());
4680 ASSERT_NO_FATAL_FAILURE(InitViewport());
4681 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4682
4683 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
4684 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004685 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4686 ds_type_count[0].descriptorCount = 10;
4687 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
4688 ds_type_count[1].descriptorCount = 2;
4689 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
4690 ds_type_count[2].descriptorCount = 2;
4691 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
4692 ds_type_count[3].descriptorCount = 5;
4693 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
4694 // type
4695 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4696 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4697 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004698
4699 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004700 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4701 ds_pool_ci.pNext = NULL;
4702 ds_pool_ci.maxSets = 5;
4703 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
4704 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004705
4706 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004707 err =
4708 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004709 ASSERT_VK_SUCCESS(err);
4710
4711 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
4712 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004713 dsl_binding[0].binding = 0;
4714 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4715 dsl_binding[0].descriptorCount = 5;
4716 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4717 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004718
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004719 // Create layout identical to set0 layout but w/ different stageFlags
4720 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004721 dsl_fs_stage_only.binding = 0;
4722 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4723 dsl_fs_stage_only.descriptorCount = 5;
4724 dsl_fs_stage_only.stageFlags =
4725 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
4726 // bind time
4727 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004728 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004729 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4730 ds_layout_ci.pNext = NULL;
4731 ds_layout_ci.bindingCount = 1;
4732 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004733 static const uint32_t NUM_LAYOUTS = 4;
4734 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004735 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004736 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
4737 // layout for error case
4738 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4739 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004740 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004741 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07004742 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4743 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004744 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004745 dsl_binding[0].binding = 0;
4746 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004747 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004748 dsl_binding[1].binding = 1;
4749 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
4750 dsl_binding[1].descriptorCount = 2;
4751 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
4752 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004753 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004754 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07004755 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4756 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004757 ASSERT_VK_SUCCESS(err);
4758 dsl_binding[0].binding = 0;
4759 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004760 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004761 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07004762 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4763 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004764 ASSERT_VK_SUCCESS(err);
4765 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004766 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07004767 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4768 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004769 ASSERT_VK_SUCCESS(err);
4770
4771 static const uint32_t NUM_SETS = 4;
4772 VkDescriptorSet descriptorSet[NUM_SETS] = {};
4773 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004774 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004775 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004776 alloc_info.descriptorPool = ds_pool;
4777 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004778 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4779 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004780 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004781 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07004782 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004783 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07004784 err =
4785 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004786 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004787
4788 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004789 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4790 pipeline_layout_ci.pNext = NULL;
4791 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
4792 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004793
4794 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004795 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4796 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004797 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004798 // Create pipelineLayout with only one setLayout
4799 pipeline_layout_ci.setLayoutCount = 1;
4800 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004801 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4802 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004803 ASSERT_VK_SUCCESS(err);
4804 // Create pipelineLayout with 2 descriptor setLayout at index 0
4805 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
4806 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07004807 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4808 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004809 ASSERT_VK_SUCCESS(err);
4810 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
4811 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
4812 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07004813 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4814 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004815 ASSERT_VK_SUCCESS(err);
4816 // Create pipelineLayout with UB type, but stageFlags for FS only
4817 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
4818 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07004819 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4820 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004821 ASSERT_VK_SUCCESS(err);
4822 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
4823 VkDescriptorSetLayout pl_bad_s0[2] = {};
4824 pl_bad_s0[0] = ds_layout_fs_only;
4825 pl_bad_s0[1] = ds_layout[1];
4826 pipeline_layout_ci.setLayoutCount = 2;
4827 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
4828 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07004829 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4830 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004831 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004832
4833 // Create a buffer to update the descriptor with
4834 uint32_t qfi = 0;
4835 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004836 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4837 buffCI.size = 1024;
4838 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4839 buffCI.queueFamilyIndexCount = 1;
4840 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004841
4842 VkBuffer dyub;
4843 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4844 ASSERT_VK_SUCCESS(err);
4845 // Correctly update descriptor to avoid "NOT_UPDATED" error
4846 static const uint32_t NUM_BUFFS = 5;
4847 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004848 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07004849 buffInfo[i].buffer = dyub;
4850 buffInfo[i].offset = 0;
4851 buffInfo[i].range = 1024;
4852 }
Karl Schultz6addd812016-02-02 17:17:23 -07004853 VkImage image;
4854 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4855 const int32_t tex_width = 32;
4856 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004857 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004858 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4859 image_create_info.pNext = NULL;
4860 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4861 image_create_info.format = tex_format;
4862 image_create_info.extent.width = tex_width;
4863 image_create_info.extent.height = tex_height;
4864 image_create_info.extent.depth = 1;
4865 image_create_info.mipLevels = 1;
4866 image_create_info.arrayLayers = 1;
4867 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4868 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4869 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4870 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004871 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
4872 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004873
Karl Schultz6addd812016-02-02 17:17:23 -07004874 VkMemoryRequirements memReqs;
4875 VkDeviceMemory imageMem;
4876 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004877 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004878 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4879 memAlloc.pNext = NULL;
4880 memAlloc.allocationSize = 0;
4881 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004882 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
4883 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07004884 pass =
4885 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07004886 ASSERT_TRUE(pass);
4887 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
4888 ASSERT_VK_SUCCESS(err);
4889 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
4890 ASSERT_VK_SUCCESS(err);
4891
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004892 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004893 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4894 image_view_create_info.image = image;
4895 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
4896 image_view_create_info.format = tex_format;
4897 image_view_create_info.subresourceRange.layerCount = 1;
4898 image_view_create_info.subresourceRange.baseMipLevel = 0;
4899 image_view_create_info.subresourceRange.levelCount = 1;
4900 image_view_create_info.subresourceRange.aspectMask =
4901 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07004902
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004903 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07004904 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
4905 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004906 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004907 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004908 imageInfo[0].imageView = view;
4909 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4910 imageInfo[1].imageView = view;
4911 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004912 imageInfo[2].imageView = view;
4913 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4914 imageInfo[3].imageView = view;
4915 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004916
4917 static const uint32_t NUM_SET_UPDATES = 3;
4918 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
4919 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4920 descriptor_write[0].dstSet = descriptorSet[0];
4921 descriptor_write[0].dstBinding = 0;
4922 descriptor_write[0].descriptorCount = 5;
4923 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4924 descriptor_write[0].pBufferInfo = buffInfo;
4925 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4926 descriptor_write[1].dstSet = descriptorSet[1];
4927 descriptor_write[1].dstBinding = 0;
4928 descriptor_write[1].descriptorCount = 2;
4929 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
4930 descriptor_write[1].pImageInfo = imageInfo;
4931 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4932 descriptor_write[2].dstSet = descriptorSet[1];
4933 descriptor_write[2].dstBinding = 1;
4934 descriptor_write[2].descriptorCount = 2;
4935 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07004936 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004937
4938 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004939
Tobin Ehlis88452832015-12-03 09:40:56 -07004940 // Create PSO to be used for draw-time errors below
4941 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004942 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004943 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07004944 "out gl_PerVertex {\n"
4945 " vec4 gl_Position;\n"
4946 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004947 "void main(){\n"
4948 " gl_Position = vec4(1);\n"
4949 "}\n";
4950 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12004951 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07004952 "\n"
4953 "layout(location=0) out vec4 x;\n"
4954 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
4955 "void main(){\n"
4956 " x = vec4(bar.y);\n"
4957 "}\n";
4958 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4959 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07004960 VkPipelineObj pipe(m_device);
4961 pipe.AddShader(&vs);
4962 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07004963 pipe.AddColorAttachment();
4964 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07004965
4966 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07004967
Karl Schultz6addd812016-02-02 17:17:23 -07004968 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4969 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4970 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
4971 // of PSO
4972 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
4973 // cmd_pipeline.c
4974 // due to the fact that cmd_alloc_dset_data() has not been called in
4975 // cmd_bind_graphics_pipeline()
4976 // TODO : Want to cause various binding incompatibility issues here to test
4977 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07004978 // First cause various verify_layout_compatibility() fails
4979 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004980 // verify_set_layout_compatibility fail cases:
4981 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07004982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4983 " due to: invalid VkPipelineLayout ");
4984 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4985 VK_PIPELINE_BIND_POINT_GRAPHICS,
4986 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
4987 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004988 m_errorMonitor->VerifyFound();
4989
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004990 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07004991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4992 " attempting to bind set to index 1");
4993 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
4994 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
4995 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004996 m_errorMonitor->VerifyFound();
4997
Tobin Ehlis8fab6562015-12-01 09:57:09 -07004998 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07004999 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
5000 // descriptors
5001 m_errorMonitor->SetDesiredFailureMsg(
5002 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06005003 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07005004 vkCmdBindDescriptorSets(
5005 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
5006 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005007 m_errorMonitor->VerifyFound();
5008
Tobin Ehlis8fab6562015-12-01 09:57:09 -07005009 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
5010 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07005011 m_errorMonitor->SetDesiredFailureMsg(
5012 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06005013 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07005014 vkCmdBindDescriptorSets(
5015 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
5016 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005017 m_errorMonitor->VerifyFound();
5018
Tobin Ehlis8fab6562015-12-01 09:57:09 -07005019 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
5020 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07005021 m_errorMonitor->SetDesiredFailureMsg(
5022 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06005023 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07005024 vkCmdBindDescriptorSets(
5025 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
5026 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005027 m_errorMonitor->VerifyFound();
5028
Tobin Ehlis8fab6562015-12-01 09:57:09 -07005029 // Cause INFO messages due to disturbing previously bound Sets
5030 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07005031 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
5032 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
5033 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07005034 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07005035 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005036 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005037 " previously bound as set #0 was disturbed ");
5038 vkCmdBindDescriptorSets(
5039 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
5040 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005041 m_errorMonitor->VerifyFound();
5042
Karl Schultz6addd812016-02-02 17:17:23 -07005043 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
5044 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
5045 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07005046 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005047 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005048 " newly bound as set #0 so set #1 and "
5049 "any subsequent sets were disturbed ");
5050 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
5051 VK_PIPELINE_BIND_POINT_GRAPHICS,
5052 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005053 m_errorMonitor->VerifyFound();
5054
Tobin Ehlis88452832015-12-03 09:40:56 -07005055 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07005056 // 1. Error due to not binding required set (we actually use same code as
5057 // above to disturb set0)
5058 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
5059 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
5060 2, &descriptorSet[0], 0, NULL);
5061 vkCmdBindDescriptorSets(
5062 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
5063 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
5064 m_errorMonitor->SetDesiredFailureMsg(
5065 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5066 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07005067 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005068 m_errorMonitor->VerifyFound();
5069
Tobin Ehlis991d45a2016-01-06 08:48:41 -07005070 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07005071 // 2. Error due to bound set not being compatible with PSO's
5072 // VkPipelineLayout (diff stageFlags in this case)
5073 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
5074 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
5075 2, &descriptorSet[0], 0, NULL);
5076 m_errorMonitor->SetDesiredFailureMsg(
5077 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5078 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07005079 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005080 m_errorMonitor->VerifyFound();
5081
Tobin Ehlis8fab6562015-12-01 09:57:09 -07005082 // Remaining clean-up
5083 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07005084 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07005085 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
5086 }
5087 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06005088 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
5089 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07005090 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07005091 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5092 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5093}
Tobin Ehlis559c6382015-11-05 09:52:49 -07005094
Karl Schultz6addd812016-02-02 17:17:23 -07005095TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005096
Karl Schultz6addd812016-02-02 17:17:23 -07005097 m_errorMonitor->SetDesiredFailureMsg(
5098 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005099 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005100
5101 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005102 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005103 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005104 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005105
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005106 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005107}
5108
Karl Schultz6addd812016-02-02 17:17:23 -07005109TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
5110 VkResult err;
5111 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005112
Karl Schultz6addd812016-02-02 17:17:23 -07005113 m_errorMonitor->SetDesiredFailureMsg(
5114 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07005115 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005116
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06005117 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06005118
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005119 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005120 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06005121 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005122 cmd.commandPool = m_commandPool;
5123 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005124 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06005125
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005126 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06005127 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06005128
5129 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005130 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07005131 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005132 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06005133 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07005134 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
5135 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005136 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06005137
5138 // The error should be caught by validation of the BeginCommandBuffer call
5139 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
5140
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005141 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005142 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06005143}
5144
Karl Schultz6addd812016-02-02 17:17:23 -07005145TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005146 // Cause error due to Begin while recording CB
5147 // Then cause 2 errors for attempting to reset CB w/o having
5148 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
5149 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005150 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005151 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005152
5153 ASSERT_NO_FATAL_FAILURE(InitState());
5154
5155 // Calls AllocateCommandBuffers
5156 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
5157
Karl Schultz6addd812016-02-02 17:17:23 -07005158 // Force the failure by setting the Renderpass and Framebuffer fields with
5159 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005160 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07005161 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005162 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5163 cmd_buf_info.pNext = NULL;
5164 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005165 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005166
5167 // Begin CB to transition to recording state
5168 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
5169 // Can't re-begin. This should trigger error
5170 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005171 m_errorMonitor->VerifyFound();
5172
Karl Schultz6addd812016-02-02 17:17:23 -07005173 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5174 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005175 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
5176 // Reset attempt will trigger error due to incorrect CommandPool state
5177 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005178 m_errorMonitor->VerifyFound();
5179
Karl Schultz6addd812016-02-02 17:17:23 -07005180 m_errorMonitor->SetDesiredFailureMsg(
5181 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5182 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005183 // Transition CB to RECORDED state
5184 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
5185 // Now attempting to Begin will implicitly reset, which triggers error
5186 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005187 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07005188}
5189
Karl Schultz6addd812016-02-02 17:17:23 -07005190TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005191 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07005192 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005193
Karl Schultz6addd812016-02-02 17:17:23 -07005194 m_errorMonitor->SetDesiredFailureMsg(
5195 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005196 "Invalid Pipeline CreateInfo State: Vtx Shader required");
5197
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005198 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005199 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005200
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005201 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005202 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5203 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005204
5205 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005206 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5207 ds_pool_ci.pNext = NULL;
5208 ds_pool_ci.maxSets = 1;
5209 ds_pool_ci.poolSizeCount = 1;
5210 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005211
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005212 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005213 err =
5214 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005215 ASSERT_VK_SUCCESS(err);
5216
Tony Barboureb254902015-07-15 12:50:33 -06005217 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005218 dsl_binding.binding = 0;
5219 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5220 dsl_binding.descriptorCount = 1;
5221 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5222 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005223
Tony Barboureb254902015-07-15 12:50:33 -06005224 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005225 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5226 ds_layout_ci.pNext = NULL;
5227 ds_layout_ci.bindingCount = 1;
5228 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005229
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005230 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005231 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5232 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005233 ASSERT_VK_SUCCESS(err);
5234
5235 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005236 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005237 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005238 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005239 alloc_info.descriptorPool = ds_pool;
5240 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005241 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5242 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005243 ASSERT_VK_SUCCESS(err);
5244
Tony Barboureb254902015-07-15 12:50:33 -06005245 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005246 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5247 pipeline_layout_ci.setLayoutCount = 1;
5248 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005249
5250 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005251 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5252 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005253 ASSERT_VK_SUCCESS(err);
5254
Tobin Ehlise68360f2015-10-01 11:15:13 -06005255 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07005256 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06005257
5258 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005259 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5260 vp_state_ci.scissorCount = 1;
5261 vp_state_ci.pScissors = &sc;
5262 vp_state_ci.viewportCount = 1;
5263 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005264
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005265 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
5266 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5267 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
5268 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
5269 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
5270 rs_state_ci.depthClampEnable = VK_FALSE;
5271 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
5272 rs_state_ci.depthBiasEnable = VK_FALSE;
5273
Tony Barboureb254902015-07-15 12:50:33 -06005274 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005275 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5276 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005277 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07005278 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5279 gp_ci.layout = pipeline_layout;
5280 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06005281
5282 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005283 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5284 pc_ci.initialDataSize = 0;
5285 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005286
5287 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06005288 VkPipelineCache pipelineCache;
5289
Karl Schultz6addd812016-02-02 17:17:23 -07005290 err =
5291 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06005292 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005293 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5294 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005295
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005296 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005297
Chia-I Wuf7458c52015-10-26 21:10:41 +08005298 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5299 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5300 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5301 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005302}
Tobin Ehlis912df022015-09-17 08:46:18 -06005303/*// TODO : This test should be good, but needs Tess support in compiler to run
5304TEST_F(VkLayerTest, InvalidPatchControlPoints)
5305{
5306 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06005307 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005308
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005310 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
5311primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005312
Tobin Ehlis912df022015-09-17 08:46:18 -06005313 ASSERT_NO_FATAL_FAILURE(InitState());
5314 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06005315
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005316 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06005317 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005318 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06005319
5320 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5321 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5322 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005323 ds_pool_ci.poolSizeCount = 1;
5324 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06005325
5326 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005327 err = vkCreateDescriptorPool(m_device->device(),
5328VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06005329 ASSERT_VK_SUCCESS(err);
5330
5331 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08005332 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06005333 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08005334 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06005335 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5336 dsl_binding.pImmutableSamplers = NULL;
5337
5338 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005339 ds_layout_ci.sType =
5340VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06005341 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005342 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07005343 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06005344
5345 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005346 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5347&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06005348 ASSERT_VK_SUCCESS(err);
5349
5350 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005351 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
5352VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06005353 ASSERT_VK_SUCCESS(err);
5354
5355 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005356 pipeline_layout_ci.sType =
5357VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06005358 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005359 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06005360 pipeline_layout_ci.pSetLayouts = &ds_layout;
5361
5362 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005363 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5364&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06005365 ASSERT_VK_SUCCESS(err);
5366
5367 VkPipelineShaderStageCreateInfo shaderStages[3];
5368 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
5369
Karl Schultz6addd812016-02-02 17:17:23 -07005370 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
5371this);
Tobin Ehlis912df022015-09-17 08:46:18 -06005372 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07005373 VkShaderObj
5374tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
5375this);
5376 VkShaderObj
5377te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
5378this);
Tobin Ehlis912df022015-09-17 08:46:18 -06005379
Karl Schultz6addd812016-02-02 17:17:23 -07005380 shaderStages[0].sType =
5381VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005382 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06005383 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07005384 shaderStages[1].sType =
5385VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005386 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06005387 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07005388 shaderStages[2].sType =
5389VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005390 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06005391 shaderStages[2].shader = te.handle();
5392
5393 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005394 iaCI.sType =
5395VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08005396 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06005397
5398 VkPipelineTessellationStateCreateInfo tsCI = {};
5399 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
5400 tsCI.patchControlPoints = 0; // This will cause an error
5401
5402 VkGraphicsPipelineCreateInfo gp_ci = {};
5403 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5404 gp_ci.pNext = NULL;
5405 gp_ci.stageCount = 3;
5406 gp_ci.pStages = shaderStages;
5407 gp_ci.pVertexInputState = NULL;
5408 gp_ci.pInputAssemblyState = &iaCI;
5409 gp_ci.pTessellationState = &tsCI;
5410 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005411 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06005412 gp_ci.pMultisampleState = NULL;
5413 gp_ci.pDepthStencilState = NULL;
5414 gp_ci.pColorBlendState = NULL;
5415 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5416 gp_ci.layout = pipeline_layout;
5417 gp_ci.renderPass = renderPass();
5418
5419 VkPipelineCacheCreateInfo pc_ci = {};
5420 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5421 pc_ci.pNext = NULL;
5422 pc_ci.initialSize = 0;
5423 pc_ci.initialData = 0;
5424 pc_ci.maxSize = 0;
5425
5426 VkPipeline pipeline;
5427 VkPipelineCache pipelineCache;
5428
Karl Schultz6addd812016-02-02 17:17:23 -07005429 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
5430&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06005431 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005432 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5433&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06005434
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005435 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005436
Chia-I Wuf7458c52015-10-26 21:10:41 +08005437 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5438 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5439 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5440 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06005441}
5442*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06005443// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07005444TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07005445 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005446
Karl Schultz6addd812016-02-02 17:17:23 -07005447 m_errorMonitor->SetDesiredFailureMsg(
5448 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005449 "Gfx Pipeline viewport count (1) must match scissor count (0).");
5450
Tobin Ehlise68360f2015-10-01 11:15:13 -06005451 ASSERT_NO_FATAL_FAILURE(InitState());
5452 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06005453
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005454 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005455 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5456 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005457
5458 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005459 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5460 ds_pool_ci.maxSets = 1;
5461 ds_pool_ci.poolSizeCount = 1;
5462 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005463
5464 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005465 err =
5466 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005467 ASSERT_VK_SUCCESS(err);
5468
5469 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005470 dsl_binding.binding = 0;
5471 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5472 dsl_binding.descriptorCount = 1;
5473 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005474
5475 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005476 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5477 ds_layout_ci.bindingCount = 1;
5478 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005479
5480 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005481 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5482 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005483 ASSERT_VK_SUCCESS(err);
5484
5485 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005486 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005487 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005488 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005489 alloc_info.descriptorPool = ds_pool;
5490 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005491 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5492 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005493 ASSERT_VK_SUCCESS(err);
5494
5495 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005496 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5497 pipeline_layout_ci.setLayoutCount = 1;
5498 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005499
5500 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005501 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5502 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005503 ASSERT_VK_SUCCESS(err);
5504
5505 VkViewport vp = {}; // Just need dummy vp to point to
5506
5507 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005508 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5509 vp_state_ci.scissorCount = 0;
5510 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
5511 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005512
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005513 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
5514 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5515 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
5516 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
5517 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
5518 rs_state_ci.depthClampEnable = VK_FALSE;
5519 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
5520 rs_state_ci.depthBiasEnable = VK_FALSE;
5521
Cody Northropeb3a6c12015-10-05 14:44:45 -06005522 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07005523 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06005524
Karl Schultz6addd812016-02-02 17:17:23 -07005525 VkShaderObj vs(m_device, bindStateVertShaderText,
5526 VK_SHADER_STAGE_VERTEX_BIT, this);
5527 VkShaderObj fs(m_device, bindStateFragShaderText,
5528 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005529 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005530 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08005531 shaderStages[0] = vs.GetStageCreateInfo();
5532 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005533
5534 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005535 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5536 gp_ci.stageCount = 2;
5537 gp_ci.pStages = shaderStages;
5538 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005539 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07005540 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5541 gp_ci.layout = pipeline_layout;
5542 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005543
5544 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005545 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005546
5547 VkPipeline pipeline;
5548 VkPipelineCache pipelineCache;
5549
Karl Schultz6addd812016-02-02 17:17:23 -07005550 err =
5551 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005552 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005553 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5554 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005555
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005556 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005557
Chia-I Wuf7458c52015-10-26 21:10:41 +08005558 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5559 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5560 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5561 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005562}
Karl Schultz6addd812016-02-02 17:17:23 -07005563// Don't set viewport state in PSO. This is an error b/c we always need this
5564// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06005565// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07005566TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06005567 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07005568 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005569
Karl Schultz6addd812016-02-02 17:17:23 -07005570 m_errorMonitor->SetDesiredFailureMsg(
5571 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005572 "Gfx Pipeline pViewportState is null. Even if ");
5573
Tobin Ehlise68360f2015-10-01 11:15:13 -06005574 ASSERT_NO_FATAL_FAILURE(InitState());
5575 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06005576
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005577 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005578 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5579 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005580
5581 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005582 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5583 ds_pool_ci.maxSets = 1;
5584 ds_pool_ci.poolSizeCount = 1;
5585 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005586
5587 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005588 err =
5589 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005590 ASSERT_VK_SUCCESS(err);
5591
5592 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005593 dsl_binding.binding = 0;
5594 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5595 dsl_binding.descriptorCount = 1;
5596 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005597
5598 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005599 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5600 ds_layout_ci.bindingCount = 1;
5601 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005602
5603 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005604 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5605 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005606 ASSERT_VK_SUCCESS(err);
5607
5608 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005609 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005610 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005611 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005612 alloc_info.descriptorPool = ds_pool;
5613 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005614 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5615 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005616 ASSERT_VK_SUCCESS(err);
5617
5618 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005619 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5620 pipeline_layout_ci.setLayoutCount = 1;
5621 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005622
5623 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005624 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5625 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005626 ASSERT_VK_SUCCESS(err);
5627
5628 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
5629 // Set scissor as dynamic to avoid second error
5630 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005631 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5632 dyn_state_ci.dynamicStateCount = 1;
5633 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005634
Cody Northropeb3a6c12015-10-05 14:44:45 -06005635 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07005636 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06005637
Karl Schultz6addd812016-02-02 17:17:23 -07005638 VkShaderObj vs(m_device, bindStateVertShaderText,
5639 VK_SHADER_STAGE_VERTEX_BIT, this);
5640 VkShaderObj fs(m_device, bindStateFragShaderText,
5641 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005642 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005643 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08005644 shaderStages[0] = vs.GetStageCreateInfo();
5645 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005646
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005647
5648 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
5649 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5650 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
5651 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
5652 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
5653 rs_state_ci.depthClampEnable = VK_FALSE;
5654 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
5655 rs_state_ci.depthBiasEnable = VK_FALSE;
5656
Tobin Ehlise68360f2015-10-01 11:15:13 -06005657 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005658 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5659 gp_ci.stageCount = 2;
5660 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07005661 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07005662 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
5663 // should cause validation error
5664 gp_ci.pDynamicState = &dyn_state_ci;
5665 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5666 gp_ci.layout = pipeline_layout;
5667 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005668
5669 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005670 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005671
5672 VkPipeline pipeline;
5673 VkPipelineCache pipelineCache;
5674
Karl Schultz6addd812016-02-02 17:17:23 -07005675 err =
5676 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005677 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005678 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5679 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005680
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005681 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005682
Chia-I Wuf7458c52015-10-26 21:10:41 +08005683 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5684 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5685 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5686 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005687}
5688// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07005689// Then run second test where dynamic scissor count doesn't match PSO scissor
5690// count
5691TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
5692 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005693
Karl Schultz6addd812016-02-02 17:17:23 -07005694 m_errorMonitor->SetDesiredFailureMsg(
5695 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005696 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
5697
Tobin Ehlise68360f2015-10-01 11:15:13 -06005698 ASSERT_NO_FATAL_FAILURE(InitState());
5699 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06005700
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005701 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005702 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5703 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005704
5705 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005706 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5707 ds_pool_ci.maxSets = 1;
5708 ds_pool_ci.poolSizeCount = 1;
5709 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005710
5711 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005712 err =
5713 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005714 ASSERT_VK_SUCCESS(err);
5715
5716 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005717 dsl_binding.binding = 0;
5718 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5719 dsl_binding.descriptorCount = 1;
5720 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005721
5722 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005723 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5724 ds_layout_ci.bindingCount = 1;
5725 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005726
5727 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005728 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5729 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005730 ASSERT_VK_SUCCESS(err);
5731
5732 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005733 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005734 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005735 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005736 alloc_info.descriptorPool = ds_pool;
5737 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005738 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5739 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005740 ASSERT_VK_SUCCESS(err);
5741
5742 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005743 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5744 pipeline_layout_ci.setLayoutCount = 1;
5745 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005746
5747 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005748 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5749 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005750 ASSERT_VK_SUCCESS(err);
5751
5752 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005753 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5754 vp_state_ci.viewportCount = 1;
5755 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
5756 vp_state_ci.scissorCount = 1;
5757 vp_state_ci.pScissors =
5758 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06005759
5760 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
5761 // Set scissor as dynamic to avoid that error
5762 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005763 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5764 dyn_state_ci.dynamicStateCount = 1;
5765 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005766
Cody Northropeb3a6c12015-10-05 14:44:45 -06005767 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07005768 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06005769
Karl Schultz6addd812016-02-02 17:17:23 -07005770 VkShaderObj vs(m_device, bindStateVertShaderText,
5771 VK_SHADER_STAGE_VERTEX_BIT, this);
5772 VkShaderObj fs(m_device, bindStateFragShaderText,
5773 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005774 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005775 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08005776 shaderStages[0] = vs.GetStageCreateInfo();
5777 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005778
Cody Northropf6622dc2015-10-06 10:33:21 -06005779 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5780 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5781 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005782 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06005783 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005784 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06005785 vi_ci.pVertexAttributeDescriptions = nullptr;
5786
5787 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5788 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5789 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5790
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005791 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005792 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06005793 rs_ci.pNext = nullptr;
5794
Mark Youngc89c6312016-03-31 16:03:20 -06005795 VkPipelineColorBlendAttachmentState att = {};
5796 att.blendEnable = VK_FALSE;
5797 att.colorWriteMask = 0xf;
5798
Cody Northropf6622dc2015-10-06 10:33:21 -06005799 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5800 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5801 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06005802 cb_ci.attachmentCount = 1;
5803 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06005804
Tobin Ehlise68360f2015-10-01 11:15:13 -06005805 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005806 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5807 gp_ci.stageCount = 2;
5808 gp_ci.pStages = shaderStages;
5809 gp_ci.pVertexInputState = &vi_ci;
5810 gp_ci.pInputAssemblyState = &ia_ci;
5811 gp_ci.pViewportState = &vp_state_ci;
5812 gp_ci.pRasterizationState = &rs_ci;
5813 gp_ci.pColorBlendState = &cb_ci;
5814 gp_ci.pDynamicState = &dyn_state_ci;
5815 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5816 gp_ci.layout = pipeline_layout;
5817 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06005818
5819 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005820 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06005821
5822 VkPipeline pipeline;
5823 VkPipelineCache pipelineCache;
5824
Karl Schultz6addd812016-02-02 17:17:23 -07005825 err =
5826 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005827 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005828 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5829 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06005830
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005831 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005832
Tobin Ehlisd332f282015-10-02 11:00:56 -06005833 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07005834 // First need to successfully create the PSO from above by setting
5835 // pViewports
5836 m_errorMonitor->SetDesiredFailureMsg(
5837 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5838 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
5839 "scissorCount is 1. These counts must match.");
5840
5841 VkViewport vp = {}; // Just need dummy vp to point to
5842 vp_state_ci.pViewports = &vp;
5843 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
5844 &gp_ci, NULL, &pipeline);
5845 ASSERT_VK_SUCCESS(err);
5846 BeginCommandBuffer();
5847 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5848 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5849 VkRect2D scissors[2] = {}; // don't care about data
5850 // Count of 2 doesn't match PSO count of 1
5851 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
5852 Draw(1, 0, 0, 0);
5853
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005854 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07005855
5856 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5857 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5858 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5859 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5860}
5861// Create PSO w/o non-zero scissorCount but no scissor data
5862// Then run second test where dynamic viewportCount doesn't match PSO
5863// viewportCount
5864TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
5865 VkResult err;
5866
5867 m_errorMonitor->SetDesiredFailureMsg(
5868 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5869 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
5870
5871 ASSERT_NO_FATAL_FAILURE(InitState());
5872 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5873
5874 VkDescriptorPoolSize ds_type_count = {};
5875 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5876 ds_type_count.descriptorCount = 1;
5877
5878 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5879 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5880 ds_pool_ci.maxSets = 1;
5881 ds_pool_ci.poolSizeCount = 1;
5882 ds_pool_ci.pPoolSizes = &ds_type_count;
5883
5884 VkDescriptorPool ds_pool;
5885 err =
5886 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5887 ASSERT_VK_SUCCESS(err);
5888
5889 VkDescriptorSetLayoutBinding dsl_binding = {};
5890 dsl_binding.binding = 0;
5891 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5892 dsl_binding.descriptorCount = 1;
5893 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5894
5895 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5896 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5897 ds_layout_ci.bindingCount = 1;
5898 ds_layout_ci.pBindings = &dsl_binding;
5899
5900 VkDescriptorSetLayout ds_layout;
5901 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5902 &ds_layout);
5903 ASSERT_VK_SUCCESS(err);
5904
5905 VkDescriptorSet descriptorSet;
5906 VkDescriptorSetAllocateInfo alloc_info = {};
5907 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5908 alloc_info.descriptorSetCount = 1;
5909 alloc_info.descriptorPool = ds_pool;
5910 alloc_info.pSetLayouts = &ds_layout;
5911 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5912 &descriptorSet);
5913 ASSERT_VK_SUCCESS(err);
5914
5915 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5916 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5917 pipeline_layout_ci.setLayoutCount = 1;
5918 pipeline_layout_ci.pSetLayouts = &ds_layout;
5919
5920 VkPipelineLayout pipeline_layout;
5921 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5922 &pipeline_layout);
5923 ASSERT_VK_SUCCESS(err);
5924
5925 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5926 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5927 vp_state_ci.scissorCount = 1;
5928 vp_state_ci.pScissors =
5929 NULL; // Null scissor w/ count of 1 should cause error
5930 vp_state_ci.viewportCount = 1;
5931 vp_state_ci.pViewports =
5932 NULL; // vp is dynamic (below) so this won't cause error
5933
5934 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
5935 // Set scissor as dynamic to avoid that error
5936 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5937 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5938 dyn_state_ci.dynamicStateCount = 1;
5939 dyn_state_ci.pDynamicStates = &vp_state;
5940
5941 VkPipelineShaderStageCreateInfo shaderStages[2];
5942 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5943
5944 VkShaderObj vs(m_device, bindStateVertShaderText,
5945 VK_SHADER_STAGE_VERTEX_BIT, this);
5946 VkShaderObj fs(m_device, bindStateFragShaderText,
5947 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005948 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005949 // but add it to be able to run on more devices
5950 shaderStages[0] = vs.GetStageCreateInfo();
5951 shaderStages[1] = fs.GetStageCreateInfo();
5952
5953 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5954 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5955 vi_ci.pNext = nullptr;
5956 vi_ci.vertexBindingDescriptionCount = 0;
5957 vi_ci.pVertexBindingDescriptions = nullptr;
5958 vi_ci.vertexAttributeDescriptionCount = 0;
5959 vi_ci.pVertexAttributeDescriptions = nullptr;
5960
5961 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5962 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5963 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5964
5965 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5966 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5967 rs_ci.pNext = nullptr;
5968
Mark Youngc89c6312016-03-31 16:03:20 -06005969 VkPipelineColorBlendAttachmentState att = {};
5970 att.blendEnable = VK_FALSE;
5971 att.colorWriteMask = 0xf;
5972
Karl Schultz6addd812016-02-02 17:17:23 -07005973 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5974 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5975 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06005976 cb_ci.attachmentCount = 1;
5977 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07005978
5979 VkGraphicsPipelineCreateInfo gp_ci = {};
5980 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5981 gp_ci.stageCount = 2;
5982 gp_ci.pStages = shaderStages;
5983 gp_ci.pVertexInputState = &vi_ci;
5984 gp_ci.pInputAssemblyState = &ia_ci;
5985 gp_ci.pViewportState = &vp_state_ci;
5986 gp_ci.pRasterizationState = &rs_ci;
5987 gp_ci.pColorBlendState = &cb_ci;
5988 gp_ci.pDynamicState = &dyn_state_ci;
5989 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5990 gp_ci.layout = pipeline_layout;
5991 gp_ci.renderPass = renderPass();
5992
5993 VkPipelineCacheCreateInfo pc_ci = {};
5994 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5995
5996 VkPipeline pipeline;
5997 VkPipelineCache pipelineCache;
5998
5999 err =
6000 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
6001 ASSERT_VK_SUCCESS(err);
6002 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
6003 &gp_ci, NULL, &pipeline);
6004
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006005 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07006006
6007 // Now hit second fail case where we set scissor w/ different count than PSO
6008 // First need to successfully create the PSO from above by setting
6009 // pViewports
6010 m_errorMonitor->SetDesiredFailureMsg(
6011 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6012 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
6013 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006014
Tobin Ehlisd332f282015-10-02 11:00:56 -06006015 VkRect2D sc = {}; // Just need dummy vp to point to
6016 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07006017 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
6018 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006019 ASSERT_VK_SUCCESS(err);
6020 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006021 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6022 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006023 VkViewport viewports[2] = {}; // don't care about data
6024 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07006025 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006026 Draw(1, 0, 0, 0);
6027
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006028 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06006029
Chia-I Wuf7458c52015-10-26 21:10:41 +08006030 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
6031 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6032 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6033 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06006034}
6035
Mark Young7394fdd2016-03-31 14:56:43 -06006036TEST_F(VkLayerTest, PSOLineWidthInvalid) {
6037 VkResult err;
6038
6039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06006040 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06006041
6042 ASSERT_NO_FATAL_FAILURE(InitState());
6043 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6044
6045 VkDescriptorPoolSize ds_type_count = {};
6046 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6047 ds_type_count.descriptorCount = 1;
6048
6049 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6050 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6051 ds_pool_ci.maxSets = 1;
6052 ds_pool_ci.poolSizeCount = 1;
6053 ds_pool_ci.pPoolSizes = &ds_type_count;
6054
6055 VkDescriptorPool ds_pool;
6056 err =
6057 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6058 ASSERT_VK_SUCCESS(err);
6059
6060 VkDescriptorSetLayoutBinding dsl_binding = {};
6061 dsl_binding.binding = 0;
6062 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6063 dsl_binding.descriptorCount = 1;
6064 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6065
6066 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6067 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6068 ds_layout_ci.bindingCount = 1;
6069 ds_layout_ci.pBindings = &dsl_binding;
6070
6071 VkDescriptorSetLayout ds_layout;
6072 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6073 &ds_layout);
6074 ASSERT_VK_SUCCESS(err);
6075
6076 VkDescriptorSet descriptorSet;
6077 VkDescriptorSetAllocateInfo alloc_info = {};
6078 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6079 alloc_info.descriptorSetCount = 1;
6080 alloc_info.descriptorPool = ds_pool;
6081 alloc_info.pSetLayouts = &ds_layout;
6082 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6083 &descriptorSet);
6084 ASSERT_VK_SUCCESS(err);
6085
6086 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6087 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6088 pipeline_layout_ci.setLayoutCount = 1;
6089 pipeline_layout_ci.pSetLayouts = &ds_layout;
6090
6091 VkPipelineLayout pipeline_layout;
6092 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6093 &pipeline_layout);
6094 ASSERT_VK_SUCCESS(err);
6095
6096 VkPipelineViewportStateCreateInfo vp_state_ci = {};
6097 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
6098 vp_state_ci.scissorCount = 1;
6099 vp_state_ci.pScissors = NULL;
6100 vp_state_ci.viewportCount = 1;
6101 vp_state_ci.pViewports = NULL;
6102
6103 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
6104 VK_DYNAMIC_STATE_SCISSOR,
6105 VK_DYNAMIC_STATE_LINE_WIDTH};
6106 // Set scissor as dynamic to avoid that error
6107 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6108 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6109 dyn_state_ci.dynamicStateCount = 2;
6110 dyn_state_ci.pDynamicStates = dynamic_states;
6111
6112 VkPipelineShaderStageCreateInfo shaderStages[2];
6113 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
6114
6115 VkShaderObj vs(m_device, bindStateVertShaderText,
6116 VK_SHADER_STAGE_VERTEX_BIT, this);
6117 VkShaderObj fs(m_device, bindStateFragShaderText,
6118 VK_SHADER_STAGE_FRAGMENT_BIT,
6119 this); // TODO - We shouldn't need a fragment shader
6120 // but add it to be able to run on more devices
6121 shaderStages[0] = vs.GetStageCreateInfo();
6122 shaderStages[1] = fs.GetStageCreateInfo();
6123
6124 VkPipelineVertexInputStateCreateInfo vi_ci = {};
6125 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
6126 vi_ci.pNext = nullptr;
6127 vi_ci.vertexBindingDescriptionCount = 0;
6128 vi_ci.pVertexBindingDescriptions = nullptr;
6129 vi_ci.vertexAttributeDescriptionCount = 0;
6130 vi_ci.pVertexAttributeDescriptions = nullptr;
6131
6132 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
6133 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
6134 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
6135
6136 VkPipelineRasterizationStateCreateInfo rs_ci = {};
6137 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
6138 rs_ci.pNext = nullptr;
6139
Mark Young47107952016-05-02 15:59:55 -06006140 // Check too low (line width of -1.0f).
6141 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06006142
6143 VkPipelineColorBlendAttachmentState att = {};
6144 att.blendEnable = VK_FALSE;
6145 att.colorWriteMask = 0xf;
6146
6147 VkPipelineColorBlendStateCreateInfo cb_ci = {};
6148 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
6149 cb_ci.pNext = nullptr;
6150 cb_ci.attachmentCount = 1;
6151 cb_ci.pAttachments = &att;
6152
6153 VkGraphicsPipelineCreateInfo gp_ci = {};
6154 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
6155 gp_ci.stageCount = 2;
6156 gp_ci.pStages = shaderStages;
6157 gp_ci.pVertexInputState = &vi_ci;
6158 gp_ci.pInputAssemblyState = &ia_ci;
6159 gp_ci.pViewportState = &vp_state_ci;
6160 gp_ci.pRasterizationState = &rs_ci;
6161 gp_ci.pColorBlendState = &cb_ci;
6162 gp_ci.pDynamicState = &dyn_state_ci;
6163 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
6164 gp_ci.layout = pipeline_layout;
6165 gp_ci.renderPass = renderPass();
6166
6167 VkPipelineCacheCreateInfo pc_ci = {};
6168 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
6169
6170 VkPipeline pipeline;
6171 VkPipelineCache pipelineCache;
6172
6173 err =
6174 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
6175 ASSERT_VK_SUCCESS(err);
6176 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
6177 &gp_ci, NULL, &pipeline);
6178
6179 m_errorMonitor->VerifyFound();
6180
6181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6182 "Attempt to set lineWidth to 65536");
6183
6184 // Check too high (line width of 65536.0f).
6185 rs_ci.lineWidth = 65536.0f;
6186
6187 err =
6188 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
6189 ASSERT_VK_SUCCESS(err);
6190 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
6191 &gp_ci, NULL, &pipeline);
6192
6193 m_errorMonitor->VerifyFound();
6194
6195 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06006196 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06006197
6198 dyn_state_ci.dynamicStateCount = 3;
6199
6200 rs_ci.lineWidth = 1.0f;
6201
6202 err =
6203 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
6204 ASSERT_VK_SUCCESS(err);
6205 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
6206 &gp_ci, NULL, &pipeline);
6207 BeginCommandBuffer();
6208 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6209 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
6210
6211 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06006212 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06006213 m_errorMonitor->VerifyFound();
6214
6215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6216 "Attempt to set lineWidth to 65536");
6217
6218 // Check too high with dynamic setting.
6219 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
6220 m_errorMonitor->VerifyFound();
6221 EndCommandBuffer();
6222
6223 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
6224 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6225 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6226 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6227}
6228
Karl Schultz6addd812016-02-02 17:17:23 -07006229TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06006230 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07006231 m_errorMonitor->SetDesiredFailureMsg(
6232 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006233 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06006234
6235 ASSERT_NO_FATAL_FAILURE(InitState());
6236 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06006237
Tony Barbourfe3351b2015-07-28 10:17:20 -06006238 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006239 // Don't care about RenderPass handle b/c error should be flagged before
6240 // that
6241 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
6242 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06006243
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006244 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06006245}
6246
Karl Schultz6addd812016-02-02 17:17:23 -07006247TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006248 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07006249 m_errorMonitor->SetDesiredFailureMsg(
6250 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006251 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006252
6253 ASSERT_NO_FATAL_FAILURE(InitState());
6254 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006255
Tony Barbourfe3351b2015-07-28 10:17:20 -06006256 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006257 // Just create a dummy Renderpass that's non-NULL so we can get to the
6258 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06006259 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006260 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
6261 rp_begin.pNext = NULL;
6262 rp_begin.renderPass = renderPass();
6263 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006264
Karl Schultz6addd812016-02-02 17:17:23 -07006265 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
6266 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006267
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006268 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006269}
6270
Cody Northrop3bb4d962016-05-09 16:15:57 -06006271TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
6272
6273 TEST_DESCRIPTION("End a command buffer with an active render pass");
6274
6275 m_errorMonitor->SetDesiredFailureMsg(
6276 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6277 "It is invalid to issue this call inside an active render pass");
6278
6279 ASSERT_NO_FATAL_FAILURE(InitState());
6280 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6281
6282 // The framework's BeginCommandBuffer calls CreateRenderPass
6283 BeginCommandBuffer();
6284
6285 // Call directly into vkEndCommandBuffer instead of the
6286 // the framework's EndCommandBuffer, which inserts a
6287 // vkEndRenderPass
6288 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
6289
6290 m_errorMonitor->VerifyFound();
6291
6292 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
6293 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
6294}
6295
Karl Schultz6addd812016-02-02 17:17:23 -07006296TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006297 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07006298 m_errorMonitor->SetDesiredFailureMsg(
6299 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006300 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006301
6302 ASSERT_NO_FATAL_FAILURE(InitState());
6303 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006304
6305 // Renderpass is started here
6306 BeginCommandBuffer();
6307
6308 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006309 vk_testing::Buffer dstBuffer;
6310 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006311
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006312 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006313
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006314 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006315}
6316
Karl Schultz6addd812016-02-02 17:17:23 -07006317TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006318 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07006319 m_errorMonitor->SetDesiredFailureMsg(
6320 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006321 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006322
6323 ASSERT_NO_FATAL_FAILURE(InitState());
6324 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006325
6326 // Renderpass is started here
6327 BeginCommandBuffer();
6328
6329 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006330 vk_testing::Buffer dstBuffer;
6331 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006332
Karl Schultz6addd812016-02-02 17:17:23 -07006333 VkDeviceSize dstOffset = 0;
6334 VkDeviceSize dataSize = 1024;
6335 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006336
Karl Schultz6addd812016-02-02 17:17:23 -07006337 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
6338 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006339
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006340 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006341}
6342
Karl Schultz6addd812016-02-02 17:17:23 -07006343TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006344 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07006345 m_errorMonitor->SetDesiredFailureMsg(
6346 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006347 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006348
6349 ASSERT_NO_FATAL_FAILURE(InitState());
6350 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006351
6352 // Renderpass is started here
6353 BeginCommandBuffer();
6354
Michael Lentine0a369f62016-02-03 16:51:46 -06006355 VkClearColorValue clear_color;
6356 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07006357 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
6358 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6359 const int32_t tex_width = 32;
6360 const int32_t tex_height = 32;
6361 VkImageCreateInfo image_create_info = {};
6362 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6363 image_create_info.pNext = NULL;
6364 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6365 image_create_info.format = tex_format;
6366 image_create_info.extent.width = tex_width;
6367 image_create_info.extent.height = tex_height;
6368 image_create_info.extent.depth = 1;
6369 image_create_info.mipLevels = 1;
6370 image_create_info.arrayLayers = 1;
6371 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6372 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6373 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006374
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006375 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07006376 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
6377 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006378
Karl Schultz6addd812016-02-02 17:17:23 -07006379 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
6380 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006381
Karl Schultz6addd812016-02-02 17:17:23 -07006382 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
6383 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006384
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006385 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006386}
6387
Karl Schultz6addd812016-02-02 17:17:23 -07006388TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006389 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07006390 m_errorMonitor->SetDesiredFailureMsg(
6391 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006392 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006393
6394 ASSERT_NO_FATAL_FAILURE(InitState());
6395 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006396
6397 // Renderpass is started here
6398 BeginCommandBuffer();
6399
6400 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07006401 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006402 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
6403 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6404 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
6405 image_create_info.extent.width = 64;
6406 image_create_info.extent.height = 64;
6407 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6408 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006409
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006410 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07006411 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
6412 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006413
Karl Schultz6addd812016-02-02 17:17:23 -07006414 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
6415 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006416
Karl Schultz6addd812016-02-02 17:17:23 -07006417 vkCmdClearDepthStencilImage(
6418 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
6419 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
6420 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006421
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006422 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006423}
6424
Karl Schultz6addd812016-02-02 17:17:23 -07006425TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006426 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07006427 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006428
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006430 "vkCmdClearAttachments: This call "
6431 "must be issued inside an active "
6432 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006433
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006434 ASSERT_NO_FATAL_FAILURE(InitState());
6435 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006436
6437 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006438 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006439 ASSERT_VK_SUCCESS(err);
6440
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006441 VkClearAttachment color_attachment;
6442 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6443 color_attachment.clearValue.color.float32[0] = 0;
6444 color_attachment.clearValue.color.float32[1] = 0;
6445 color_attachment.clearValue.color.float32[2] = 0;
6446 color_attachment.clearValue.color.float32[3] = 0;
6447 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006448 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
6449 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
6450 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006451
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006452 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06006453}
6454
Karl Schultz9e66a292016-04-21 15:57:51 -06006455TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
6456 // Try to add a buffer memory barrier with no buffer.
6457 m_errorMonitor->SetDesiredFailureMsg(
6458 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6459 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
6460
6461 ASSERT_NO_FATAL_FAILURE(InitState());
6462 BeginCommandBuffer();
6463
6464 VkBufferMemoryBarrier buf_barrier = {};
6465 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
6466 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
6467 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
6468 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
6469 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
6470 buf_barrier.buffer = VK_NULL_HANDLE;
6471 buf_barrier.offset = 0;
6472 buf_barrier.size = VK_WHOLE_SIZE;
6473 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6474 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
6475 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
6476
6477 m_errorMonitor->VerifyFound();
6478}
6479
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06006480TEST_F(VkLayerTest, InvalidBarriers) {
6481 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
6482
6483 m_errorMonitor->SetDesiredFailureMsg(
6484 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
6485
6486 ASSERT_NO_FATAL_FAILURE(InitState());
6487 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6488
6489 VkMemoryBarrier mem_barrier = {};
6490 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
6491 mem_barrier.pNext = NULL;
6492 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
6493 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
6494 BeginCommandBuffer();
6495 // BeginCommandBuffer() starts a render pass
6496 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6497 VK_PIPELINE_STAGE_HOST_BIT,
6498 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
6499 &mem_barrier, 0, nullptr, 0, nullptr);
6500 m_errorMonitor->VerifyFound();
6501
6502 m_errorMonitor->SetDesiredFailureMsg(
6503 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6504 "Image Layout cannot be transitioned to UNDEFINED");
6505 VkImageObj image(m_device);
6506 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6507 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
6508 ASSERT_TRUE(image.initialized());
6509 VkImageMemoryBarrier img_barrier = {};
6510 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
6511 img_barrier.pNext = NULL;
6512 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
6513 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
6514 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
6515 // New layout can't be UNDEFINED
6516 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
6517 img_barrier.image = image.handle();
6518 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
6519 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
6520 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6521 img_barrier.subresourceRange.baseArrayLayer = 0;
6522 img_barrier.subresourceRange.baseMipLevel = 0;
6523 img_barrier.subresourceRange.layerCount = 1;
6524 img_barrier.subresourceRange.levelCount = 1;
6525 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6526 VK_PIPELINE_STAGE_HOST_BIT,
6527 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
6528 nullptr, 1, &img_barrier);
6529 m_errorMonitor->VerifyFound();
6530 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
6531
6532 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6533 "Subresource must have the sum of the "
6534 "baseArrayLayer");
6535 // baseArrayLayer + layerCount must be <= image's arrayLayers
6536 img_barrier.subresourceRange.baseArrayLayer = 1;
6537 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6538 VK_PIPELINE_STAGE_HOST_BIT,
6539 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
6540 nullptr, 1, &img_barrier);
6541 m_errorMonitor->VerifyFound();
6542 img_barrier.subresourceRange.baseArrayLayer = 0;
6543
6544 m_errorMonitor->SetDesiredFailureMsg(
6545 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6546 "Subresource must have the sum of the baseMipLevel");
6547 // baseMipLevel + levelCount must be <= image's mipLevels
6548 img_barrier.subresourceRange.baseMipLevel = 1;
6549 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6550 VK_PIPELINE_STAGE_HOST_BIT,
6551 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
6552 nullptr, 1, &img_barrier);
6553 m_errorMonitor->VerifyFound();
6554 img_barrier.subresourceRange.baseMipLevel = 0;
6555
6556 m_errorMonitor->SetDesiredFailureMsg(
6557 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6558 "Buffer Barriers cannot be used during a render pass");
6559 vk_testing::Buffer buffer;
6560 buffer.init(*m_device, 256);
6561 VkBufferMemoryBarrier buf_barrier = {};
6562 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
6563 buf_barrier.pNext = NULL;
6564 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
6565 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
6566 buf_barrier.buffer = buffer.handle();
6567 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
6568 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
6569 buf_barrier.offset = 0;
6570 buf_barrier.size = VK_WHOLE_SIZE;
6571 // Can't send buffer barrier during a render pass
6572 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6573 VK_PIPELINE_STAGE_HOST_BIT,
6574 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
6575 &buf_barrier, 0, nullptr);
6576 m_errorMonitor->VerifyFound();
6577 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
6578
6579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6580 "which is not less than total size");
6581 buf_barrier.offset = 257;
6582 // Offset greater than total size
6583 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6584 VK_PIPELINE_STAGE_HOST_BIT,
6585 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
6586 &buf_barrier, 0, nullptr);
6587 m_errorMonitor->VerifyFound();
6588 buf_barrier.offset = 0;
6589
6590 m_errorMonitor->SetDesiredFailureMsg(
6591 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
6592 buf_barrier.size = 257;
6593 // Size greater than total size
6594 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6595 VK_PIPELINE_STAGE_HOST_BIT,
6596 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
6597 &buf_barrier, 0, nullptr);
6598 m_errorMonitor->VerifyFound();
6599 buf_barrier.size = VK_WHOLE_SIZE;
6600
6601 m_errorMonitor->SetDesiredFailureMsg(
6602 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6603 "Image is a depth and stencil format and thus must "
6604 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
6605 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
6606 VkDepthStencilObj ds_image(m_device);
6607 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
6608 ASSERT_TRUE(ds_image.initialized());
6609 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
6610 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
6611 img_barrier.image = ds_image.handle();
6612 // Leave aspectMask at COLOR on purpose
6613 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
6614 VK_PIPELINE_STAGE_HOST_BIT,
6615 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
6616 nullptr, 1, &img_barrier);
6617 m_errorMonitor->VerifyFound();
6618}
6619
Karl Schultz6addd812016-02-02 17:17:23 -07006620TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006621 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07006622 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006623
Karl Schultz6addd812016-02-02 17:17:23 -07006624 m_errorMonitor->SetDesiredFailureMsg(
6625 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006626 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
6627
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006628 ASSERT_NO_FATAL_FAILURE(InitState());
6629 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006630 uint32_t qfi = 0;
6631 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006632 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6633 buffCI.size = 1024;
6634 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
6635 buffCI.queueFamilyIndexCount = 1;
6636 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006637
6638 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006639 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006640 ASSERT_VK_SUCCESS(err);
6641
6642 BeginCommandBuffer();
6643 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07006644 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6645 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006646 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07006647 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
6648 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006649
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006650 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006651
Chia-I Wuf7458c52015-10-26 21:10:41 +08006652 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06006653}
6654
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07006655TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
6656 // Create an out-of-range queueFamilyIndex
6657 m_errorMonitor->SetDesiredFailureMsg(
6658 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -06006659 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
6660 "of the indices specified when the device was created, via the "
6661 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07006662
6663 ASSERT_NO_FATAL_FAILURE(InitState());
6664 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6665 VkBufferCreateInfo buffCI = {};
6666 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6667 buffCI.size = 1024;
6668 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
6669 buffCI.queueFamilyIndexCount = 1;
6670 // Introduce failure by specifying invalid queue_family_index
6671 uint32_t qfi = 777;
6672 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06006673 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07006674
6675 VkBuffer ib;
6676 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
6677
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006678 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07006679}
6680
Karl Schultz6addd812016-02-02 17:17:23 -07006681TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
6682 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
6683 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006684
Karl Schultz6addd812016-02-02 17:17:23 -07006685 m_errorMonitor->SetDesiredFailureMsg(
6686 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006687 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06006688
6689 ASSERT_NO_FATAL_FAILURE(InitState());
6690 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06006691
6692 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006693 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006694 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
6695 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06006696
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006697 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06006698}
6699
Karl Schultz6addd812016-02-02 17:17:23 -07006700TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006701 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07006702 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006703
Karl Schultz6addd812016-02-02 17:17:23 -07006704 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006705 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6706 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
6707 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006708
Tobin Ehlis3b780662015-05-28 12:11:26 -06006709 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006710 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006711 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006712 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6713 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006714
6715 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006716 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6717 ds_pool_ci.pNext = NULL;
6718 ds_pool_ci.maxSets = 1;
6719 ds_pool_ci.poolSizeCount = 1;
6720 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006721
Tobin Ehlis3b780662015-05-28 12:11:26 -06006722 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006723 err =
6724 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006725 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06006726 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006727 dsl_binding.binding = 0;
6728 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6729 dsl_binding.descriptorCount = 1;
6730 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6731 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006732
Tony Barboureb254902015-07-15 12:50:33 -06006733 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006734 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6735 ds_layout_ci.pNext = NULL;
6736 ds_layout_ci.bindingCount = 1;
6737 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006738
Tobin Ehlis3b780662015-05-28 12:11:26 -06006739 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006740 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6741 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006742 ASSERT_VK_SUCCESS(err);
6743
6744 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006745 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006746 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006747 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006748 alloc_info.descriptorPool = ds_pool;
6749 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006750 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6751 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006752 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006753
Tobin Ehlis30db8f82016-05-05 08:19:48 -06006754 VkSamplerCreateInfo sampler_ci = {};
6755 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6756 sampler_ci.pNext = NULL;
6757 sampler_ci.magFilter = VK_FILTER_NEAREST;
6758 sampler_ci.minFilter = VK_FILTER_NEAREST;
6759 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6760 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6761 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6762 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6763 sampler_ci.mipLodBias = 1.0;
6764 sampler_ci.anisotropyEnable = VK_FALSE;
6765 sampler_ci.maxAnisotropy = 1;
6766 sampler_ci.compareEnable = VK_FALSE;
6767 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6768 sampler_ci.minLod = 1.0;
6769 sampler_ci.maxLod = 1.0;
6770 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6771 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6772 VkSampler sampler;
6773 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6774 ASSERT_VK_SUCCESS(err);
6775
6776 VkDescriptorImageInfo info = {};
6777 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006778
6779 VkWriteDescriptorSet descriptor_write;
6780 memset(&descriptor_write, 0, sizeof(descriptor_write));
6781 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006782 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006783 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006784 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006785 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006786 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006787
6788 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6789
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006790 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006791
Chia-I Wuf7458c52015-10-26 21:10:41 +08006792 vkDestroySampler(m_device->device(), sampler, NULL);
6793 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6794 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006795}
6796
Karl Schultz6addd812016-02-02 17:17:23 -07006797TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006798 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07006799 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006800
Karl Schultz6addd812016-02-02 17:17:23 -07006801 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006802 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6803 " binding #0 with 1 total descriptors but update of 1 descriptors "
6804 "starting at binding offset of 0 combined with update array element "
6805 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006806
Tobin Ehlis3b780662015-05-28 12:11:26 -06006807 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006808 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006809 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006810 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6811 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006812
6813 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006814 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6815 ds_pool_ci.pNext = NULL;
6816 ds_pool_ci.maxSets = 1;
6817 ds_pool_ci.poolSizeCount = 1;
6818 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006819
Tobin Ehlis3b780662015-05-28 12:11:26 -06006820 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006821 err =
6822 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006823 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006824
Tony Barboureb254902015-07-15 12:50:33 -06006825 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006826 dsl_binding.binding = 0;
6827 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6828 dsl_binding.descriptorCount = 1;
6829 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6830 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06006831
6832 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006833 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6834 ds_layout_ci.pNext = NULL;
6835 ds_layout_ci.bindingCount = 1;
6836 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006837
Tobin Ehlis3b780662015-05-28 12:11:26 -06006838 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006839 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6840 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006841 ASSERT_VK_SUCCESS(err);
6842
6843 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006844 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006845 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006846 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006847 alloc_info.descriptorPool = ds_pool;
6848 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006849 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6850 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006851 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006852
Tobin Ehlis30db8f82016-05-05 08:19:48 -06006853 // Correctly update descriptor to avoid "NOT_UPDATED" error
6854 VkDescriptorBufferInfo buff_info = {};
6855 buff_info.buffer =
6856 VkBuffer(0); // Don't care about buffer handle for this test
6857 buff_info.offset = 0;
6858 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006859
6860 VkWriteDescriptorSet descriptor_write;
6861 memset(&descriptor_write, 0, sizeof(descriptor_write));
6862 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006863 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006864 descriptor_write.dstArrayElement =
6865 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08006866 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006867 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6868 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006869
6870 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6871
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006872 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006873
Chia-I Wuf7458c52015-10-26 21:10:41 +08006874 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6875 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006876}
6877
Karl Schultz6addd812016-02-02 17:17:23 -07006878TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
6879 // Create layout w/ count of 1 and attempt update to that layout w/ binding
6880 // index 2
6881 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006882
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6884 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006885
Tobin Ehlis3b780662015-05-28 12:11:26 -06006886 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07006887 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006888 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006889 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6890 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006891
6892 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006893 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6894 ds_pool_ci.pNext = NULL;
6895 ds_pool_ci.maxSets = 1;
6896 ds_pool_ci.poolSizeCount = 1;
6897 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006898
Tobin Ehlis3b780662015-05-28 12:11:26 -06006899 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006900 err =
6901 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006902 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006903
Tony Barboureb254902015-07-15 12:50:33 -06006904 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006905 dsl_binding.binding = 0;
6906 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6907 dsl_binding.descriptorCount = 1;
6908 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6909 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06006910
6911 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006912 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6913 ds_layout_ci.pNext = NULL;
6914 ds_layout_ci.bindingCount = 1;
6915 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006916 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006917 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6918 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006919 ASSERT_VK_SUCCESS(err);
6920
6921 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006922 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006923 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006924 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006925 alloc_info.descriptorPool = ds_pool;
6926 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006927 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6928 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006929 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006930
Tony Barboureb254902015-07-15 12:50:33 -06006931 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006932 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6933 sampler_ci.pNext = NULL;
6934 sampler_ci.magFilter = VK_FILTER_NEAREST;
6935 sampler_ci.minFilter = VK_FILTER_NEAREST;
6936 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6937 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6938 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6939 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6940 sampler_ci.mipLodBias = 1.0;
6941 sampler_ci.anisotropyEnable = VK_FALSE;
6942 sampler_ci.maxAnisotropy = 1;
6943 sampler_ci.compareEnable = VK_FALSE;
6944 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6945 sampler_ci.minLod = 1.0;
6946 sampler_ci.maxLod = 1.0;
6947 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6948 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06006949
Tobin Ehlis3b780662015-05-28 12:11:26 -06006950 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006951 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006952 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006953
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006954 VkDescriptorImageInfo info = {};
6955 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006956
6957 VkWriteDescriptorSet descriptor_write;
6958 memset(&descriptor_write, 0, sizeof(descriptor_write));
6959 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006960 descriptor_write.dstSet = descriptorSet;
6961 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006962 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006963 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006964 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06006965 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08006966
6967 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6968
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006969 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006970
Chia-I Wuf7458c52015-10-26 21:10:41 +08006971 vkDestroySampler(m_device->device(), sampler, NULL);
6972 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6973 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006974}
6975
Karl Schultz6addd812016-02-02 17:17:23 -07006976TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
6977 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
6978 // types
6979 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006980
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006982 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006983
Tobin Ehlis3b780662015-05-28 12:11:26 -06006984 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006985
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006986 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006987 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6988 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006989
6990 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006991 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6992 ds_pool_ci.pNext = NULL;
6993 ds_pool_ci.maxSets = 1;
6994 ds_pool_ci.poolSizeCount = 1;
6995 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006996
Tobin Ehlis3b780662015-05-28 12:11:26 -06006997 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006998 err =
6999 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007000 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06007001 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007002 dsl_binding.binding = 0;
7003 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7004 dsl_binding.descriptorCount = 1;
7005 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7006 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06007007
Tony Barboureb254902015-07-15 12:50:33 -06007008 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007009 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7010 ds_layout_ci.pNext = NULL;
7011 ds_layout_ci.bindingCount = 1;
7012 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007013
Tobin Ehlis3b780662015-05-28 12:11:26 -06007014 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007015 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7016 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007017 ASSERT_VK_SUCCESS(err);
7018
7019 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007020 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007021 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007022 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007023 alloc_info.descriptorPool = ds_pool;
7024 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007025 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7026 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007027 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007028
Tony Barboureb254902015-07-15 12:50:33 -06007029 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007030 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
7031 sampler_ci.pNext = NULL;
7032 sampler_ci.magFilter = VK_FILTER_NEAREST;
7033 sampler_ci.minFilter = VK_FILTER_NEAREST;
7034 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
7035 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7036 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7037 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7038 sampler_ci.mipLodBias = 1.0;
7039 sampler_ci.anisotropyEnable = VK_FALSE;
7040 sampler_ci.maxAnisotropy = 1;
7041 sampler_ci.compareEnable = VK_FALSE;
7042 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
7043 sampler_ci.minLod = 1.0;
7044 sampler_ci.maxLod = 1.0;
7045 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
7046 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06007047 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007048 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007049 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08007050
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06007051 VkDescriptorImageInfo info = {};
7052 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08007053
7054 VkWriteDescriptorSet descriptor_write;
7055 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07007056 descriptor_write.sType =
7057 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007058 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007059 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06007060 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08007061 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06007062 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08007063
7064 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7065
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007066 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007067
Chia-I Wuf7458c52015-10-26 21:10:41 +08007068 vkDestroySampler(m_device->device(), sampler, NULL);
7069 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7070 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007071}
7072
Karl Schultz6addd812016-02-02 17:17:23 -07007073TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007074 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07007075 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007076
Karl Schultz6addd812016-02-02 17:17:23 -07007077 m_errorMonitor->SetDesiredFailureMsg(
7078 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007079 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007080
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007081 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07007082 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
7083 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007084 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007085 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
7086 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007087
7088 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007089 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7090 ds_pool_ci.pNext = NULL;
7091 ds_pool_ci.maxSets = 1;
7092 ds_pool_ci.poolSizeCount = 1;
7093 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007094
7095 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007096 err =
7097 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007098 ASSERT_VK_SUCCESS(err);
7099
7100 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007101 dsl_binding.binding = 0;
7102 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
7103 dsl_binding.descriptorCount = 1;
7104 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7105 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007106
7107 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007108 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7109 ds_layout_ci.pNext = NULL;
7110 ds_layout_ci.bindingCount = 1;
7111 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007112 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007113 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7114 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007115 ASSERT_VK_SUCCESS(err);
7116
7117 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007118 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007119 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007120 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007121 alloc_info.descriptorPool = ds_pool;
7122 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007123 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7124 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007125 ASSERT_VK_SUCCESS(err);
7126
Karl Schultz6addd812016-02-02 17:17:23 -07007127 VkSampler sampler =
7128 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007129
7130 VkDescriptorImageInfo descriptor_info;
7131 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
7132 descriptor_info.sampler = sampler;
7133
7134 VkWriteDescriptorSet descriptor_write;
7135 memset(&descriptor_write, 0, sizeof(descriptor_write));
7136 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007137 descriptor_write.dstSet = descriptorSet;
7138 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007139 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007140 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
7141 descriptor_write.pImageInfo = &descriptor_info;
7142
7143 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7144
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007145 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007146
Chia-I Wuf7458c52015-10-26 21:10:41 +08007147 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7148 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007149}
7150
Karl Schultz6addd812016-02-02 17:17:23 -07007151TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
7152 // Create a single combined Image/Sampler descriptor and send it an invalid
7153 // imageView
7154 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007155
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007156 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7157 "Attempted write update to combined "
7158 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -06007159 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007160
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007161 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007162 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007163 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
7164 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007165
7166 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007167 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7168 ds_pool_ci.pNext = NULL;
7169 ds_pool_ci.maxSets = 1;
7170 ds_pool_ci.poolSizeCount = 1;
7171 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007172
7173 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007174 err =
7175 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007176 ASSERT_VK_SUCCESS(err);
7177
7178 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007179 dsl_binding.binding = 0;
7180 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
7181 dsl_binding.descriptorCount = 1;
7182 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7183 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007184
7185 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007186 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7187 ds_layout_ci.pNext = NULL;
7188 ds_layout_ci.bindingCount = 1;
7189 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007190 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007191 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7192 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007193 ASSERT_VK_SUCCESS(err);
7194
7195 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007196 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007197 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007198 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007199 alloc_info.descriptorPool = ds_pool;
7200 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007201 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7202 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007203 ASSERT_VK_SUCCESS(err);
7204
7205 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007206 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
7207 sampler_ci.pNext = NULL;
7208 sampler_ci.magFilter = VK_FILTER_NEAREST;
7209 sampler_ci.minFilter = VK_FILTER_NEAREST;
7210 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
7211 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7212 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7213 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7214 sampler_ci.mipLodBias = 1.0;
7215 sampler_ci.anisotropyEnable = VK_FALSE;
7216 sampler_ci.maxAnisotropy = 1;
7217 sampler_ci.compareEnable = VK_FALSE;
7218 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
7219 sampler_ci.minLod = 1.0;
7220 sampler_ci.maxLod = 1.0;
7221 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
7222 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007223
7224 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007225 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007226 ASSERT_VK_SUCCESS(err);
7227
Karl Schultz6addd812016-02-02 17:17:23 -07007228 VkImageView view =
7229 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007230
7231 VkDescriptorImageInfo descriptor_info;
7232 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
7233 descriptor_info.sampler = sampler;
7234 descriptor_info.imageView = view;
7235
7236 VkWriteDescriptorSet descriptor_write;
7237 memset(&descriptor_write, 0, sizeof(descriptor_write));
7238 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007239 descriptor_write.dstSet = descriptorSet;
7240 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007241 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007242 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
7243 descriptor_write.pImageInfo = &descriptor_info;
7244
7245 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7246
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007247 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007248
Chia-I Wuf7458c52015-10-26 21:10:41 +08007249 vkDestroySampler(m_device->device(), sampler, NULL);
7250 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7251 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007252}
7253
Karl Schultz6addd812016-02-02 17:17:23 -07007254TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
7255 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
7256 // into the other
7257 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007258
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007259 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7260 " binding #1 with type "
7261 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
7262 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007263
Tobin Ehlis04356f92015-10-27 16:35:27 -06007264 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07007265 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007266 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007267 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7268 ds_type_count[0].descriptorCount = 1;
7269 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7270 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007271
7272 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007273 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7274 ds_pool_ci.pNext = NULL;
7275 ds_pool_ci.maxSets = 1;
7276 ds_pool_ci.poolSizeCount = 2;
7277 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007278
7279 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007280 err =
7281 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06007282 ASSERT_VK_SUCCESS(err);
7283 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007284 dsl_binding[0].binding = 0;
7285 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7286 dsl_binding[0].descriptorCount = 1;
7287 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7288 dsl_binding[0].pImmutableSamplers = NULL;
7289 dsl_binding[1].binding = 1;
7290 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
7291 dsl_binding[1].descriptorCount = 1;
7292 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7293 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007294
7295 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007296 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7297 ds_layout_ci.pNext = NULL;
7298 ds_layout_ci.bindingCount = 2;
7299 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007300
7301 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007302 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7303 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06007304 ASSERT_VK_SUCCESS(err);
7305
7306 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007307 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007308 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007309 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007310 alloc_info.descriptorPool = ds_pool;
7311 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007312 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7313 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06007314 ASSERT_VK_SUCCESS(err);
7315
7316 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007317 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
7318 sampler_ci.pNext = NULL;
7319 sampler_ci.magFilter = VK_FILTER_NEAREST;
7320 sampler_ci.minFilter = VK_FILTER_NEAREST;
7321 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
7322 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7323 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7324 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7325 sampler_ci.mipLodBias = 1.0;
7326 sampler_ci.anisotropyEnable = VK_FALSE;
7327 sampler_ci.maxAnisotropy = 1;
7328 sampler_ci.compareEnable = VK_FALSE;
7329 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
7330 sampler_ci.minLod = 1.0;
7331 sampler_ci.maxLod = 1.0;
7332 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
7333 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007334
7335 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007336 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06007337 ASSERT_VK_SUCCESS(err);
7338
7339 VkDescriptorImageInfo info = {};
7340 info.sampler = sampler;
7341
7342 VkWriteDescriptorSet descriptor_write;
7343 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
7344 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007345 descriptor_write.dstSet = descriptorSet;
7346 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08007347 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06007348 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
7349 descriptor_write.pImageInfo = &info;
7350 // This write update should succeed
7351 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7352 // Now perform a copy update that fails due to type mismatch
7353 VkCopyDescriptorSet copy_ds_update;
7354 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
7355 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
7356 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06007357 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007358 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007359 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08007360 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06007361 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
7362
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007363 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06007364 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07007365 m_errorMonitor->SetDesiredFailureMsg(
7366 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007367 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -06007368 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
7369 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
7370 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007371 copy_ds_update.srcBinding =
7372 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007373 copy_ds_update.dstSet = descriptorSet;
7374 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06007375 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06007376 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
7377
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007378 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007379
Tobin Ehlis04356f92015-10-27 16:35:27 -06007380 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07007381 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007382 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
7383 "update array offset of 0 and update of "
7384 "5 descriptors oversteps total number "
7385 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007386
Tobin Ehlis04356f92015-10-27 16:35:27 -06007387 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
7388 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
7389 copy_ds_update.srcSet = descriptorSet;
7390 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007391 copy_ds_update.dstSet = descriptorSet;
7392 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07007393 copy_ds_update.descriptorCount =
7394 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06007395 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
7396
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007397 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06007398
Chia-I Wuf7458c52015-10-26 21:10:41 +08007399 vkDestroySampler(m_device->device(), sampler, NULL);
7400 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7401 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06007402}
7403
Karl Schultz6addd812016-02-02 17:17:23 -07007404TEST_F(VkLayerTest, NumSamplesMismatch) {
7405 // Create CommandBuffer where MSAA samples doesn't match RenderPass
7406 // sampleCount
7407 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06007408
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007409 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007410 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007411
Tobin Ehlis3b780662015-05-28 12:11:26 -06007412 ASSERT_NO_FATAL_FAILURE(InitState());
7413 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007414 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06007415 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007416 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007417
7418 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007419 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7420 ds_pool_ci.pNext = NULL;
7421 ds_pool_ci.maxSets = 1;
7422 ds_pool_ci.poolSizeCount = 1;
7423 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06007424
Tobin Ehlis3b780662015-05-28 12:11:26 -06007425 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007426 err =
7427 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007428 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007429
Tony Barboureb254902015-07-15 12:50:33 -06007430 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007431 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06007432 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007433 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007434 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7435 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06007436
Tony Barboureb254902015-07-15 12:50:33 -06007437 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7438 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7439 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007440 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007441 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007442
Tobin Ehlis3b780662015-05-28 12:11:26 -06007443 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007444 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7445 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007446 ASSERT_VK_SUCCESS(err);
7447
7448 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007449 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007450 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007451 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007452 alloc_info.descriptorPool = ds_pool;
7453 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007454 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7455 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007456 ASSERT_VK_SUCCESS(err);
7457
Tony Barboureb254902015-07-15 12:50:33 -06007458 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007459 pipe_ms_state_ci.sType =
7460 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7461 pipe_ms_state_ci.pNext = NULL;
7462 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7463 pipe_ms_state_ci.sampleShadingEnable = 0;
7464 pipe_ms_state_ci.minSampleShading = 1.0;
7465 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06007466
Tony Barboureb254902015-07-15 12:50:33 -06007467 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007468 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7469 pipeline_layout_ci.pNext = NULL;
7470 pipeline_layout_ci.setLayoutCount = 1;
7471 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06007472
7473 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007474 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7475 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06007476 ASSERT_VK_SUCCESS(err);
7477
Karl Schultz6addd812016-02-02 17:17:23 -07007478 VkShaderObj vs(m_device, bindStateVertShaderText,
7479 VK_SHADER_STAGE_VERTEX_BIT, this);
7480 VkShaderObj fs(m_device, bindStateFragShaderText,
7481 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06007482 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07007483 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007484 VkPipelineObj pipe(m_device);
7485 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007486 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06007487 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007488 pipe.SetMSAA(&pipe_ms_state_ci);
7489 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06007490
Tony Barbourfe3351b2015-07-28 10:17:20 -06007491 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007492 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7493 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06007494
Mark Young29927482016-05-04 14:38:51 -06007495 // Render triangle (the error should trigger on the attempt to draw).
7496 Draw(3, 1, 0, 0);
7497
7498 // Finalize recording of the command buffer
7499 EndCommandBuffer();
7500
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007501 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007502
Chia-I Wuf7458c52015-10-26 21:10:41 +08007503 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7504 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7505 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007506}
Mark Young29927482016-05-04 14:38:51 -06007507
Mark Youngc89c6312016-03-31 16:03:20 -06007508TEST_F(VkLayerTest, NumBlendAttachMismatch) {
7509 // Create Pipeline where the number of blend attachments doesn't match the
7510 // number of color attachments. In this case, we don't add any color
7511 // blend attachments even though we have a color attachment.
7512 VkResult err;
7513
7514 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -06007515 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -06007516
7517 ASSERT_NO_FATAL_FAILURE(InitState());
7518 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7519 VkDescriptorPoolSize ds_type_count = {};
7520 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7521 ds_type_count.descriptorCount = 1;
7522
7523 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7524 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7525 ds_pool_ci.pNext = NULL;
7526 ds_pool_ci.maxSets = 1;
7527 ds_pool_ci.poolSizeCount = 1;
7528 ds_pool_ci.pPoolSizes = &ds_type_count;
7529
7530 VkDescriptorPool ds_pool;
7531 err =
7532 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
7533 ASSERT_VK_SUCCESS(err);
7534
7535 VkDescriptorSetLayoutBinding dsl_binding = {};
7536 dsl_binding.binding = 0;
7537 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7538 dsl_binding.descriptorCount = 1;
7539 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7540 dsl_binding.pImmutableSamplers = NULL;
7541
7542 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7543 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7544 ds_layout_ci.pNext = NULL;
7545 ds_layout_ci.bindingCount = 1;
7546 ds_layout_ci.pBindings = &dsl_binding;
7547
7548 VkDescriptorSetLayout ds_layout;
7549 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7550 &ds_layout);
7551 ASSERT_VK_SUCCESS(err);
7552
7553 VkDescriptorSet descriptorSet;
7554 VkDescriptorSetAllocateInfo alloc_info = {};
7555 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7556 alloc_info.descriptorSetCount = 1;
7557 alloc_info.descriptorPool = ds_pool;
7558 alloc_info.pSetLayouts = &ds_layout;
7559 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7560 &descriptorSet);
7561 ASSERT_VK_SUCCESS(err);
7562
7563 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7564 pipe_ms_state_ci.sType =
7565 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7566 pipe_ms_state_ci.pNext = NULL;
7567 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7568 pipe_ms_state_ci.sampleShadingEnable = 0;
7569 pipe_ms_state_ci.minSampleShading = 1.0;
7570 pipe_ms_state_ci.pSampleMask = NULL;
7571
7572 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7573 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7574 pipeline_layout_ci.pNext = NULL;
7575 pipeline_layout_ci.setLayoutCount = 1;
7576 pipeline_layout_ci.pSetLayouts = &ds_layout;
7577
7578 VkPipelineLayout pipeline_layout;
7579 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7580 &pipeline_layout);
7581 ASSERT_VK_SUCCESS(err);
7582
7583 VkShaderObj vs(m_device, bindStateVertShaderText,
7584 VK_SHADER_STAGE_VERTEX_BIT, this);
7585 VkShaderObj fs(m_device, bindStateFragShaderText,
7586 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06007587 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06007588 // but add it to be able to run on more devices
7589 VkPipelineObj pipe(m_device);
7590 pipe.AddShader(&vs);
7591 pipe.AddShader(&fs);
7592 pipe.SetMSAA(&pipe_ms_state_ci);
7593 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7594
7595 BeginCommandBuffer();
7596 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7597 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7598
Mark Young29927482016-05-04 14:38:51 -06007599 // Render triangle (the error should trigger on the attempt to draw).
7600 Draw(3, 1, 0, 0);
7601
7602 // Finalize recording of the command buffer
7603 EndCommandBuffer();
7604
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007605 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06007606
7607 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7608 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7609 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7610}
Mark Young29927482016-05-04 14:38:51 -06007611
Karl Schultz6addd812016-02-02 17:17:23 -07007612TEST_F(VkLayerTest, ClearCmdNoDraw) {
7613 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
7614 // to issuing a Draw
7615 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007616
Karl Schultz6addd812016-02-02 17:17:23 -07007617 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07007618 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007619 "vkCmdClearAttachments() issued on CB object ");
7620
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007621 ASSERT_NO_FATAL_FAILURE(InitState());
7622 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06007623
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007624 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007625 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7626 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007627
7628 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007629 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7630 ds_pool_ci.pNext = NULL;
7631 ds_pool_ci.maxSets = 1;
7632 ds_pool_ci.poolSizeCount = 1;
7633 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06007634
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007635 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007636 err =
7637 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007638 ASSERT_VK_SUCCESS(err);
7639
Tony Barboureb254902015-07-15 12:50:33 -06007640 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007641 dsl_binding.binding = 0;
7642 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7643 dsl_binding.descriptorCount = 1;
7644 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7645 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007646
Tony Barboureb254902015-07-15 12:50:33 -06007647 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007648 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7649 ds_layout_ci.pNext = NULL;
7650 ds_layout_ci.bindingCount = 1;
7651 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007652
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007653 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007654 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7655 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007656 ASSERT_VK_SUCCESS(err);
7657
7658 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007659 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007660 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007661 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007662 alloc_info.descriptorPool = ds_pool;
7663 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007664 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7665 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007666 ASSERT_VK_SUCCESS(err);
7667
Tony Barboureb254902015-07-15 12:50:33 -06007668 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007669 pipe_ms_state_ci.sType =
7670 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7671 pipe_ms_state_ci.pNext = NULL;
7672 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7673 pipe_ms_state_ci.sampleShadingEnable = 0;
7674 pipe_ms_state_ci.minSampleShading = 1.0;
7675 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007676
Tony Barboureb254902015-07-15 12:50:33 -06007677 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007678 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7679 pipeline_layout_ci.pNext = NULL;
7680 pipeline_layout_ci.setLayoutCount = 1;
7681 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007682
7683 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007684 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7685 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007686 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007687
Karl Schultz6addd812016-02-02 17:17:23 -07007688 VkShaderObj vs(m_device, bindStateVertShaderText,
7689 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06007690 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07007691 // on more devices
7692 VkShaderObj fs(m_device, bindStateFragShaderText,
7693 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007694
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007695 VkPipelineObj pipe(m_device);
7696 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007697 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007698 pipe.SetMSAA(&pipe_ms_state_ci);
7699 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007700
7701 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007702
Karl Schultz6addd812016-02-02 17:17:23 -07007703 // Main thing we care about for this test is that the VkImage obj we're
7704 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007705 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06007706 VkClearAttachment color_attachment;
7707 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7708 color_attachment.clearValue.color.float32[0] = 1.0;
7709 color_attachment.clearValue.color.float32[1] = 1.0;
7710 color_attachment.clearValue.color.float32[2] = 1.0;
7711 color_attachment.clearValue.color.float32[3] = 1.0;
7712 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07007713 VkClearRect clear_rect = {
7714 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007715
Karl Schultz6addd812016-02-02 17:17:23 -07007716 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
7717 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007718
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007719 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007720
Chia-I Wuf7458c52015-10-26 21:10:41 +08007721 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7722 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7723 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06007724}
7725
Karl Schultz6addd812016-02-02 17:17:23 -07007726TEST_F(VkLayerTest, VtxBufferBadIndex) {
7727 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007728
Karl Schultz6addd812016-02-02 17:17:23 -07007729 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007730 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07007731 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007732
Tobin Ehlis502480b2015-06-24 15:53:07 -06007733 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06007734 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06007735 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06007736
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007737 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007738 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7739 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007740
7741 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007742 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7743 ds_pool_ci.pNext = NULL;
7744 ds_pool_ci.maxSets = 1;
7745 ds_pool_ci.poolSizeCount = 1;
7746 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06007747
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06007748 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007749 err =
7750 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007751 ASSERT_VK_SUCCESS(err);
7752
Tony Barboureb254902015-07-15 12:50:33 -06007753 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007754 dsl_binding.binding = 0;
7755 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7756 dsl_binding.descriptorCount = 1;
7757 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7758 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007759
Tony Barboureb254902015-07-15 12:50:33 -06007760 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007761 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7762 ds_layout_ci.pNext = NULL;
7763 ds_layout_ci.bindingCount = 1;
7764 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007765
Tobin Ehlis502480b2015-06-24 15:53:07 -06007766 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007767 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7768 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007769 ASSERT_VK_SUCCESS(err);
7770
7771 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007772 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007773 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007774 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007775 alloc_info.descriptorPool = ds_pool;
7776 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007777 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7778 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007779 ASSERT_VK_SUCCESS(err);
7780
Tony Barboureb254902015-07-15 12:50:33 -06007781 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007782 pipe_ms_state_ci.sType =
7783 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7784 pipe_ms_state_ci.pNext = NULL;
7785 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7786 pipe_ms_state_ci.sampleShadingEnable = 0;
7787 pipe_ms_state_ci.minSampleShading = 1.0;
7788 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007789
Tony Barboureb254902015-07-15 12:50:33 -06007790 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007791 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7792 pipeline_layout_ci.pNext = NULL;
7793 pipeline_layout_ci.setLayoutCount = 1;
7794 pipeline_layout_ci.pSetLayouts = &ds_layout;
7795 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06007796
Karl Schultz6addd812016-02-02 17:17:23 -07007797 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7798 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007799 ASSERT_VK_SUCCESS(err);
7800
Karl Schultz6addd812016-02-02 17:17:23 -07007801 VkShaderObj vs(m_device, bindStateVertShaderText,
7802 VK_SHADER_STAGE_VERTEX_BIT, this);
7803 VkShaderObj fs(m_device, bindStateFragShaderText,
7804 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06007805 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07007806 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007807 VkPipelineObj pipe(m_device);
7808 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007809 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06007810 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007811 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007812 pipe.SetViewport(m_viewports);
7813 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06007814 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007815
7816 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007817 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7818 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06007819 // Don't care about actual data, just need to get to draw to flag error
7820 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07007821 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
7822 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06007823 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06007824 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007825
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007826 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007827
Chia-I Wuf7458c52015-10-26 21:10:41 +08007828 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7829 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7830 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06007831}
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06007832// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
7833TEST_F(VkLayerTest, InvalidImageLayout) {
7834 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
7835 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
7836 "images in the wrong layout when they're copied or transitioned.");
7837 // 3 in ValidateCmdBufImageLayouts
7838 // * -1 Attempt to submit cmd buf w/ deleted image
7839 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
7840 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
7841 m_errorMonitor->SetDesiredFailureMsg(
7842 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7843 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
7844
7845 ASSERT_NO_FATAL_FAILURE(InitState());
7846 // Create src & dst images to use for copy operations
7847 VkImage src_image;
7848 VkImage dst_image;
7849
7850 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7851 const int32_t tex_width = 32;
7852 const int32_t tex_height = 32;
7853
7854 VkImageCreateInfo image_create_info = {};
7855 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7856 image_create_info.pNext = NULL;
7857 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7858 image_create_info.format = tex_format;
7859 image_create_info.extent.width = tex_width;
7860 image_create_info.extent.height = tex_height;
7861 image_create_info.extent.depth = 1;
7862 image_create_info.mipLevels = 1;
7863 image_create_info.arrayLayers = 4;
7864 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7865 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7866 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7867 image_create_info.flags = 0;
7868
7869 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
7870 ASSERT_VK_SUCCESS(err);
7871 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
7872 ASSERT_VK_SUCCESS(err);
7873
7874 BeginCommandBuffer();
7875 VkImageCopy copyRegion;
7876 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7877 copyRegion.srcSubresource.mipLevel = 0;
7878 copyRegion.srcSubresource.baseArrayLayer = 0;
7879 copyRegion.srcSubresource.layerCount = 1;
7880 copyRegion.srcOffset.x = 0;
7881 copyRegion.srcOffset.y = 0;
7882 copyRegion.srcOffset.z = 0;
7883 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7884 copyRegion.dstSubresource.mipLevel = 0;
7885 copyRegion.dstSubresource.baseArrayLayer = 0;
7886 copyRegion.dstSubresource.layerCount = 1;
7887 copyRegion.dstOffset.x = 0;
7888 copyRegion.dstOffset.y = 0;
7889 copyRegion.dstOffset.z = 0;
7890 copyRegion.extent.width = 1;
7891 copyRegion.extent.height = 1;
7892 copyRegion.extent.depth = 1;
7893 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7894 m_errorMonitor->VerifyFound();
7895 // Now cause error due to src image layout changing
7896 m_errorMonitor->SetDesiredFailureMsg(
7897 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7898 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
7899 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7900 m_errorMonitor->VerifyFound();
7901 // Final src error is due to bad layout type
7902 m_errorMonitor->SetDesiredFailureMsg(
7903 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7904 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
7905 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7906 m_errorMonitor->VerifyFound();
7907 // Now verify same checks for dst
7908 m_errorMonitor->SetDesiredFailureMsg(
7909 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7910 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
7911 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7912 m_errorMonitor->VerifyFound();
7913 // Now cause error due to src image layout changing
7914 m_errorMonitor->SetDesiredFailureMsg(
7915 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7916 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
7917 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
7918 m_errorMonitor->VerifyFound();
7919 m_errorMonitor->SetDesiredFailureMsg(
7920 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7921 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
7922 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
7923 m_errorMonitor->VerifyFound();
7924 // Now cause error due to bad image layout transition in PipelineBarrier
7925 VkImageMemoryBarrier image_barrier[1] = {};
7926 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
7927 image_barrier[0].image = src_image;
7928 image_barrier[0].subresourceRange.layerCount = 2;
7929 image_barrier[0].subresourceRange.levelCount = 2;
7930 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7931 m_errorMonitor->SetDesiredFailureMsg(
7932 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7933 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
7934 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
7935 m_errorMonitor->VerifyFound();
7936
7937 // Finally some layout errors at RenderPass create time
7938 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
7939 VkAttachmentReference attach = {};
7940 // perf warning for GENERAL layout w/ non-DS input attachment
7941 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7942 VkSubpassDescription subpass = {};
7943 subpass.inputAttachmentCount = 1;
7944 subpass.pInputAttachments = &attach;
7945 VkRenderPassCreateInfo rpci = {};
7946 rpci.subpassCount = 1;
7947 rpci.pSubpasses = &subpass;
7948 rpci.attachmentCount = 1;
7949 VkAttachmentDescription attach_desc = {};
7950 attach_desc.format = VK_FORMAT_UNDEFINED;
7951 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -06007952 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06007953 VkRenderPass rp;
7954 m_errorMonitor->SetDesiredFailureMsg(
7955 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7956 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
7957 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7958 m_errorMonitor->VerifyFound();
7959 // error w/ non-general layout
7960 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7961
7962 m_errorMonitor->SetDesiredFailureMsg(
7963 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7964 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
7965 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7966 m_errorMonitor->VerifyFound();
7967 subpass.inputAttachmentCount = 0;
7968 subpass.colorAttachmentCount = 1;
7969 subpass.pColorAttachments = &attach;
7970 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7971 // perf warning for GENERAL layout on color attachment
7972 m_errorMonitor->SetDesiredFailureMsg(
7973 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7974 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
7975 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7976 m_errorMonitor->VerifyFound();
7977 // error w/ non-color opt or GENERAL layout for color attachment
7978 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7979 m_errorMonitor->SetDesiredFailureMsg(
7980 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7981 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
7982 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7983 m_errorMonitor->VerifyFound();
7984 subpass.colorAttachmentCount = 0;
7985 subpass.pDepthStencilAttachment = &attach;
7986 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7987 // perf warning for GENERAL layout on DS attachment
7988 m_errorMonitor->SetDesiredFailureMsg(
7989 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7990 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
7991 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7992 m_errorMonitor->VerifyFound();
7993 // error w/ non-ds opt or GENERAL layout for color attachment
7994 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
7995 m_errorMonitor->SetDesiredFailureMsg(
7996 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7997 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
7998 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7999 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -06008000 // For this error we need a valid renderpass so create default one
8001 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
8002 attach.attachment = 0;
8003 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
8004 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
8005 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
8006 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
8007 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
8008 // Can't do a CLEAR load on READ_ONLY initialLayout
8009 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8010 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
8011 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8013 " with invalid first layout "
8014 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
8015 "ONLY_OPTIMAL");
8016 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8017 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06008018
8019 vkDestroyImage(m_device->device(), src_image, NULL);
8020 vkDestroyImage(m_device->device(), dst_image, NULL);
8021}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008022#endif // DRAW_STATE_TESTS
8023
Tobin Ehlis0788f522015-05-26 16:11:58 -06008024#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06008025#if GTEST_IS_THREADSAFE
8026struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008027 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06008028 VkEvent event;
8029 bool bailout;
8030};
8031
Karl Schultz6addd812016-02-02 17:17:23 -07008032extern "C" void *AddToCommandBuffer(void *arg) {
8033 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06008034
Karl Schultz6addd812016-02-02 17:17:23 -07008035 for (int i = 0; i < 10000; i++) {
8036 vkCmdSetEvent(data->commandBuffer, data->event,
8037 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06008038 if (data->bailout) {
8039 break;
8040 }
8041 }
8042 return NULL;
8043}
8044
Karl Schultz6addd812016-02-02 17:17:23 -07008045TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06008046 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06008047
Karl Schultz6addd812016-02-02 17:17:23 -07008048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8049 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008050
Mike Stroyanaccf7692015-05-12 16:00:45 -06008051 ASSERT_NO_FATAL_FAILURE(InitState());
8052 ASSERT_NO_FATAL_FAILURE(InitViewport());
8053 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8054
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008055 // Calls AllocateCommandBuffers
8056 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06008057
8058 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008059 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06008060
8061 VkEventCreateInfo event_info;
8062 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06008063 VkResult err;
8064
8065 memset(&event_info, 0, sizeof(event_info));
8066 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
8067
Chia-I Wuf7458c52015-10-26 21:10:41 +08008068 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06008069 ASSERT_VK_SUCCESS(err);
8070
Mike Stroyanaccf7692015-05-12 16:00:45 -06008071 err = vkResetEvent(device(), event);
8072 ASSERT_VK_SUCCESS(err);
8073
8074 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008075 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06008076 data.event = event;
8077 data.bailout = false;
8078 m_errorMonitor->SetBailout(&data.bailout);
8079 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06008080 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06008081 // Add many entries to command buffer from this thread at the same time.
8082 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06008083
Mike Stroyan4268d1f2015-07-13 14:45:35 -06008084 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008085 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06008086
Mike Stroyan10b8cb72016-01-22 15:22:03 -07008087 m_errorMonitor->SetBailout(NULL);
8088
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008089 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06008090
Chia-I Wuf7458c52015-10-26 21:10:41 +08008091 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06008092}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008093#endif // GTEST_IS_THREADSAFE
8094#endif // THREADING_TESTS
8095
Chris Forbes9f7ff632015-05-25 11:13:08 +12008096#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07008097TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12008099 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008100
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008101 ASSERT_NO_FATAL_FAILURE(InitState());
8102 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8103
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008104 VkShaderModule module;
8105 VkShaderModuleCreateInfo moduleCreateInfo;
8106 struct icd_spv_header spv;
8107
8108 spv.magic = ICD_SPV_MAGIC;
8109 spv.version = ICD_SPV_VERSION;
8110 spv.gen_magic = 0;
8111
8112 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
8113 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008114 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008115 moduleCreateInfo.codeSize = 4;
8116 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008117 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008118
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008119 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008120}
8121
Karl Schultz6addd812016-02-02 17:17:23 -07008122TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12008124 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008125
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008126 ASSERT_NO_FATAL_FAILURE(InitState());
8127 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8128
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008129 VkShaderModule module;
8130 VkShaderModuleCreateInfo moduleCreateInfo;
8131 struct icd_spv_header spv;
8132
8133 spv.magic = ~ICD_SPV_MAGIC;
8134 spv.version = ICD_SPV_VERSION;
8135 spv.gen_magic = 0;
8136
8137 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
8138 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008139 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008140 moduleCreateInfo.codeSize = sizeof(spv) + 10;
8141 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008142 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008143
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008144 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008145}
8146
Chris Forbesb4afd0f2016-04-04 10:48:35 +12008147#if 0
8148// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07008149TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008150 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12008151 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008152
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008153 ASSERT_NO_FATAL_FAILURE(InitState());
8154 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8155
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008156 VkShaderModule module;
8157 VkShaderModuleCreateInfo moduleCreateInfo;
8158 struct icd_spv_header spv;
8159
8160 spv.magic = ICD_SPV_MAGIC;
8161 spv.version = ~ICD_SPV_VERSION;
8162 spv.gen_magic = 0;
8163
8164 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
8165 moduleCreateInfo.pNext = NULL;
8166
Karl Schultz6addd812016-02-02 17:17:23 -07008167 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008168 moduleCreateInfo.codeSize = sizeof(spv) + 10;
8169 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008170 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008171
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008172 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008173}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12008174#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06008175
Karl Schultz6addd812016-02-02 17:17:23 -07008176TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008178 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008179
Chris Forbes9f7ff632015-05-25 11:13:08 +12008180 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008181 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12008182
8183 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008184 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12008185 "\n"
8186 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07008187 "out gl_PerVertex {\n"
8188 " vec4 gl_Position;\n"
8189 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12008190 "void main(){\n"
8191 " gl_Position = vec4(1);\n"
8192 " x = 0;\n"
8193 "}\n";
8194 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008195 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12008196 "\n"
8197 "layout(location=0) out vec4 color;\n"
8198 "void main(){\n"
8199 " color = vec4(1);\n"
8200 "}\n";
8201
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008202 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8203 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12008204
8205 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008206 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12008207 pipe.AddShader(&vs);
8208 pipe.AddShader(&fs);
8209
Chris Forbes9f7ff632015-05-25 11:13:08 +12008210 VkDescriptorSetObj descriptorSet(m_device);
8211 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008212 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12008213
Tony Barbour5781e8f2015-08-04 16:23:11 -06008214 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12008215
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008216 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12008217}
Chris Forbes9f7ff632015-05-25 11:13:08 +12008218
Karl Schultz6addd812016-02-02 17:17:23 -07008219TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008221 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008222
Chris Forbes59cb88d2015-05-25 11:13:13 +12008223 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008224 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12008225
8226 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008227 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12008228 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008229 "out gl_PerVertex {\n"
8230 " vec4 gl_Position;\n"
8231 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12008232 "void main(){\n"
8233 " gl_Position = vec4(1);\n"
8234 "}\n";
8235 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008236 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12008237 "\n"
8238 "layout(location=0) in float x;\n"
8239 "layout(location=0) out vec4 color;\n"
8240 "void main(){\n"
8241 " color = vec4(x);\n"
8242 "}\n";
8243
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008244 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8245 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12008246
8247 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008248 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12008249 pipe.AddShader(&vs);
8250 pipe.AddShader(&fs);
8251
Chris Forbes59cb88d2015-05-25 11:13:13 +12008252 VkDescriptorSetObj descriptorSet(m_device);
8253 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008254 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12008255
Tony Barbour5781e8f2015-08-04 16:23:11 -06008256 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12008257
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008258 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12008259}
8260
Karl Schultz6addd812016-02-02 17:17:23 -07008261TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13008262 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008263 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13008264
8265 ASSERT_NO_FATAL_FAILURE(InitState());
8266 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8267
8268 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008269 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13008270 "\n"
8271 "out gl_PerVertex {\n"
8272 " vec4 gl_Position;\n"
8273 "};\n"
8274 "void main(){\n"
8275 " gl_Position = vec4(1);\n"
8276 "}\n";
8277 char const *fsSource =
8278 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13008279 "\n"
8280 "in block { layout(location=0) float x; } ins;\n"
8281 "layout(location=0) out vec4 color;\n"
8282 "void main(){\n"
8283 " color = vec4(ins.x);\n"
8284 "}\n";
8285
8286 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8287 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8288
8289 VkPipelineObj pipe(m_device);
8290 pipe.AddColorAttachment();
8291 pipe.AddShader(&vs);
8292 pipe.AddShader(&fs);
8293
8294 VkDescriptorSetObj descriptorSet(m_device);
8295 descriptorSet.AppendDummy();
8296 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8297
8298 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8299
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008300 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13008301}
8302
Karl Schultz6addd812016-02-02 17:17:23 -07008303TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13008304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13008305 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07008306 "output arr[2] of float32' vs 'ptr to "
8307 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13008308
8309 ASSERT_NO_FATAL_FAILURE(InitState());
8310 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8311
8312 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008313 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13008314 "\n"
8315 "layout(location=0) out float x[2];\n"
8316 "out gl_PerVertex {\n"
8317 " vec4 gl_Position;\n"
8318 "};\n"
8319 "void main(){\n"
8320 " x[0] = 0; x[1] = 0;\n"
8321 " gl_Position = vec4(1);\n"
8322 "}\n";
8323 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008324 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13008325 "\n"
8326 "layout(location=0) in float x[3];\n"
8327 "layout(location=0) out vec4 color;\n"
8328 "void main(){\n"
8329 " color = vec4(x[0] + x[1] + x[2]);\n"
8330 "}\n";
8331
8332 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8333 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8334
8335 VkPipelineObj pipe(m_device);
8336 pipe.AddColorAttachment();
8337 pipe.AddShader(&vs);
8338 pipe.AddShader(&fs);
8339
8340 VkDescriptorSetObj descriptorSet(m_device);
8341 descriptorSet.AppendDummy();
8342 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8343
8344 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8345
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008346 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13008347}
8348
Karl Schultz6addd812016-02-02 17:17:23 -07008349TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008350 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008351 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008352
Chris Forbesb56af562015-05-25 11:13:17 +12008353 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008354 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12008355
8356 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008357 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12008358 "\n"
8359 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07008360 "out gl_PerVertex {\n"
8361 " vec4 gl_Position;\n"
8362 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12008363 "void main(){\n"
8364 " x = 0;\n"
8365 " gl_Position = vec4(1);\n"
8366 "}\n";
8367 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008368 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12008369 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008370 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12008371 "layout(location=0) out vec4 color;\n"
8372 "void main(){\n"
8373 " color = vec4(x);\n"
8374 "}\n";
8375
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008376 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8377 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12008378
8379 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008380 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12008381 pipe.AddShader(&vs);
8382 pipe.AddShader(&fs);
8383
Chris Forbesb56af562015-05-25 11:13:17 +12008384 VkDescriptorSetObj descriptorSet(m_device);
8385 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008386 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12008387
Tony Barbour5781e8f2015-08-04 16:23:11 -06008388 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12008389
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008390 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12008391}
8392
Karl Schultz6addd812016-02-02 17:17:23 -07008393TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13008394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008395 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13008396
8397 ASSERT_NO_FATAL_FAILURE(InitState());
8398 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8399
8400 char const *vsSource =
8401 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13008402 "\n"
8403 "out block { layout(location=0) int x; } outs;\n"
8404 "out gl_PerVertex {\n"
8405 " vec4 gl_Position;\n"
8406 "};\n"
8407 "void main(){\n"
8408 " outs.x = 0;\n"
8409 " gl_Position = vec4(1);\n"
8410 "}\n";
8411 char const *fsSource =
8412 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13008413 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008414 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13008415 "layout(location=0) out vec4 color;\n"
8416 "void main(){\n"
8417 " color = vec4(ins.x);\n"
8418 "}\n";
8419
8420 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8421 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8422
8423 VkPipelineObj pipe(m_device);
8424 pipe.AddColorAttachment();
8425 pipe.AddShader(&vs);
8426 pipe.AddShader(&fs);
8427
8428 VkDescriptorSetObj descriptorSet(m_device);
8429 descriptorSet.AppendDummy();
8430 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8431
8432 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8433
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008434 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13008435}
8436
8437TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
8438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8439 "location 0.0 which is not written by vertex shader");
8440
8441 ASSERT_NO_FATAL_FAILURE(InitState());
8442 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8443
8444 char const *vsSource =
8445 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13008446 "\n"
8447 "out block { layout(location=1) float x; } outs;\n"
8448 "out gl_PerVertex {\n"
8449 " vec4 gl_Position;\n"
8450 "};\n"
8451 "void main(){\n"
8452 " outs.x = 0;\n"
8453 " gl_Position = vec4(1);\n"
8454 "}\n";
8455 char const *fsSource =
8456 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13008457 "\n"
8458 "in block { layout(location=0) float x; } ins;\n"
8459 "layout(location=0) out vec4 color;\n"
8460 "void main(){\n"
8461 " color = vec4(ins.x);\n"
8462 "}\n";
8463
8464 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8465 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8466
8467 VkPipelineObj pipe(m_device);
8468 pipe.AddColorAttachment();
8469 pipe.AddShader(&vs);
8470 pipe.AddShader(&fs);
8471
8472 VkDescriptorSetObj descriptorSet(m_device);
8473 descriptorSet.AppendDummy();
8474 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8475
8476 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8477
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008478 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13008479}
8480
8481TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
8482 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8483 "location 0.1 which is not written by vertex shader");
8484
8485 ASSERT_NO_FATAL_FAILURE(InitState());
8486 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8487
8488 char const *vsSource =
8489 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13008490 "\n"
8491 "out block { layout(location=0, component=0) float x; } outs;\n"
8492 "out gl_PerVertex {\n"
8493 " vec4 gl_Position;\n"
8494 "};\n"
8495 "void main(){\n"
8496 " outs.x = 0;\n"
8497 " gl_Position = vec4(1);\n"
8498 "}\n";
8499 char const *fsSource =
8500 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13008501 "\n"
8502 "in block { layout(location=0, component=1) float x; } ins;\n"
8503 "layout(location=0) out vec4 color;\n"
8504 "void main(){\n"
8505 " color = vec4(ins.x);\n"
8506 "}\n";
8507
8508 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8509 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8510
8511 VkPipelineObj pipe(m_device);
8512 pipe.AddColorAttachment();
8513 pipe.AddShader(&vs);
8514 pipe.AddShader(&fs);
8515
8516 VkDescriptorSetObj descriptorSet(m_device);
8517 descriptorSet.AppendDummy();
8518 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8519
8520 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8521
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008522 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13008523}
8524
Karl Schultz6addd812016-02-02 17:17:23 -07008525TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008526 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008527 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008528
Chris Forbesde136e02015-05-25 11:13:28 +12008529 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008530 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12008531
8532 VkVertexInputBindingDescription input_binding;
8533 memset(&input_binding, 0, sizeof(input_binding));
8534
8535 VkVertexInputAttributeDescription input_attrib;
8536 memset(&input_attrib, 0, sizeof(input_attrib));
8537 input_attrib.format = VK_FORMAT_R32_SFLOAT;
8538
8539 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008540 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12008541 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008542 "out gl_PerVertex {\n"
8543 " vec4 gl_Position;\n"
8544 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12008545 "void main(){\n"
8546 " gl_Position = vec4(1);\n"
8547 "}\n";
8548 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008549 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12008550 "\n"
8551 "layout(location=0) out vec4 color;\n"
8552 "void main(){\n"
8553 " color = vec4(1);\n"
8554 "}\n";
8555
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008556 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8557 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12008558
8559 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008560 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12008561 pipe.AddShader(&vs);
8562 pipe.AddShader(&fs);
8563
8564 pipe.AddVertexInputBindings(&input_binding, 1);
8565 pipe.AddVertexInputAttribs(&input_attrib, 1);
8566
Chris Forbesde136e02015-05-25 11:13:28 +12008567 VkDescriptorSetObj descriptorSet(m_device);
8568 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008569 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12008570
Tony Barbour5781e8f2015-08-04 16:23:11 -06008571 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12008572
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008573 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12008574}
8575
Karl Schultz6addd812016-02-02 17:17:23 -07008576TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008577 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008578 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13008579
8580 ASSERT_NO_FATAL_FAILURE(InitState());
8581 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8582
8583 VkVertexInputBindingDescription input_binding;
8584 memset(&input_binding, 0, sizeof(input_binding));
8585
8586 VkVertexInputAttributeDescription input_attrib;
8587 memset(&input_attrib, 0, sizeof(input_attrib));
8588 input_attrib.format = VK_FORMAT_R32_SFLOAT;
8589
8590 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008591 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13008592 "\n"
8593 "layout(location=1) in float x;\n"
8594 "out gl_PerVertex {\n"
8595 " vec4 gl_Position;\n"
8596 "};\n"
8597 "void main(){\n"
8598 " gl_Position = vec4(x);\n"
8599 "}\n";
8600 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008601 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13008602 "\n"
8603 "layout(location=0) out vec4 color;\n"
8604 "void main(){\n"
8605 " color = vec4(1);\n"
8606 "}\n";
8607
8608 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8609 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8610
8611 VkPipelineObj pipe(m_device);
8612 pipe.AddColorAttachment();
8613 pipe.AddShader(&vs);
8614 pipe.AddShader(&fs);
8615
8616 pipe.AddVertexInputBindings(&input_binding, 1);
8617 pipe.AddVertexInputAttribs(&input_attrib, 1);
8618
8619 VkDescriptorSetObj descriptorSet(m_device);
8620 descriptorSet.AppendDummy();
8621 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8622
8623 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8624
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008625 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13008626}
8627
Karl Schultz6addd812016-02-02 17:17:23 -07008628TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
8629 m_errorMonitor->SetDesiredFailureMsg(
8630 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008631 "VS consumes input at location 0 but not provided");
8632
Chris Forbes62e8e502015-05-25 11:13:29 +12008633 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008634 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12008635
8636 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008637 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12008638 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008639 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07008640 "out gl_PerVertex {\n"
8641 " vec4 gl_Position;\n"
8642 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12008643 "void main(){\n"
8644 " gl_Position = x;\n"
8645 "}\n";
8646 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008647 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12008648 "\n"
8649 "layout(location=0) out vec4 color;\n"
8650 "void main(){\n"
8651 " color = vec4(1);\n"
8652 "}\n";
8653
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008654 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8655 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12008656
8657 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008658 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12008659 pipe.AddShader(&vs);
8660 pipe.AddShader(&fs);
8661
Chris Forbes62e8e502015-05-25 11:13:29 +12008662 VkDescriptorSetObj descriptorSet(m_device);
8663 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008664 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12008665
Tony Barbour5781e8f2015-08-04 16:23:11 -06008666 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12008667
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008668 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12008669}
8670
Karl Schultz6addd812016-02-02 17:17:23 -07008671TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
8672 m_errorMonitor->SetDesiredFailureMsg(
8673 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008674 "location 0 does not match VS input type");
8675
Chris Forbesc97d98e2015-05-25 11:13:31 +12008676 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008677 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12008678
8679 VkVertexInputBindingDescription input_binding;
8680 memset(&input_binding, 0, sizeof(input_binding));
8681
8682 VkVertexInputAttributeDescription input_attrib;
8683 memset(&input_attrib, 0, sizeof(input_attrib));
8684 input_attrib.format = VK_FORMAT_R32_SFLOAT;
8685
8686 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008687 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12008688 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008689 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07008690 "out gl_PerVertex {\n"
8691 " vec4 gl_Position;\n"
8692 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12008693 "void main(){\n"
8694 " gl_Position = vec4(x);\n"
8695 "}\n";
8696 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008697 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12008698 "\n"
8699 "layout(location=0) out vec4 color;\n"
8700 "void main(){\n"
8701 " color = vec4(1);\n"
8702 "}\n";
8703
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008704 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8705 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12008706
8707 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08008708 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12008709 pipe.AddShader(&vs);
8710 pipe.AddShader(&fs);
8711
8712 pipe.AddVertexInputBindings(&input_binding, 1);
8713 pipe.AddVertexInputAttribs(&input_attrib, 1);
8714
Chris Forbesc97d98e2015-05-25 11:13:31 +12008715 VkDescriptorSetObj descriptorSet(m_device);
8716 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008717 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12008718
Tony Barbour5781e8f2015-08-04 16:23:11 -06008719 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12008720
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008721 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12008722}
8723
Chris Forbesc68b43c2016-04-06 11:18:47 +12008724TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
8725 m_errorMonitor->SetDesiredFailureMsg(
8726 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8727 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
8728
8729 ASSERT_NO_FATAL_FAILURE(InitState());
8730 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8731
8732 char const *vsSource =
8733 "#version 450\n"
8734 "\n"
8735 "out gl_PerVertex {\n"
8736 " vec4 gl_Position;\n"
8737 "};\n"
8738 "void main(){\n"
8739 " gl_Position = vec4(1);\n"
8740 "}\n";
8741 char const *fsSource =
8742 "#version 450\n"
8743 "\n"
8744 "layout(location=0) out vec4 color;\n"
8745 "void main(){\n"
8746 " color = vec4(1);\n"
8747 "}\n";
8748
8749 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8750 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8751
8752 VkPipelineObj pipe(m_device);
8753 pipe.AddColorAttachment();
8754 pipe.AddShader(&vs);
8755 pipe.AddShader(&vs);
8756 pipe.AddShader(&fs);
8757
8758 VkDescriptorSetObj descriptorSet(m_device);
8759 descriptorSet.AppendDummy();
8760 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8761
8762 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8763
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008764 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12008765}
8766
Karl Schultz6addd812016-02-02 17:17:23 -07008767TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008768 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13008769
8770 ASSERT_NO_FATAL_FAILURE(InitState());
8771 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8772
8773 VkVertexInputBindingDescription input_binding;
8774 memset(&input_binding, 0, sizeof(input_binding));
8775
8776 VkVertexInputAttributeDescription input_attribs[2];
8777 memset(input_attribs, 0, sizeof(input_attribs));
8778
8779 for (int i = 0; i < 2; i++) {
8780 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
8781 input_attribs[i].location = i;
8782 }
8783
8784 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008785 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008786 "\n"
8787 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07008788 "out gl_PerVertex {\n"
8789 " vec4 gl_Position;\n"
8790 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008791 "void main(){\n"
8792 " gl_Position = x[0] + x[1];\n"
8793 "}\n";
8794 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008795 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008796 "\n"
8797 "layout(location=0) out vec4 color;\n"
8798 "void main(){\n"
8799 " color = vec4(1);\n"
8800 "}\n";
8801
8802 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8803 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8804
8805 VkPipelineObj pipe(m_device);
8806 pipe.AddColorAttachment();
8807 pipe.AddShader(&vs);
8808 pipe.AddShader(&fs);
8809
8810 pipe.AddVertexInputBindings(&input_binding, 1);
8811 pipe.AddVertexInputAttribs(input_attribs, 2);
8812
8813 VkDescriptorSetObj descriptorSet(m_device);
8814 descriptorSet.AppendDummy();
8815 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8816
8817 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8818
8819 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008820 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13008821}
8822
Chris Forbes2682b242015-11-24 11:13:14 +13008823TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
8824{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008825 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13008826
8827 ASSERT_NO_FATAL_FAILURE(InitState());
8828 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8829
8830 VkVertexInputBindingDescription input_binding;
8831 memset(&input_binding, 0, sizeof(input_binding));
8832
8833 VkVertexInputAttributeDescription input_attribs[2];
8834 memset(input_attribs, 0, sizeof(input_attribs));
8835
8836 for (int i = 0; i < 2; i++) {
8837 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
8838 input_attribs[i].location = i;
8839 }
8840
8841 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008842 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008843 "\n"
8844 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07008845 "out gl_PerVertex {\n"
8846 " vec4 gl_Position;\n"
8847 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008848 "void main(){\n"
8849 " gl_Position = x[0] + x[1];\n"
8850 "}\n";
8851 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008852 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13008853 "\n"
8854 "layout(location=0) out vec4 color;\n"
8855 "void main(){\n"
8856 " color = vec4(1);\n"
8857 "}\n";
8858
8859 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8860 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8861
8862 VkPipelineObj pipe(m_device);
8863 pipe.AddColorAttachment();
8864 pipe.AddShader(&vs);
8865 pipe.AddShader(&fs);
8866
8867 pipe.AddVertexInputBindings(&input_binding, 1);
8868 pipe.AddVertexInputAttribs(input_attribs, 2);
8869
8870 VkDescriptorSetObj descriptorSet(m_device);
8871 descriptorSet.AppendDummy();
8872 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8873
8874 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8875
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008876 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13008877}
Chris Forbes2682b242015-11-24 11:13:14 +13008878
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008879TEST_F(VkLayerTest, CreatePipelineSimplePositive)
8880{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008881 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008882
8883 ASSERT_NO_FATAL_FAILURE(InitState());
8884 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8885
8886 char const *vsSource =
8887 "#version 450\n"
8888 "out gl_PerVertex {\n"
8889 " vec4 gl_Position;\n"
8890 "};\n"
8891 "void main(){\n"
8892 " gl_Position = vec4(0);\n"
8893 "}\n";
8894 char const *fsSource =
8895 "#version 450\n"
8896 "\n"
8897 "layout(location=0) out vec4 color;\n"
8898 "void main(){\n"
8899 " color = vec4(1);\n"
8900 "}\n";
8901
8902 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8903 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8904
8905 VkPipelineObj pipe(m_device);
8906 pipe.AddColorAttachment();
8907 pipe.AddShader(&vs);
8908 pipe.AddShader(&fs);
8909
8910 VkDescriptorSetObj descriptorSet(m_device);
8911 descriptorSet.AppendDummy();
8912 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8913
8914 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8915
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008916 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008917}
8918
Chris Forbes912c9192016-04-05 17:50:35 +12008919TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
8920{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008921 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12008922
8923 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
8924
8925 ASSERT_NO_FATAL_FAILURE(InitState());
8926 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8927
8928 char const *vsSource =
8929 "#version 450\n"
8930 "out gl_PerVertex {\n"
8931 " vec4 gl_Position;\n"
8932 "};\n"
8933 "layout(location=0) out vec3 x;\n"
8934 "layout(location=1) out ivec3 y;\n"
8935 "layout(location=2) out vec3 z;\n"
8936 "void main(){\n"
8937 " gl_Position = vec4(0);\n"
8938 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
8939 "}\n";
8940 char const *fsSource =
8941 "#version 450\n"
8942 "\n"
8943 "layout(location=0) out vec4 color;\n"
8944 "layout(location=0) in float x;\n"
8945 "layout(location=1) flat in int y;\n"
8946 "layout(location=2) in vec2 z;\n"
8947 "void main(){\n"
8948 " color = vec4(1 + x + y + z.x);\n"
8949 "}\n";
8950
8951 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8952 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8953
8954 VkPipelineObj pipe(m_device);
8955 pipe.AddColorAttachment();
8956 pipe.AddShader(&vs);
8957 pipe.AddShader(&fs);
8958
8959 VkDescriptorSetObj descriptorSet(m_device);
8960 descriptorSet.AppendDummy();
8961 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8962
8963 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8964
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008965 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12008966}
8967
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008968TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
8969{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008970 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008971
8972 ASSERT_NO_FATAL_FAILURE(InitState());
8973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8974
Chris Forbesc1e852d2016-04-04 19:26:42 +12008975 if (!m_device->phy().features().tessellationShader) {
8976 printf("Device does not support tessellation shaders; skipped.\n");
8977 return;
8978 }
8979
Chris Forbes4ea14fc2016-04-04 18:52:54 +12008980 char const *vsSource =
8981 "#version 450\n"
8982 "void main(){}\n";
8983 char const *tcsSource =
8984 "#version 450\n"
8985 "layout(location=0) out int x[];\n"
8986 "layout(vertices=3) out;\n"
8987 "void main(){\n"
8988 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
8989 " gl_TessLevelInner[0] = 1;\n"
8990 " x[gl_InvocationID] = gl_InvocationID;\n"
8991 "}\n";
8992 char const *tesSource =
8993 "#version 450\n"
8994 "layout(triangles, equal_spacing, cw) in;\n"
8995 "layout(location=0) in int x[];\n"
8996 "out gl_PerVertex { vec4 gl_Position; };\n"
8997 "void main(){\n"
8998 " gl_Position.xyz = gl_TessCoord;\n"
8999 " gl_Position.w = x[0] + x[1] + x[2];\n"
9000 "}\n";
9001 char const *fsSource =
9002 "#version 450\n"
9003 "layout(location=0) out vec4 color;\n"
9004 "void main(){\n"
9005 " color = vec4(1);\n"
9006 "}\n";
9007
9008 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9009 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
9010 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
9011 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9012
9013 VkPipelineInputAssemblyStateCreateInfo iasci{
9014 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
9015 nullptr,
9016 0,
9017 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
9018 VK_FALSE};
9019
Chris Forbesb4cacb62016-04-04 19:15:00 +12009020 VkPipelineTessellationStateCreateInfo tsci{
9021 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
9022 nullptr,
9023 0,
9024 3};
9025
Chris Forbes4ea14fc2016-04-04 18:52:54 +12009026 VkPipelineObj pipe(m_device);
9027 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12009028 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12009029 pipe.AddColorAttachment();
9030 pipe.AddShader(&vs);
9031 pipe.AddShader(&tcs);
9032 pipe.AddShader(&tes);
9033 pipe.AddShader(&fs);
9034
9035 VkDescriptorSetObj descriptorSet(m_device);
9036 descriptorSet.AppendDummy();
9037 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
9038
9039 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
9040
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009041 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12009042}
9043
Chris Forbesa0ab8152016-04-20 13:34:27 +12009044TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
9045{
9046 m_errorMonitor->ExpectSuccess();
9047
9048 ASSERT_NO_FATAL_FAILURE(InitState());
9049 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9050
9051 if (!m_device->phy().features().geometryShader) {
9052 printf("Device does not support geometry shaders; skipped.\n");
9053 return;
9054 }
9055
9056 char const *vsSource =
9057 "#version 450\n"
9058 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
9059 "void main(){\n"
9060 " vs_out.x = vec4(1);\n"
9061 "}\n";
9062 char const *gsSource =
9063 "#version 450\n"
9064 "layout(triangles) in;\n"
9065 "layout(triangle_strip, max_vertices=3) out;\n"
9066 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
9067 "out gl_PerVertex { vec4 gl_Position; };\n"
9068 "void main() {\n"
9069 " gl_Position = gs_in[0].x;\n"
9070 " EmitVertex();\n"
9071 "}\n";
9072 char const *fsSource =
9073 "#version 450\n"
9074 "layout(location=0) out vec4 color;\n"
9075 "void main(){\n"
9076 " color = vec4(1);\n"
9077 "}\n";
9078
9079 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9080 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
9081 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9082
9083 VkPipelineObj pipe(m_device);
9084 pipe.AddColorAttachment();
9085 pipe.AddShader(&vs);
9086 pipe.AddShader(&gs);
9087 pipe.AddShader(&fs);
9088
9089 VkDescriptorSetObj descriptorSet(m_device);
9090 descriptorSet.AppendDummy();
9091 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
9092
9093 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
9094
9095 m_errorMonitor->VerifyNotFound();
9096}
9097
Chris Forbesa0193bc2016-04-04 19:19:47 +12009098TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
9099{
9100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9101 "is per-vertex in tessellation control shader stage "
9102 "but per-patch in tessellation evaluation shader stage");
9103
9104 ASSERT_NO_FATAL_FAILURE(InitState());
9105 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9106
Chris Forbesc1e852d2016-04-04 19:26:42 +12009107 if (!m_device->phy().features().tessellationShader) {
9108 printf("Device does not support tessellation shaders; skipped.\n");
9109 return;
9110 }
9111
Chris Forbesa0193bc2016-04-04 19:19:47 +12009112 char const *vsSource =
9113 "#version 450\n"
9114 "void main(){}\n";
9115 char const *tcsSource =
9116 "#version 450\n"
9117 "layout(location=0) out int x[];\n"
9118 "layout(vertices=3) out;\n"
9119 "void main(){\n"
9120 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
9121 " gl_TessLevelInner[0] = 1;\n"
9122 " x[gl_InvocationID] = gl_InvocationID;\n"
9123 "}\n";
9124 char const *tesSource =
9125 "#version 450\n"
9126 "layout(triangles, equal_spacing, cw) in;\n"
9127 "layout(location=0) patch in int x;\n"
9128 "out gl_PerVertex { vec4 gl_Position; };\n"
9129 "void main(){\n"
9130 " gl_Position.xyz = gl_TessCoord;\n"
9131 " gl_Position.w = x;\n"
9132 "}\n";
9133 char const *fsSource =
9134 "#version 450\n"
9135 "layout(location=0) out vec4 color;\n"
9136 "void main(){\n"
9137 " color = vec4(1);\n"
9138 "}\n";
9139
9140 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9141 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
9142 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
9143 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9144
9145 VkPipelineInputAssemblyStateCreateInfo iasci{
9146 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
9147 nullptr,
9148 0,
9149 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
9150 VK_FALSE};
9151
9152 VkPipelineTessellationStateCreateInfo tsci{
9153 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
9154 nullptr,
9155 0,
9156 3};
9157
9158 VkPipelineObj pipe(m_device);
9159 pipe.SetInputAssembly(&iasci);
9160 pipe.SetTessellation(&tsci);
9161 pipe.AddColorAttachment();
9162 pipe.AddShader(&vs);
9163 pipe.AddShader(&tcs);
9164 pipe.AddShader(&tes);
9165 pipe.AddShader(&fs);
9166
9167 VkDescriptorSetObj descriptorSet(m_device);
9168 descriptorSet.AppendDummy();
9169 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
9170
9171 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
9172
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009173 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12009174}
9175
Karl Schultz6addd812016-02-02 17:17:23 -07009176TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
9177 m_errorMonitor->SetDesiredFailureMsg(
9178 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009179 "Duplicate vertex input binding descriptions for binding 0");
9180
Chris Forbes280ba2c2015-06-12 11:16:41 +12009181 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06009182 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12009183
9184 /* Two binding descriptions for binding 0 */
9185 VkVertexInputBindingDescription input_bindings[2];
9186 memset(input_bindings, 0, sizeof(input_bindings));
9187
9188 VkVertexInputAttributeDescription input_attrib;
9189 memset(&input_attrib, 0, sizeof(input_attrib));
9190 input_attrib.format = VK_FORMAT_R32_SFLOAT;
9191
9192 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009193 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12009194 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07009195 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07009196 "out gl_PerVertex {\n"
9197 " vec4 gl_Position;\n"
9198 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12009199 "void main(){\n"
9200 " gl_Position = vec4(x);\n"
9201 "}\n";
9202 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009203 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12009204 "\n"
9205 "layout(location=0) out vec4 color;\n"
9206 "void main(){\n"
9207 " color = vec4(1);\n"
9208 "}\n";
9209
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009210 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9211 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12009212
9213 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08009214 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12009215 pipe.AddShader(&vs);
9216 pipe.AddShader(&fs);
9217
9218 pipe.AddVertexInputBindings(input_bindings, 2);
9219 pipe.AddVertexInputAttribs(&input_attrib, 1);
9220
Chris Forbes280ba2c2015-06-12 11:16:41 +12009221 VkDescriptorSetObj descriptorSet(m_device);
9222 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009223 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12009224
Tony Barbour5781e8f2015-08-04 16:23:11 -06009225 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12009226
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009227 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12009228}
Chris Forbes8f68b562015-05-25 11:13:32 +12009229
Chris Forbes35efec72016-04-21 14:32:08 +12009230TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
9231 m_errorMonitor->ExpectSuccess();
9232
9233 ASSERT_NO_FATAL_FAILURE(InitState());
9234 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9235
9236 if (!m_device->phy().features().tessellationShader) {
9237 printf("Device does not support 64bit vertex attributes; skipped.\n");
9238 return;
9239 }
9240
9241 VkVertexInputBindingDescription input_bindings[1];
9242 memset(input_bindings, 0, sizeof(input_bindings));
9243
9244 VkVertexInputAttributeDescription input_attribs[4];
9245 memset(input_attribs, 0, sizeof(input_attribs));
9246 input_attribs[0].location = 0;
9247 input_attribs[0].offset = 0;
9248 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
9249 input_attribs[1].location = 2;
9250 input_attribs[1].offset = 32;
9251 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
9252 input_attribs[2].location = 4;
9253 input_attribs[2].offset = 64;
9254 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
9255 input_attribs[3].location = 6;
9256 input_attribs[3].offset = 96;
9257 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
9258
9259 char const *vsSource =
9260 "#version 450\n"
9261 "\n"
9262 "layout(location=0) in dmat4 x;\n"
9263 "out gl_PerVertex {\n"
9264 " vec4 gl_Position;\n"
9265 "};\n"
9266 "void main(){\n"
9267 " gl_Position = vec4(x[0][0]);\n"
9268 "}\n";
9269 char const *fsSource =
9270 "#version 450\n"
9271 "\n"
9272 "layout(location=0) out vec4 color;\n"
9273 "void main(){\n"
9274 " color = vec4(1);\n"
9275 "}\n";
9276
9277 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9278 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9279
9280 VkPipelineObj pipe(m_device);
9281 pipe.AddColorAttachment();
9282 pipe.AddShader(&vs);
9283 pipe.AddShader(&fs);
9284
9285 pipe.AddVertexInputBindings(input_bindings, 1);
9286 pipe.AddVertexInputAttribs(input_attribs, 4);
9287
9288 VkDescriptorSetObj descriptorSet(m_device);
9289 descriptorSet.AppendDummy();
9290 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
9291
9292 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
9293
9294 m_errorMonitor->VerifyNotFound();
9295}
9296
Karl Schultz6addd812016-02-02 17:17:23 -07009297TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009299 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009300
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009301 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009302
9303 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009304 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009305 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07009306 "out gl_PerVertex {\n"
9307 " vec4 gl_Position;\n"
9308 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009309 "void main(){\n"
9310 " gl_Position = vec4(1);\n"
9311 "}\n";
9312 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009313 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009314 "\n"
9315 "void main(){\n"
9316 "}\n";
9317
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009318 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9319 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009320
9321 VkPipelineObj pipe(m_device);
9322 pipe.AddShader(&vs);
9323 pipe.AddShader(&fs);
9324
Chia-I Wu08accc62015-07-07 11:50:03 +08009325 /* set up CB 0, not written */
9326 pipe.AddColorAttachment();
9327 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009328
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009329 VkDescriptorSetObj descriptorSet(m_device);
9330 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009331 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009332
Tony Barbour5781e8f2015-08-04 16:23:11 -06009333 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009334
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009335 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12009336}
9337
Karl Schultz6addd812016-02-02 17:17:23 -07009338TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07009339 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07009340 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009341 "FS writes to output location 1 with no matching attachment");
9342
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009343 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009344
9345 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009346 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009347 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07009348 "out gl_PerVertex {\n"
9349 " vec4 gl_Position;\n"
9350 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009351 "void main(){\n"
9352 " gl_Position = vec4(1);\n"
9353 "}\n";
9354 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009355 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009356 "\n"
9357 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07009358 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009359 "void main(){\n"
9360 " x = vec4(1);\n"
9361 " y = vec4(1);\n"
9362 "}\n";
9363
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009364 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9365 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009366
9367 VkPipelineObj pipe(m_device);
9368 pipe.AddShader(&vs);
9369 pipe.AddShader(&fs);
9370
Chia-I Wu08accc62015-07-07 11:50:03 +08009371 /* set up CB 0, not written */
9372 pipe.AddColorAttachment();
9373 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009374 /* FS writes CB 1, but we don't configure it */
9375
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009376 VkDescriptorSetObj descriptorSet(m_device);
9377 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009378 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009379
Tony Barbour5781e8f2015-08-04 16:23:11 -06009380 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009381
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009382 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12009383}
9384
Karl Schultz6addd812016-02-02 17:17:23 -07009385TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009387 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009388
Chris Forbesa36d69e2015-05-25 11:13:44 +12009389 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12009390
9391 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009392 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12009393 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07009394 "out gl_PerVertex {\n"
9395 " vec4 gl_Position;\n"
9396 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12009397 "void main(){\n"
9398 " gl_Position = vec4(1);\n"
9399 "}\n";
9400 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009401 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12009402 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07009403 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12009404 "void main(){\n"
9405 " x = ivec4(1);\n"
9406 "}\n";
9407
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009408 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9409 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12009410
9411 VkPipelineObj pipe(m_device);
9412 pipe.AddShader(&vs);
9413 pipe.AddShader(&fs);
9414
Chia-I Wu08accc62015-07-07 11:50:03 +08009415 /* set up CB 0; type is UNORM by default */
9416 pipe.AddColorAttachment();
9417 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12009418
Chris Forbesa36d69e2015-05-25 11:13:44 +12009419 VkDescriptorSetObj descriptorSet(m_device);
9420 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009421 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12009422
Tony Barbour5781e8f2015-08-04 16:23:11 -06009423 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12009424
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009425 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12009426}
Chris Forbes7b1b8932015-06-05 14:43:36 +12009427
Karl Schultz6addd812016-02-02 17:17:23 -07009428TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009430 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009431
Chris Forbes556c76c2015-08-14 12:04:59 +12009432 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12009433
9434 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009435 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12009436 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07009437 "out gl_PerVertex {\n"
9438 " vec4 gl_Position;\n"
9439 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12009440 "void main(){\n"
9441 " gl_Position = vec4(1);\n"
9442 "}\n";
9443 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12009444 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12009445 "\n"
9446 "layout(location=0) out vec4 x;\n"
9447 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
9448 "void main(){\n"
9449 " x = vec4(bar.y);\n"
9450 "}\n";
9451
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009452 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9453 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12009454
Chris Forbes556c76c2015-08-14 12:04:59 +12009455 VkPipelineObj pipe(m_device);
9456 pipe.AddShader(&vs);
9457 pipe.AddShader(&fs);
9458
9459 /* set up CB 0; type is UNORM by default */
9460 pipe.AddColorAttachment();
9461 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9462
9463 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009464 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12009465
9466 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
9467
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009468 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12009469}
9470
Chris Forbes5c59e902016-02-26 16:56:09 +13009471TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
9472 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9473 "not declared in layout");
9474
9475 ASSERT_NO_FATAL_FAILURE(InitState());
9476
9477 char const *vsSource =
9478 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13009479 "\n"
9480 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
9481 "out gl_PerVertex {\n"
9482 " vec4 gl_Position;\n"
9483 "};\n"
9484 "void main(){\n"
9485 " gl_Position = vec4(consts.x);\n"
9486 "}\n";
9487 char const *fsSource =
9488 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13009489 "\n"
9490 "layout(location=0) out vec4 x;\n"
9491 "void main(){\n"
9492 " x = vec4(1);\n"
9493 "}\n";
9494
9495 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9496 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9497
9498 VkPipelineObj pipe(m_device);
9499 pipe.AddShader(&vs);
9500 pipe.AddShader(&fs);
9501
9502 /* set up CB 0; type is UNORM by default */
9503 pipe.AddColorAttachment();
9504 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9505
9506 VkDescriptorSetObj descriptorSet(m_device);
9507 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
9508
9509 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
9510
9511 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009512 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13009513}
9514
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009515#endif // SHADER_CHECKER_TESTS
9516
9517#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06009518TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07009519 m_errorMonitor->SetDesiredFailureMsg(
9520 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009521 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009522
9523 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009524
9525 // Create an image
9526 VkImage image;
9527
Karl Schultz6addd812016-02-02 17:17:23 -07009528 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9529 const int32_t tex_width = 32;
9530 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009531
9532 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009533 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9534 image_create_info.pNext = NULL;
9535 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9536 image_create_info.format = tex_format;
9537 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009538 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07009539 image_create_info.extent.depth = 1;
9540 image_create_info.mipLevels = 1;
9541 image_create_info.arrayLayers = 1;
9542 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9543 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9544 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9545 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009546
9547 // Introduce error by sending down a bogus width extent
9548 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009549 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009550
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009551 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06009552}
9553
Mark Youngc48c4c12016-04-11 14:26:49 -06009554TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
9555 m_errorMonitor->SetDesiredFailureMsg(
9556 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9557 "CreateImage extents is 0 for at least one required dimension");
9558
9559 ASSERT_NO_FATAL_FAILURE(InitState());
9560
9561 // Create an image
9562 VkImage image;
9563
9564 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9565 const int32_t tex_width = 32;
9566 const int32_t tex_height = 32;
9567
9568 VkImageCreateInfo image_create_info = {};
9569 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9570 image_create_info.pNext = NULL;
9571 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9572 image_create_info.format = tex_format;
9573 image_create_info.extent.width = tex_width;
9574 image_create_info.extent.height = tex_height;
9575 image_create_info.extent.depth = 1;
9576 image_create_info.mipLevels = 1;
9577 image_create_info.arrayLayers = 1;
9578 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9579 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9580 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9581 image_create_info.flags = 0;
9582
9583 // Introduce error by sending down a bogus width extent
9584 image_create_info.extent.width = 0;
9585 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
9586
9587 m_errorMonitor->VerifyFound();
9588}
9589
Karl Schultz6addd812016-02-02 17:17:23 -07009590TEST_F(VkLayerTest, UpdateBufferAlignment) {
9591 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06009592
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009594 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009595
Mike Stroyana3082432015-09-25 13:39:21 -06009596 ASSERT_NO_FATAL_FAILURE(InitState());
9597
9598 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9599 vk_testing::Buffer buffer;
9600 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
9601
9602 BeginCommandBuffer();
9603 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009604 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009605 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009606
Mike Stroyana3082432015-09-25 13:39:21 -06009607 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009609 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009610
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009611 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009612 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009613 EndCommandBuffer();
9614}
9615
Karl Schultz6addd812016-02-02 17:17:23 -07009616TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009618 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06009619
9620 ASSERT_NO_FATAL_FAILURE(InitState());
9621
9622 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9623 vk_testing::Buffer buffer;
9624 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
9625
9626 BeginCommandBuffer();
9627 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009628 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009629 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009630
Mike Stroyana3082432015-09-25 13:39:21 -06009631 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009633 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009634
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009635 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009636
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009637 m_errorMonitor->VerifyFound();
9638
Mike Stroyana3082432015-09-25 13:39:21 -06009639 EndCommandBuffer();
9640}
9641
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009642#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12009643
Tobin Ehliscde08892015-09-22 10:11:37 -06009644#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07009645TEST_F(VkLayerTest, InvalidImageView) {
9646 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06009647
Karl Schultz6addd812016-02-02 17:17:23 -07009648 m_errorMonitor->SetDesiredFailureMsg(
9649 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009650 "vkCreateImageView called with baseMipLevel 10 ");
9651
Tobin Ehliscde08892015-09-22 10:11:37 -06009652 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06009653
Mike Stroyana3082432015-09-25 13:39:21 -06009654 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07009655 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06009656
Karl Schultz6addd812016-02-02 17:17:23 -07009657 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9658 const int32_t tex_width = 32;
9659 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06009660
9661 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009662 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9663 image_create_info.pNext = NULL;
9664 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9665 image_create_info.format = tex_format;
9666 image_create_info.extent.width = tex_width;
9667 image_create_info.extent.height = tex_height;
9668 image_create_info.extent.depth = 1;
9669 image_create_info.mipLevels = 1;
9670 image_create_info.arrayLayers = 1;
9671 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9672 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9673 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9674 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06009675
Chia-I Wuf7458c52015-10-26 21:10:41 +08009676 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06009677 ASSERT_VK_SUCCESS(err);
9678
9679 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009680 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9681 image_view_create_info.image = image;
9682 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
9683 image_view_create_info.format = tex_format;
9684 image_view_create_info.subresourceRange.layerCount = 1;
9685 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
9686 image_view_create_info.subresourceRange.levelCount = 1;
9687 image_view_create_info.subresourceRange.aspectMask =
9688 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06009689
9690 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07009691 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
9692 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06009693
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009694 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06009695}
Mike Stroyana3082432015-09-25 13:39:21 -06009696
Karl Schultz6addd812016-02-02 17:17:23 -07009697TEST_F(VkLayerTest, InvalidImageViewAspect) {
9698 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009699
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009700 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009701 "vkCreateImageView: Color image "
9702 "formats must have ONLY the "
9703 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009704
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009705 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009706
9707 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07009708 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009709
Karl Schultz6addd812016-02-02 17:17:23 -07009710 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9711 const int32_t tex_width = 32;
9712 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009713
9714 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009715 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9716 image_create_info.pNext = NULL;
9717 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9718 image_create_info.format = tex_format;
9719 image_create_info.extent.width = tex_width;
9720 image_create_info.extent.height = tex_height;
9721 image_create_info.extent.depth = 1;
9722 image_create_info.mipLevels = 1;
9723 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9724 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9725 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9726 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009727
Chia-I Wuf7458c52015-10-26 21:10:41 +08009728 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009729 ASSERT_VK_SUCCESS(err);
9730
9731 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009732 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9733 image_view_create_info.image = image;
9734 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
9735 image_view_create_info.format = tex_format;
9736 image_view_create_info.subresourceRange.baseMipLevel = 0;
9737 image_view_create_info.subresourceRange.levelCount = 1;
9738 // Cause an error by setting an invalid image aspect
9739 image_view_create_info.subresourceRange.aspectMask =
9740 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009741
9742 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07009743 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
9744 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009745
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009746 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06009747}
9748
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009749TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07009750 VkResult err;
9751 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009752
Karl Schultz6addd812016-02-02 17:17:23 -07009753 m_errorMonitor->SetDesiredFailureMsg(
9754 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009755 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009756
Mike Stroyana3082432015-09-25 13:39:21 -06009757 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009758
9759 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009760 VkImage srcImage;
9761 VkImage dstImage;
9762 VkDeviceMemory srcMem;
9763 VkDeviceMemory destMem;
9764 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009765
9766 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009767 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9768 image_create_info.pNext = NULL;
9769 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9770 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9771 image_create_info.extent.width = 32;
9772 image_create_info.extent.height = 32;
9773 image_create_info.extent.depth = 1;
9774 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009775 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07009776 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9777 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9778 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9779 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009780
Karl Schultz6addd812016-02-02 17:17:23 -07009781 err =
9782 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009783 ASSERT_VK_SUCCESS(err);
9784
Karl Schultz6addd812016-02-02 17:17:23 -07009785 err =
9786 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009787 ASSERT_VK_SUCCESS(err);
9788
9789 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009790 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009791 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9792 memAlloc.pNext = NULL;
9793 memAlloc.allocationSize = 0;
9794 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009795
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009796 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009797 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009798 pass =
9799 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009800 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009801 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009802 ASSERT_VK_SUCCESS(err);
9803
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009804 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009805 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009806 pass =
9807 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009808 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009809 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009810 ASSERT_VK_SUCCESS(err);
9811
9812 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9813 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009814 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009815 ASSERT_VK_SUCCESS(err);
9816
9817 BeginCommandBuffer();
9818 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009819 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009820 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009821 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009822 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06009823 copyRegion.srcOffset.x = 0;
9824 copyRegion.srcOffset.y = 0;
9825 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009826 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009827 copyRegion.dstSubresource.mipLevel = 0;
9828 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06009829 // Introduce failure by forcing the dst layerCount to differ from src
9830 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009831 copyRegion.dstOffset.x = 0;
9832 copyRegion.dstOffset.y = 0;
9833 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009834 copyRegion.extent.width = 1;
9835 copyRegion.extent.height = 1;
9836 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009837 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9838 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009839 EndCommandBuffer();
9840
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009841 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009842
Chia-I Wuf7458c52015-10-26 21:10:41 +08009843 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009844 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009845 vkFreeMemory(m_device->device(), srcMem, NULL);
9846 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009847}
9848
Tony Barbourd6673642016-05-05 14:46:39 -06009849TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
9850
9851 TEST_DESCRIPTION("Creating images with unsuported formats ");
9852
9853 ASSERT_NO_FATAL_FAILURE(InitState());
9854 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9855 VkImageObj image(m_device);
9856 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9857 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
9858 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
9859 VK_IMAGE_TILING_OPTIMAL, 0);
9860 ASSERT_TRUE(image.initialized());
9861
9862 VkFormat unsupported = VK_FORMAT_UNDEFINED;
9863 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9864 VkFormat format = static_cast<VkFormat>(f);
9865 VkFormatProperties fProps = m_device->format_properties(format);
9866 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
9867 fProps.optimalTilingFeatures == 0) {
9868 unsupported = format;
9869 break;
9870 }
9871 }
9872 if (unsupported != VK_FORMAT_UNDEFINED) {
9873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9874 "vkCreateImage parameter, "
9875 "VkFormat pCreateInfo->format, "
9876 "contains unsupported format");
9877 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
9878 VkImageCreateInfo image_create_info;
9879 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9880 image_create_info.pNext = NULL;
9881 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9882 image_create_info.format = unsupported;
9883 image_create_info.extent.width = 32;
9884 image_create_info.extent.height = 32;
9885 image_create_info.extent.depth = 1;
9886 image_create_info.mipLevels = 1;
9887 image_create_info.arrayLayers = 1;
9888 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9889 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9890 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9891 image_create_info.flags = 0;
9892
9893 VkImage localImage;
9894 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
9895 m_errorMonitor->VerifyFound();
9896
9897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9898 "vkCreateRenderPass parameter, "
9899 "VkFormat in "
9900 "pCreateInfo->pAttachments");
9901 // Create renderpass with unsupported format - Expect FORMAT_UNSUPPORTED
9902 VkAttachmentDescription att;
9903 att.format = unsupported;
9904 att.samples = VK_SAMPLE_COUNT_1_BIT;
9905 att.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
9906 att.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
9907 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
9908 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
9909 att.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9910 att.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9911
9912 VkRenderPassCreateInfo rp_info = {};
9913 VkRenderPass rp;
9914 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9915 rp_info.attachmentCount = 1;
9916 rp_info.pAttachments = &att;
9917 rp_info.subpassCount = 0;
9918 rp_info.pSubpasses = NULL;
9919 vkCreateRenderPass(m_device->handle(), &rp_info, NULL, &rp);
9920 m_errorMonitor->VerifyFound();
9921 }
9922}
9923
9924TEST_F(VkLayerTest, ImageLayerViewTests) {
9925 VkResult ret;
9926 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
9927
9928 ASSERT_NO_FATAL_FAILURE(InitState());
9929
9930 VkImageObj image(m_device);
9931 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9932 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
9933 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
9934 VK_IMAGE_TILING_OPTIMAL, 0);
9935 ASSERT_TRUE(image.initialized());
9936
9937 VkImageView imgView;
9938 VkImageViewCreateInfo imgViewInfo = {};
9939 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9940 imgViewInfo.image = image.handle();
9941 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
9942 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9943 imgViewInfo.subresourceRange.layerCount = 1;
9944 imgViewInfo.subresourceRange.baseMipLevel = 0;
9945 imgViewInfo.subresourceRange.levelCount = 1;
9946 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9947
9948 m_errorMonitor->SetDesiredFailureMsg(
9949 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9950 "vkCreateImageView called with baseMipLevel");
9951 // View can't have baseMipLevel >= image's mipLevels - Expect
9952 // VIEW_CREATE_ERROR
9953 imgViewInfo.subresourceRange.baseMipLevel = 1;
9954 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9955 m_errorMonitor->VerifyFound();
9956 imgViewInfo.subresourceRange.baseMipLevel = 0;
9957
9958 m_errorMonitor->SetDesiredFailureMsg(
9959 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9960 "vkCreateImageView called with baseArrayLayer");
9961 // View can't have baseArrayLayer >= image's arraySize - Expect
9962 // VIEW_CREATE_ERROR
9963 imgViewInfo.subresourceRange.baseArrayLayer = 1;
9964 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9965 m_errorMonitor->VerifyFound();
9966 imgViewInfo.subresourceRange.baseArrayLayer = 0;
9967
9968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9969 "vkCreateImageView called with 0 in "
9970 "pCreateInfo->subresourceRange."
9971 "levelCount");
9972 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
9973 imgViewInfo.subresourceRange.levelCount = 0;
9974 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9975 m_errorMonitor->VerifyFound();
9976 imgViewInfo.subresourceRange.levelCount = 1;
9977
9978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9979 "vkCreateImageView called with 0 in "
9980 "pCreateInfo->subresourceRange."
9981 "layerCount");
9982 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
9983 imgViewInfo.subresourceRange.layerCount = 0;
9984 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9985 m_errorMonitor->VerifyFound();
9986 imgViewInfo.subresourceRange.layerCount = 1;
9987
9988 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9989 "but both must be color formats");
9990 // Can't use depth format for view into color image - Expect INVALID_FORMAT
9991 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
9992 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
9993 m_errorMonitor->VerifyFound();
9994 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
9995
9996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9997 "Formats MUST be IDENTICAL unless "
9998 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
9999 "was set on image creation.");
10000 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
10001 // VIEW_CREATE_ERROR
10002 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
10003 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
10004 m_errorMonitor->VerifyFound();
10005 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
10006
10007 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10008 "can support ImageViews with "
10009 "differing formats but they must be "
10010 "in the same compatibility class.");
10011 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
10012 // VIEW_CREATE_ERROR
10013 VkImageCreateInfo mutImgInfo = image.create_info();
10014 VkImage mutImage;
10015 mutImgInfo.format = VK_FORMAT_R8_UINT;
10016 assert(
10017 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
10018 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
10019 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
10020 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10021 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
10022 ASSERT_VK_SUCCESS(ret);
10023 imgViewInfo.image = mutImage;
10024 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
10025 m_errorMonitor->VerifyFound();
10026 imgViewInfo.image = image.handle();
10027 vkDestroyImage(m_device->handle(), mutImage, NULL);
10028}
10029
10030TEST_F(VkLayerTest, MiscImageLayerTests) {
10031
10032 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
10033
10034 ASSERT_NO_FATAL_FAILURE(InitState());
10035
10036 VkImageObj image(m_device);
10037 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
10038 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
10039 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
10040 VK_IMAGE_TILING_OPTIMAL, 0);
10041 ASSERT_TRUE(image.initialized());
10042
10043 m_errorMonitor->SetDesiredFailureMsg(
10044 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10045 "number of layers in image subresource is zero");
10046 vk_testing::Buffer buffer;
10047 VkMemoryPropertyFlags reqs = 0;
10048 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
10049 VkBufferImageCopy region = {};
10050 region.bufferRowLength = 128;
10051 region.bufferImageHeight = 128;
10052 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10053 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
10054 region.imageSubresource.layerCount = 0;
10055 region.imageExtent.height = 4;
10056 region.imageExtent.width = 4;
10057 region.imageExtent.depth = 1;
10058 m_commandBuffer->BeginCommandBuffer();
10059 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
10060 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
10061 1, &region);
10062 m_errorMonitor->VerifyFound();
10063 region.imageSubresource.layerCount = 1;
10064
10065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10066 "aspectMasks for each region must "
10067 "specify only COLOR or DEPTH or "
10068 "STENCIL");
10069 // Expect MISMATCHED_IMAGE_ASPECT
10070 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
10071 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
10072 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
10073 1, &region);
10074 m_errorMonitor->VerifyFound();
10075 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10076
10077 m_errorMonitor->SetDesiredFailureMsg(
10078 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10079 "If the format of srcImage is a depth, stencil, depth stencil or "
10080 "integer-based format then filter must be VK_FILTER_NEAREST");
10081 // Expect INVALID_FILTER
10082 VkImageObj intImage1(m_device);
10083 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
10084 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10085 0);
10086 VkImageObj intImage2(m_device);
10087 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
10088 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10089 0);
10090 VkImageBlit blitRegion = {};
10091 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10092 blitRegion.srcSubresource.baseArrayLayer = 0;
10093 blitRegion.srcSubresource.layerCount = 1;
10094 blitRegion.srcSubresource.mipLevel = 0;
10095 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10096 blitRegion.dstSubresource.baseArrayLayer = 0;
10097 blitRegion.dstSubresource.layerCount = 1;
10098 blitRegion.dstSubresource.mipLevel = 0;
10099
10100 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
10101 intImage1.layout(), intImage2.handle(), intImage2.layout(),
10102 16, &blitRegion, VK_FILTER_LINEAR);
10103 m_errorMonitor->VerifyFound();
10104
10105 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10106 "called with 0 in ppMemoryBarriers");
10107 VkImageMemoryBarrier img_barrier;
10108 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10109 img_barrier.pNext = NULL;
10110 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10111 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10112 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10113 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10114 img_barrier.image = image.handle();
10115 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10116 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10117 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10118 img_barrier.subresourceRange.baseArrayLayer = 0;
10119 img_barrier.subresourceRange.baseMipLevel = 0;
10120 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
10121 img_barrier.subresourceRange.layerCount = 0;
10122 img_barrier.subresourceRange.levelCount = 1;
10123 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
10124 VK_PIPELINE_STAGE_HOST_BIT,
10125 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
10126 nullptr, 1, &img_barrier);
10127 m_errorMonitor->VerifyFound();
10128 img_barrier.subresourceRange.layerCount = 1;
10129}
10130
10131TEST_F(VkLayerTest, ImageFormatLimits) {
10132
10133 TEST_DESCRIPTION("Exceed the limits of image format ");
10134
10135 m_errorMonitor->SetDesiredFailureMsg(
10136 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10137 "CreateImage extents exceed allowable limits for format");
10138 VkImageCreateInfo image_create_info = {};
10139 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10140 image_create_info.pNext = NULL;
10141 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10142 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10143 image_create_info.extent.width = 32;
10144 image_create_info.extent.height = 32;
10145 image_create_info.extent.depth = 1;
10146 image_create_info.mipLevels = 1;
10147 image_create_info.arrayLayers = 1;
10148 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10149 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
10150 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10151 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
10152 image_create_info.flags = 0;
10153
10154 VkImage nullImg;
10155 VkImageFormatProperties imgFmtProps;
10156 vkGetPhysicalDeviceImageFormatProperties(
10157 gpu(), image_create_info.format, image_create_info.imageType,
10158 image_create_info.tiling, image_create_info.usage,
10159 image_create_info.flags, &imgFmtProps);
10160 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
10161 // Expect INVALID_FORMAT_LIMITS_VIOLATION
10162 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
10163 m_errorMonitor->VerifyFound();
10164 image_create_info.extent.depth = 1;
10165
10166 m_errorMonitor->SetDesiredFailureMsg(
10167 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10168 "exceeds allowable maximum supported by format of");
10169 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
10170 // Expect INVALID_FORMAT_LIMITS_VIOLATION
10171 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
10172 m_errorMonitor->VerifyFound();
10173 image_create_info.mipLevels = 1;
10174
10175 m_errorMonitor->SetDesiredFailureMsg(
10176 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10177 "exceeds allowable maximum supported by format of");
10178 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
10179 // Expect INVALID_FORMAT_LIMITS_VIOLATION
10180 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
10181 m_errorMonitor->VerifyFound();
10182 image_create_info.arrayLayers = 1;
10183
10184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10185 "is not supported by format");
10186 int samples = imgFmtProps.sampleCounts >> 1;
10187 image_create_info.samples = (VkSampleCountFlagBits)samples;
10188 // Expect INVALID_FORMAT_LIMITS_VIOLATION
10189 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
10190 m_errorMonitor->VerifyFound();
10191 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10192
10193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10194 "pCreateInfo->initialLayout, must be "
10195 "VK_IMAGE_LAYOUT_UNDEFINED or "
10196 "VK_IMAGE_LAYOUT_PREINITIALIZED");
10197 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10198 // Expect INVALID_LAYOUT
10199 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
10200 m_errorMonitor->VerifyFound();
10201 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
10202}
10203
Karl Schultz6addd812016-02-02 17:17:23 -070010204TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060010205 VkResult err;
10206 bool pass;
10207
10208 // Create color images with different format sizes and try to copy between them
10209 m_errorMonitor->SetDesiredFailureMsg(
10210 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10211 "vkCmdCopyImage called with unmatched source and dest image format sizes");
10212
10213 ASSERT_NO_FATAL_FAILURE(InitState());
10214
10215 // Create two images of different types and try to copy between them
10216 VkImage srcImage;
10217 VkImage dstImage;
10218 VkDeviceMemory srcMem;
10219 VkDeviceMemory destMem;
10220 VkMemoryRequirements memReqs;
10221
10222 VkImageCreateInfo image_create_info = {};
10223 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10224 image_create_info.pNext = NULL;
10225 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10226 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10227 image_create_info.extent.width = 32;
10228 image_create_info.extent.height = 32;
10229 image_create_info.extent.depth = 1;
10230 image_create_info.mipLevels = 1;
10231 image_create_info.arrayLayers = 1;
10232 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10233 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
10234 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10235 image_create_info.flags = 0;
10236
10237 err =
10238 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
10239 ASSERT_VK_SUCCESS(err);
10240
10241 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
10242 // Introduce failure by creating second image with a different-sized format.
10243 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
10244
10245 err =
10246 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
10247 ASSERT_VK_SUCCESS(err);
10248
10249 // Allocate memory
10250 VkMemoryAllocateInfo memAlloc = {};
10251 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10252 memAlloc.pNext = NULL;
10253 memAlloc.allocationSize = 0;
10254 memAlloc.memoryTypeIndex = 0;
10255
10256 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
10257 memAlloc.allocationSize = memReqs.size;
10258 pass =
10259 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
10260 ASSERT_TRUE(pass);
10261 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
10262 ASSERT_VK_SUCCESS(err);
10263
10264 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
10265 memAlloc.allocationSize = memReqs.size;
10266 pass =
10267 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
10268 ASSERT_TRUE(pass);
10269 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
10270 ASSERT_VK_SUCCESS(err);
10271
10272 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10273 ASSERT_VK_SUCCESS(err);
10274 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
10275 ASSERT_VK_SUCCESS(err);
10276
10277 BeginCommandBuffer();
10278 VkImageCopy copyRegion;
10279 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10280 copyRegion.srcSubresource.mipLevel = 0;
10281 copyRegion.srcSubresource.baseArrayLayer = 0;
10282 copyRegion.srcSubresource.layerCount = 0;
10283 copyRegion.srcOffset.x = 0;
10284 copyRegion.srcOffset.y = 0;
10285 copyRegion.srcOffset.z = 0;
10286 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10287 copyRegion.dstSubresource.mipLevel = 0;
10288 copyRegion.dstSubresource.baseArrayLayer = 0;
10289 copyRegion.dstSubresource.layerCount = 0;
10290 copyRegion.dstOffset.x = 0;
10291 copyRegion.dstOffset.y = 0;
10292 copyRegion.dstOffset.z = 0;
10293 copyRegion.extent.width = 1;
10294 copyRegion.extent.height = 1;
10295 copyRegion.extent.depth = 1;
10296 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10297 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
10298 EndCommandBuffer();
10299
10300 m_errorMonitor->VerifyFound();
10301
10302 vkDestroyImage(m_device->device(), srcImage, NULL);
10303 vkDestroyImage(m_device->device(), dstImage, NULL);
10304 vkFreeMemory(m_device->device(), srcMem, NULL);
10305 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010306}
10307
Karl Schultz6addd812016-02-02 17:17:23 -070010308TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
10309 VkResult err;
10310 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060010311
Mark Lobodzinskidb117632016-03-31 10:45:56 -060010312 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070010313 m_errorMonitor->SetDesiredFailureMsg(
10314 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060010315 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010316
Mike Stroyana3082432015-09-25 13:39:21 -060010317 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060010318
10319 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070010320 VkImage srcImage;
10321 VkImage dstImage;
10322 VkDeviceMemory srcMem;
10323 VkDeviceMemory destMem;
10324 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060010325
10326 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010327 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10328 image_create_info.pNext = NULL;
10329 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10330 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10331 image_create_info.extent.width = 32;
10332 image_create_info.extent.height = 32;
10333 image_create_info.extent.depth = 1;
10334 image_create_info.mipLevels = 1;
10335 image_create_info.arrayLayers = 1;
10336 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10337 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
10338 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10339 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010340
Karl Schultz6addd812016-02-02 17:17:23 -070010341 err =
10342 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010343 ASSERT_VK_SUCCESS(err);
10344
Karl Schultzbdb75952016-04-19 11:36:49 -060010345 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
10346
Mark Lobodzinskidb117632016-03-31 10:45:56 -060010347 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070010348 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060010349 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
10350 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010351
Karl Schultz6addd812016-02-02 17:17:23 -070010352 err =
10353 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010354 ASSERT_VK_SUCCESS(err);
10355
10356 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010357 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010358 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10359 memAlloc.pNext = NULL;
10360 memAlloc.allocationSize = 0;
10361 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010362
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060010363 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010364 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010365 pass =
10366 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010367 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010368 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010369 ASSERT_VK_SUCCESS(err);
10370
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010371 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010372 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010373 pass =
10374 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010375 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010376 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010377 ASSERT_VK_SUCCESS(err);
10378
10379 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10380 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010381 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060010382 ASSERT_VK_SUCCESS(err);
10383
10384 BeginCommandBuffer();
10385 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010386 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010387 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060010388 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010389 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010390 copyRegion.srcOffset.x = 0;
10391 copyRegion.srcOffset.y = 0;
10392 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010393 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010394 copyRegion.dstSubresource.mipLevel = 0;
10395 copyRegion.dstSubresource.baseArrayLayer = 0;
10396 copyRegion.dstSubresource.layerCount = 0;
10397 copyRegion.dstOffset.x = 0;
10398 copyRegion.dstOffset.y = 0;
10399 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010400 copyRegion.extent.width = 1;
10401 copyRegion.extent.height = 1;
10402 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070010403 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10404 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060010405 EndCommandBuffer();
10406
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010407 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060010408
Chia-I Wuf7458c52015-10-26 21:10:41 +080010409 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010410 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010411 vkFreeMemory(m_device->device(), srcMem, NULL);
10412 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010413}
10414
Karl Schultz6addd812016-02-02 17:17:23 -070010415TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
10416 VkResult err;
10417 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060010418
Karl Schultz6addd812016-02-02 17:17:23 -070010419 m_errorMonitor->SetDesiredFailureMsg(
10420 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010421 "vkCmdResolveImage called with source sample count less than 2.");
10422
Mike Stroyana3082432015-09-25 13:39:21 -060010423 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060010424
10425 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070010426 VkImage srcImage;
10427 VkImage dstImage;
10428 VkDeviceMemory srcMem;
10429 VkDeviceMemory destMem;
10430 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060010431
10432 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010433 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10434 image_create_info.pNext = NULL;
10435 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10436 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10437 image_create_info.extent.width = 32;
10438 image_create_info.extent.height = 1;
10439 image_create_info.extent.depth = 1;
10440 image_create_info.mipLevels = 1;
10441 image_create_info.arrayLayers = 1;
10442 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10443 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10444 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10445 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010446
Karl Schultz6addd812016-02-02 17:17:23 -070010447 err =
10448 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010449 ASSERT_VK_SUCCESS(err);
10450
Karl Schultz6addd812016-02-02 17:17:23 -070010451 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010452
Karl Schultz6addd812016-02-02 17:17:23 -070010453 err =
10454 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010455 ASSERT_VK_SUCCESS(err);
10456
10457 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010458 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010459 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10460 memAlloc.pNext = NULL;
10461 memAlloc.allocationSize = 0;
10462 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010463
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060010464 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010465 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010466 pass =
10467 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010468 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010469 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010470 ASSERT_VK_SUCCESS(err);
10471
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010472 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010473 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010474 pass =
10475 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010476 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010477 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010478 ASSERT_VK_SUCCESS(err);
10479
10480 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10481 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010482 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060010483 ASSERT_VK_SUCCESS(err);
10484
10485 BeginCommandBuffer();
10486 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070010487 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
10488 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060010489 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010490 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010491 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060010492 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010493 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010494 resolveRegion.srcOffset.x = 0;
10495 resolveRegion.srcOffset.y = 0;
10496 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010497 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010498 resolveRegion.dstSubresource.mipLevel = 0;
10499 resolveRegion.dstSubresource.baseArrayLayer = 0;
10500 resolveRegion.dstSubresource.layerCount = 0;
10501 resolveRegion.dstOffset.x = 0;
10502 resolveRegion.dstOffset.y = 0;
10503 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010504 resolveRegion.extent.width = 1;
10505 resolveRegion.extent.height = 1;
10506 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070010507 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10508 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060010509 EndCommandBuffer();
10510
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010511 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060010512
Chia-I Wuf7458c52015-10-26 21:10:41 +080010513 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010514 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010515 vkFreeMemory(m_device->device(), srcMem, NULL);
10516 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010517}
10518
Karl Schultz6addd812016-02-02 17:17:23 -070010519TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
10520 VkResult err;
10521 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060010522
Karl Schultz6addd812016-02-02 17:17:23 -070010523 m_errorMonitor->SetDesiredFailureMsg(
10524 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010525 "vkCmdResolveImage called with dest sample count greater than 1.");
10526
Mike Stroyana3082432015-09-25 13:39:21 -060010527 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060010528
Chris Forbesa7530692016-05-08 12:35:39 +120010529 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070010530 VkImage srcImage;
10531 VkImage dstImage;
10532 VkDeviceMemory srcMem;
10533 VkDeviceMemory destMem;
10534 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060010535
10536 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010537 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10538 image_create_info.pNext = NULL;
10539 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10540 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10541 image_create_info.extent.width = 32;
10542 image_create_info.extent.height = 1;
10543 image_create_info.extent.depth = 1;
10544 image_create_info.mipLevels = 1;
10545 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120010546 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070010547 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10548 // Note: Some implementations expect color attachment usage for any
10549 // multisample surface
10550 image_create_info.usage =
10551 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10552 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010553
Karl Schultz6addd812016-02-02 17:17:23 -070010554 err =
10555 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010556 ASSERT_VK_SUCCESS(err);
10557
Karl Schultz6addd812016-02-02 17:17:23 -070010558 // Note: Some implementations expect color attachment usage for any
10559 // multisample surface
10560 image_create_info.usage =
10561 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010562
Karl Schultz6addd812016-02-02 17:17:23 -070010563 err =
10564 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010565 ASSERT_VK_SUCCESS(err);
10566
10567 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010568 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010569 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10570 memAlloc.pNext = NULL;
10571 memAlloc.allocationSize = 0;
10572 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010573
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060010574 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010575 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010576 pass =
10577 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010578 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010579 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010580 ASSERT_VK_SUCCESS(err);
10581
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010582 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010583 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010584 pass =
10585 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010586 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010587 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010588 ASSERT_VK_SUCCESS(err);
10589
10590 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10591 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010592 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060010593 ASSERT_VK_SUCCESS(err);
10594
10595 BeginCommandBuffer();
10596 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070010597 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
10598 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060010599 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010600 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010601 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060010602 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010603 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010604 resolveRegion.srcOffset.x = 0;
10605 resolveRegion.srcOffset.y = 0;
10606 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010607 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010608 resolveRegion.dstSubresource.mipLevel = 0;
10609 resolveRegion.dstSubresource.baseArrayLayer = 0;
10610 resolveRegion.dstSubresource.layerCount = 0;
10611 resolveRegion.dstOffset.x = 0;
10612 resolveRegion.dstOffset.y = 0;
10613 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010614 resolveRegion.extent.width = 1;
10615 resolveRegion.extent.height = 1;
10616 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070010617 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10618 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060010619 EndCommandBuffer();
10620
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010621 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060010622
Chia-I Wuf7458c52015-10-26 21:10:41 +080010623 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010624 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010625 vkFreeMemory(m_device->device(), srcMem, NULL);
10626 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010627}
10628
Karl Schultz6addd812016-02-02 17:17:23 -070010629TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
10630 VkResult err;
10631 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060010632
Karl Schultz6addd812016-02-02 17:17:23 -070010633 m_errorMonitor->SetDesiredFailureMsg(
10634 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010635 "vkCmdResolveImage called with unmatched source and dest formats.");
10636
Mike Stroyana3082432015-09-25 13:39:21 -060010637 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060010638
10639 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070010640 VkImage srcImage;
10641 VkImage dstImage;
10642 VkDeviceMemory srcMem;
10643 VkDeviceMemory destMem;
10644 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060010645
10646 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010647 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10648 image_create_info.pNext = NULL;
10649 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10650 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10651 image_create_info.extent.width = 32;
10652 image_create_info.extent.height = 1;
10653 image_create_info.extent.depth = 1;
10654 image_create_info.mipLevels = 1;
10655 image_create_info.arrayLayers = 1;
10656 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
10657 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10658 // Note: Some implementations expect color attachment usage for any
10659 // multisample surface
10660 image_create_info.usage =
10661 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10662 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010663
Karl Schultz6addd812016-02-02 17:17:23 -070010664 err =
10665 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010666 ASSERT_VK_SUCCESS(err);
10667
Karl Schultz6addd812016-02-02 17:17:23 -070010668 // Set format to something other than source image
10669 image_create_info.format = VK_FORMAT_R32_SFLOAT;
10670 // Note: Some implementations expect color attachment usage for any
10671 // multisample surface
10672 image_create_info.usage =
10673 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10674 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010675
Karl Schultz6addd812016-02-02 17:17:23 -070010676 err =
10677 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010678 ASSERT_VK_SUCCESS(err);
10679
10680 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010681 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010682 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10683 memAlloc.pNext = NULL;
10684 memAlloc.allocationSize = 0;
10685 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010686
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060010687 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010688 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010689 pass =
10690 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010691 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010692 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010693 ASSERT_VK_SUCCESS(err);
10694
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010695 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010696 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010697 pass =
10698 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010699 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010700 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010701 ASSERT_VK_SUCCESS(err);
10702
10703 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10704 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010705 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060010706 ASSERT_VK_SUCCESS(err);
10707
10708 BeginCommandBuffer();
10709 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070010710 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
10711 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060010712 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010713 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010714 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060010715 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010716 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010717 resolveRegion.srcOffset.x = 0;
10718 resolveRegion.srcOffset.y = 0;
10719 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010720 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010721 resolveRegion.dstSubresource.mipLevel = 0;
10722 resolveRegion.dstSubresource.baseArrayLayer = 0;
10723 resolveRegion.dstSubresource.layerCount = 0;
10724 resolveRegion.dstOffset.x = 0;
10725 resolveRegion.dstOffset.y = 0;
10726 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010727 resolveRegion.extent.width = 1;
10728 resolveRegion.extent.height = 1;
10729 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070010730 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10731 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060010732 EndCommandBuffer();
10733
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010734 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060010735
Chia-I Wuf7458c52015-10-26 21:10:41 +080010736 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010737 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010738 vkFreeMemory(m_device->device(), srcMem, NULL);
10739 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010740}
10741
Karl Schultz6addd812016-02-02 17:17:23 -070010742TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
10743 VkResult err;
10744 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060010745
Karl Schultz6addd812016-02-02 17:17:23 -070010746 m_errorMonitor->SetDesiredFailureMsg(
10747 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010748 "vkCmdResolveImage called with unmatched source and dest image types.");
10749
Mike Stroyana3082432015-09-25 13:39:21 -060010750 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060010751
10752 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070010753 VkImage srcImage;
10754 VkImage dstImage;
10755 VkDeviceMemory srcMem;
10756 VkDeviceMemory destMem;
10757 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060010758
10759 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010760 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10761 image_create_info.pNext = NULL;
10762 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10763 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
10764 image_create_info.extent.width = 32;
10765 image_create_info.extent.height = 1;
10766 image_create_info.extent.depth = 1;
10767 image_create_info.mipLevels = 1;
10768 image_create_info.arrayLayers = 1;
10769 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
10770 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10771 // Note: Some implementations expect color attachment usage for any
10772 // multisample surface
10773 image_create_info.usage =
10774 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10775 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010776
Karl Schultz6addd812016-02-02 17:17:23 -070010777 err =
10778 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010779 ASSERT_VK_SUCCESS(err);
10780
Karl Schultz6addd812016-02-02 17:17:23 -070010781 image_create_info.imageType = VK_IMAGE_TYPE_1D;
10782 // Note: Some implementations expect color attachment usage for any
10783 // multisample surface
10784 image_create_info.usage =
10785 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10786 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010787
Karl Schultz6addd812016-02-02 17:17:23 -070010788 err =
10789 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060010790 ASSERT_VK_SUCCESS(err);
10791
10792 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010793 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010794 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10795 memAlloc.pNext = NULL;
10796 memAlloc.allocationSize = 0;
10797 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010798
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060010799 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010800 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010801 pass =
10802 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010803 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010804 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010805 ASSERT_VK_SUCCESS(err);
10806
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010807 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060010808 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070010809 pass =
10810 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060010811 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010812 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060010813 ASSERT_VK_SUCCESS(err);
10814
10815 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
10816 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010817 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060010818 ASSERT_VK_SUCCESS(err);
10819
10820 BeginCommandBuffer();
10821 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070010822 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
10823 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060010824 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010825 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060010826 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060010827 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010828 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010829 resolveRegion.srcOffset.x = 0;
10830 resolveRegion.srcOffset.y = 0;
10831 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080010832 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010833 resolveRegion.dstSubresource.mipLevel = 0;
10834 resolveRegion.dstSubresource.baseArrayLayer = 0;
10835 resolveRegion.dstSubresource.layerCount = 0;
10836 resolveRegion.dstOffset.x = 0;
10837 resolveRegion.dstOffset.y = 0;
10838 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060010839 resolveRegion.extent.width = 1;
10840 resolveRegion.extent.height = 1;
10841 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070010842 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
10843 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060010844 EndCommandBuffer();
10845
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010846 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060010847
Chia-I Wuf7458c52015-10-26 21:10:41 +080010848 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010849 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010850 vkFreeMemory(m_device->device(), srcMem, NULL);
10851 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060010852}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010853
Karl Schultz6addd812016-02-02 17:17:23 -070010854TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010855 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070010856 // to using a DS format, then cause it to hit error due to COLOR_BIT not
10857 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010858 // The image format check comes 2nd in validation so we trigger it first,
10859 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070010860 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010861
Karl Schultz6addd812016-02-02 17:17:23 -070010862 m_errorMonitor->SetDesiredFailureMsg(
10863 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010864 "Combination depth/stencil image formats can have only the ");
10865
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010866 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010867
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010868 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010869 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
10870 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010871
10872 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010873 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10874 ds_pool_ci.pNext = NULL;
10875 ds_pool_ci.maxSets = 1;
10876 ds_pool_ci.poolSizeCount = 1;
10877 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010878
10879 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010880 err =
10881 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010882 ASSERT_VK_SUCCESS(err);
10883
10884 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010885 dsl_binding.binding = 0;
10886 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
10887 dsl_binding.descriptorCount = 1;
10888 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10889 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010890
10891 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010892 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10893 ds_layout_ci.pNext = NULL;
10894 ds_layout_ci.bindingCount = 1;
10895 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010896 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010897 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10898 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010899 ASSERT_VK_SUCCESS(err);
10900
10901 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010902 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010903 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010904 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010905 alloc_info.descriptorPool = ds_pool;
10906 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010907 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10908 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010909 ASSERT_VK_SUCCESS(err);
10910
Karl Schultz6addd812016-02-02 17:17:23 -070010911 VkImage image_bad;
10912 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010913 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -070010914 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010915 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070010916 const int32_t tex_width = 32;
10917 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010918
10919 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010920 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10921 image_create_info.pNext = NULL;
10922 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10923 image_create_info.format = tex_format_bad;
10924 image_create_info.extent.width = tex_width;
10925 image_create_info.extent.height = tex_height;
10926 image_create_info.extent.depth = 1;
10927 image_create_info.mipLevels = 1;
10928 image_create_info.arrayLayers = 1;
10929 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10930 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10931 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
10932 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
10933 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010934
Karl Schultz6addd812016-02-02 17:17:23 -070010935 err =
10936 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010937 ASSERT_VK_SUCCESS(err);
10938 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070010939 image_create_info.usage =
10940 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10941 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
10942 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010943 ASSERT_VK_SUCCESS(err);
10944
10945 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010946 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10947 image_view_create_info.image = image_bad;
10948 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
10949 image_view_create_info.format = tex_format_bad;
10950 image_view_create_info.subresourceRange.baseArrayLayer = 0;
10951 image_view_create_info.subresourceRange.baseMipLevel = 0;
10952 image_view_create_info.subresourceRange.layerCount = 1;
10953 image_view_create_info.subresourceRange.levelCount = 1;
10954 image_view_create_info.subresourceRange.aspectMask =
10955 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010956
10957 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070010958 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
10959 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010960
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010961 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010962
Chia-I Wuf7458c52015-10-26 21:10:41 +080010963 vkDestroyImage(m_device->device(), image_bad, NULL);
10964 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080010965 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10966 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010967}
Tobin Ehliscde08892015-09-22 10:11:37 -060010968#endif // IMAGE_TESTS
10969
Tony Barbour300a6082015-04-07 13:44:53 -060010970int main(int argc, char **argv) {
10971 int result;
10972
Cody Northrop8e54a402016-03-08 22:25:52 -070010973#ifdef ANDROID
10974 int vulkanSupport = InitVulkan();
10975 if (vulkanSupport == 0)
10976 return 1;
10977#endif
10978
Tony Barbour300a6082015-04-07 13:44:53 -060010979 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060010980 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060010981
10982 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
10983
10984 result = RUN_ALL_TESTS();
10985
Tony Barbour6918cd52015-04-09 12:58:51 -060010986 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060010987 return result;
10988}